<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7065255949366990244</id><updated>2026-05-31T02:32:46.661+08:00</updated><category term="Oracle DB"/><category term="Android"/><category term="軟體使用心得"/><category term="Linux"/><category term="Eclipse"/><category term="Oracle ERP 專案與客制化"/><category term="Java 技術分享"/><category term="部落格心得"/><category term="網站使用心得"/><category term="PowerDesigner"/><category term="手機與PDA"/><category term="Sybase"/><category term="Oracle ERP Form"/><category term="Oracle ERP 問題處理"/><category term="其他自由軟體"/><category term="佑遊記"/><category term="Windows"/><category term="Hyperion"/><category term="Oracle ERP Alert"/><category term="Oracle ERP SQL 語法"/><category term="Firefox"/><category term="PHP"/><category term="Oracle DBA"/><category term="Oracle ERP Flexfield"/><category term="Oracle ERP Workflow"/><category term="Web 問題處理"/><category term="Thunderbird"/><category term="openoffice"/><category term="JSP 問題處理"/><category term="3D"/><category term="Data Integration"/><category term="Google Cardboard"/><category term="Kettle ETL"/><category term="MS Office"/><category term="Oracle ERP Information"/><category term="Pentaho"/><category term="VR"/><category term="Java 專案"/><category term="My Oracle DB Package"/><category term="Oracle Information"/><category term="python"/><category term="Oracle ERP Interface"/><category term="應用資訊"/><category term="Java 外掛元件"/><category term="tomcat"/><category term="zk"/><category term="Android Wear"/><category term="HFM"/><category term="Java Script"/><category term="SVN"/><category term="Web Analysis"/><category term="AI"/><category term="Game Engine"/><category term="Google Glass"/><category term="Keras"/><category term="Node.js"/><category term="Smart View"/><category term="TensorFlow"/><category term="jQuery"/><category term="Apache"/><category term="MySQL"/><category term="Oracle BI"/><category term="Oracle ERP Report"/><category term="Oracle ERP System Profile"/><category term="我的 AI"/><category term="EPMA"/><category term="Oracle ERP SSWA"/><category term="resteasy"/><category term="restful"/><category term="Anaconda"/><category term="Flash"/><category term="HTML5"/><category term="JSON"/><category term="Moto360"/><category term="Oracle Data Modeler"/><category term="Oracle ERP Package 套件"/><category term="Smart Watch"/><category term="css"/><title type='text'>昭佑.天翔</title><subtitle type='html'>介紹 Oracle Database / Oracle ERP / Oracle Workflow / Android / Java / Ubuntu Linux 的 Blog 網站</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tomkuo139.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://tomkuo139.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>昭佑天翔</name><uri>http://www.blogger.com/profile/11034567866105362217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>965</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7065255949366990244.post-6937363552740162586</id><published>2018-05-07T08:10:00.001+08:00</published><updated>2018-05-14T16:00:47.200+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="Keras"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="TensorFlow"/><category scheme="http://www.blogger.com/atom/ns#" term="我的 AI"/><title type='text'>我的第三個 AI：利用「CNN 卷積神經網路」針對「Cifar10」資料集，訓練「辨識物體圖片」</title><content type='html'>在研究 AI 課題上,&lt;br&gt;
&lt;br&gt;
會從最多學習資源, 且簡單易學, 又支援多種程式語言, 所以選擇 Google TensorFlow,&lt;br&gt;
&lt;br&gt;
而 Keras 又是基於 TensorFlow, 提供更高階 API, 相對於 TensorFlow 更易學習,&lt;br&gt;
&lt;br&gt;
且 Keras 本身也內建提供了 AI 訓練資料集 (&lt;a href=&quot;https://keras.io/datasets/&quot; target=&quot;_blank&quot;&gt;英文官網&lt;/a&gt;、&lt;a href=&quot;https://keras.io/zh/datasets/&quot; target=&quot;_blank&quot;&gt;中文官網&lt;/a&gt;),&lt;br&gt;
&lt;br&gt;
節省了 AI 初學者準備大量資料的時間,&lt;br&gt;
&lt;br&gt;
而這次是利用 Cifar10 物體圖片集,&lt;br&gt;
&lt;br&gt;
也就是要讓 AI 辨識圖片是什麼物體, 範例如下 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOdP8bqd_6TIzWn168ZxV8q8MA9-wG0B2Mvg7TeIdW9vxYcFkYuiuMHdJ6axGpE6eEHOMzOislRdfaLhPux0TYDV0r5gQmasshzwcYu074OW4-JC-6J_NAlwhH28oha3ov_M8dZSKe8UAX/s1600/001.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOdP8bqd_6TIzWn168ZxV8q8MA9-wG0B2Mvg7TeIdW9vxYcFkYuiuMHdJ6axGpE6eEHOMzOislRdfaLhPux0TYDV0r5gQmasshzwcYu074OW4-JC-6J_NAlwhH28oha3ov_M8dZSKe8UAX/s1600/001.png&quot; data-original-width=&quot;576&quot; data-original-height=&quot;210&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
至於「AI 與機器學習」的觀念, 可以參考 Google 釋出的內部培訓教材 : &lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;https://developers.google.com/machine-learning/crash-course/&quot; target=&quot;_blank&quot;&gt;點選此處&lt;/a&gt;: 《Google 內部培訓教材》Machine Learning Crash Course 機器學習速成課程（影片可選擇顯示中文字幕）.&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;https://ai.google/education/&quot; target=&quot;_blank&quot;&gt;點選此處&lt;/a&gt;: 《Google 內部培訓教材》Learn with Google AI（影片可選擇顯示字幕；若無中文字幕，也可選擇自動翻譯字幕）.&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;https://tomkuo139.blogspot.tw/2017/11/sololearn-app-python.html&quot; target=&quot;_blank&quot;&gt;點選此處&lt;/a&gt;: TensorFlow 支援 Python 最完整, 且 Python 易學、應用廣泛, 建議學習.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
那就開始用「CNN 卷積神經網路」來辨識「Cifar10 物體圖片集」, 其參考步驟, 如下 :&lt;br&gt;
&lt;br&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;a href=&quot;https://tomkuo139.blogspot.com/2018/03/anaconda-tensorflow-keras.html&quot; target=&quot;_blank&quot;&gt;點選此處&lt;/a&gt;: 參考我這篇文章【安裝 Google TensorFlow 與 Keras 環境】.&lt;br&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;1）透過 Keras 下載 Cifar10 資料集&lt;/div&gt;&lt;pre&gt;
from keras.datasets import cifar10

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 第一次執行 load_data() 會從網路下載 Cifar10 資料集
# load_data() 會分析 Cifar10 資料集, 且回傳 &quot;二維 Tuple 元組&quot;
####################&lt;/span&gt;
((&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_feature&lt;/span&gt;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_label&lt;/span&gt;), (&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature&lt;/span&gt;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label&lt;/span&gt;)) = cifar10.load_data()
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrfs1CQfDtSxNQQ_pEvXjaQa3mkiZjUPx5pf72od5zIKzd8n_ZotsUmqFekGkxpIfLTs0czdg06-9W70Xfb9qde8BgWpLSehWl5-Xb7hy0ade-o0iJeNSorfFkO-c33V3q20HkK0Zwn74J/s1600/002.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrfs1CQfDtSxNQQ_pEvXjaQa3mkiZjUPx5pf72od5zIKzd8n_ZotsUmqFekGkxpIfLTs0czdg06-9W70Xfb9qde8BgWpLSehWl5-Xb7hy0ade-o0iJeNSorfFkO-c33V3q20HkK0Zwn74J/s1600/002.png&quot; data-original-width=&quot;671&quot; data-original-height=&quot;47&quot; /&gt;&lt;/a&gt;

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 查看 train 與 test 的資料描述
####################&lt;/span&gt;
print( &#39;train feature datas =&#39;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_feature&lt;/span&gt;.shape )
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出結果: train feature datas = (50000, 32, 32, 3)
# 四維陣列, 第一維陣列長度 50000, 第二維陣列長度 32, 第三維陣列長度 32, 第四維陣列長度 3
# 說明: 訓練用的圖片資料有 50000 筆, 每筆長寬為 32x32 且為 RGB 三原色的彩色圖片&lt;/span&gt;

print( &#39;test feature datas =&#39;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature&lt;/span&gt;.shape )
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出結果: test feature datas = (10000, 32, 32, 3)
# 四維陣列, 第一維陣列長度 10000, 第二維陣列長度 32, 第三維陣列長度 32, 第四維陣列長度 3
# 說明: 測試用的圖片資料有 10000 筆, 每筆長寬為 32x32 且為 RGB 三原色的彩色圖片&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;2）將 Cifar10 訓練資料的二維圖片，收斂顏色數值&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# Cifar10 提供的圖片格式為 32 x 32 x 3 (3 表示 RGB 三原色)
# CNN 輸入層的每筆 Data 都是三維陣列
# 且 Train Feature 所有圖片, 每個本身就是三維陣列, 不用進行轉換
# RGB 顏色數值為 0~255, 除以 255, 讓顏色數值收斂到 0~1, 會讓後續訓練模型時, 可以提高準確率
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_feature_vector&lt;/span&gt; = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_feature&lt;/span&gt; / 255

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 查看 feature vector 集合&lt;/span&gt;
print( &#39;train feature vector datas =&#39;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_feature_vector&lt;/span&gt;.shape )
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出結果:&lt;/span&gt;
train feature vector datas = (50000, 32, 32, 3)
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;3）將 Cifar10 訓練資料的真實數值，轉換為 One-Hot Encoding&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# CNN 輸出層的每筆 Data 都是一維陣列
# 所以, 需將 Train Label 資料轉換為 One-Hot Encoding, 也就是
# 1 轉換為 [0, &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;1&lt;/span&gt;, 0, 0, 0, 0, 0, 0, 0, 0]
# 5 轉換為 [0, 0, 0, 0, 0, &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;1&lt;/span&gt;, 0, 0, 0, 0]
# 9 轉換為 [0, 0, 0, 0, 0, 0, 0, 0, 0, &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;1&lt;/span&gt;]
####################&lt;/span&gt;
from keras.utils import np_utils

&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_label_onehot&lt;/span&gt; = np_utils.to_categorical(&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_label&lt;/span&gt;)
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;4）建立 Convolutional Neural Network（CNN 卷積神經網路） Model 模型&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 載入所需的相關套件
####################&lt;/span&gt;
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 建立 Sequential 順序模組
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;model&lt;/span&gt; = Sequential()

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 模型加入【輸入層】與【第一層卷積層】
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;model&lt;/span&gt;.add( Conv2D( input_shape = (&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;32, 32, 3&lt;/span&gt;)     &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸入層為 (32, 32, 3) 的三維陣列&lt;/span&gt;
                 , filters = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;8&lt;/span&gt;                   &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 產生 8 個類似濾鏡效果的卷積圖片&lt;/span&gt;
                                                 &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# (值越大, 卷積圖片越多, 訓練越精準, 相對訓練時間也越久)&lt;/span&gt;
                 , kernel_size = (&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;5, 5&lt;/span&gt;)          &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 卷積圖片採用 5x5 filter weight 進行卷積運算&lt;/span&gt;
                 , padding = &#39;&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;same&lt;/span&gt;&#39;              &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 卷積圖片大小與原始圖片一樣, 也就是 32x32&lt;/span&gt;
                 , activation = &#39;&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;relu&lt;/span&gt;&#39;           &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 使用 relu 激活函數&lt;/span&gt;
                 )
         )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 模型加入【第一層池化層】
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;model&lt;/span&gt;.add( MaxPooling2D( pool_size = (2, 2) ) )    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 以 2x2 進行縮減取樣&lt;/span&gt;
                                                   &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# (卷積圖片若為 32x32, 則縮減取樣後的圖片為 16x16)&lt;/span&gt;

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 模型加入【平坦層】
# 接下來的 layer 屬於【MLP 多層感知】，所以，需透過【平坦層】將多維度陣列轉換為一維陣列
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;model&lt;/span&gt;.add( Flatten() )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 模型加入【隱藏層】
# 「隱藏層」可以有多層, 可比喻為「AI 人數」
# 「units 神經元」可比喻為「AI 智力」
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;model&lt;/span&gt;.add( Dense( units = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;256&lt;/span&gt;                   &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 隱藏層有 256 個神經元 (值越大, 訓練越精準, 相對訓練時間也越久)&lt;/span&gt;
                , kernel_initializer = &#39;&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;normal&lt;/span&gt;&#39; &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 使用 normal 初始化 weight 權重與 bias 偏差值&lt;/span&gt;
                , activation = &#39;&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;relu&lt;/span&gt;&#39;           &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 使用 relu 激活函數&lt;/span&gt;
                )
         )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 模型加入【輸出層】
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;model&lt;/span&gt;.add( Dense( units = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;10&lt;/span&gt;                    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出層有 10 個神經元 (因為數字只有 0 ~ 9)&lt;/span&gt;
                , kernel_initializer = &#39;&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;normal&lt;/span&gt;&#39; &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 使用 normal 初始化 weight 權重與 bias 偏差值&lt;/span&gt;
                , activation = &#39;&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;softmax&lt;/span&gt;&#39;        &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 使用 softmax 激活函數 (softmax 值越高, 代表機率越大)&lt;/span&gt;
                )
         )
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;5）Model 模型進行【Train 訓練】&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 設定模型的訓練方式
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;model&lt;/span&gt;.compile( loss=&#39;&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;categorical_crossentropy&lt;/span&gt;&#39; &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定 Loss 損失函數 為 categorical_crossentropy&lt;/span&gt;
             , optimizer = &#39;&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;adam&lt;/span&gt;&#39;              &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定 Optimizer 最佳化方法 為 adam&lt;/span&gt;
             , metrics = [&#39;&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;accuracy&lt;/span&gt;&#39;]          &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定 Model 評估準確率方法 為 accuracy&lt;/span&gt;
             )


&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 開始訓練
# CNN 輸入層的每筆 Data 都是三維陣列, 這就是為何 x 輸入 train_feature 或 train_feature_vector 皆可
# CNN 輸出層的每筆 Data 都是一維陣列, 這就是為何 y 輸入 train_label_onehot, 而非 train_label
# &lt;font color=&quot;#FF0000&quot;&gt;(若準確率不高, 改善 1: 可再執行這個函數, 進行重覆訓練)&lt;/font&gt;
# &lt;font color=&quot;#FF0000&quot;&gt;(若準確率不高, 改善 2: 重新建立 Model, 且增加 卷積層 filter 數, 重新進行訓練)&lt;/font&gt;
# &lt;font color=&quot;#FF0000&quot;&gt;(若準確率不高, 改善 3: 重新建立 Model, 且增加 隱藏層 units 神經元數, 重新進行訓練)&lt;/font&gt;
# &lt;font color=&quot;#FF0000&quot;&gt;(若準確率不高, 改善 4: 重新建立 Model, 且增加 隱藏層 layer, 重新進行訓練)&lt;/font&gt;
# &lt;font color=&quot;#FF0000&quot;&gt;(若準確率不高, 改善 5: 重新建立 Model, 且更換訓練方式（神經網路）, 重新進行訓練)&lt;/font&gt;
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;history&lt;/span&gt; = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;model&lt;/span&gt;.fit(               &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 訓練的歷史記錄, 會會回傳到指定變數 history&lt;/span&gt;
          x = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_feature_vector&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定 圖片 Features 特徵值 (cifar10 提供 50000 筆資料)&lt;/span&gt;
        , y = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_label_onehot&lt;/span&gt;   &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定 圖片 Label    真實值 (cifar10 提供 50000 筆資料)&lt;/span&gt;
        , validation_split = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;0.2&lt;/span&gt;   &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定 有多少筆驗證         (50000*0.2=10000 筆驗證, 50000*0.8=40000 筆訓練)&lt;/span&gt;
        , epochs = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;30&lt;/span&gt;              &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定 訓練次數             (值 10 以上,  值越大, 訓練時間越久, 但訓練越精準)&lt;/span&gt;
        , batch_size = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;1000&lt;/span&gt;        &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定 訓練時每批次有多少筆 (值 100 以上, 值越大, 訓練速度越快, 但需記憶體要夠大)&lt;/span&gt;
        , verbose = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;2&lt;/span&gt;              &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 是否 顯示訓練過程         (0: 不顯示, 1: 詳細顯示, 2: 簡易顯示)&lt;/span&gt;
)

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 執行的顯示結果 (這會花一些時間, 然後會逐次顯示訓練結果)
# &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;loss&lt;/span&gt;:     使用訓練資料, 得到的損失函數誤差值 (值越小, 代表準確率越高)
# &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;acc&lt;/span&gt;:      使用訓練資料, 得到的評估準確率     (值在 0~1, 值越大, 代表準確率越高)
# &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;val_loss&lt;/span&gt;: 使用驗證資料, 得到的損失函數誤差值 (值越小, 代表準確率越高)
# &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;val_acc&lt;/span&gt;:  使用驗證資料, 得到的評估準確率     (值在 0~1, 值越大, 代表準確率越高)

# 這是 epochs=30, batch_size=1000, verbose=2 顯示【簡易結果】&lt;/span&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3jQoAZ668_XeRO6-YXteAYV_KJdsuTJFkTBx_hEx7YU9LwjmpqlRze_LYjDfUrUrsrOKlh4_lqvet38jm-FTdvvfmNAVEqJPbuZ6i6bmJLDy-V7LGr3Io9N9Si2t9semCw-iuuAPKLrw4/s1600/cnn_003.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3jQoAZ668_XeRO6-YXteAYV_KJdsuTJFkTBx_hEx7YU9LwjmpqlRze_LYjDfUrUrsrOKlh4_lqvet38jm-FTdvvfmNAVEqJPbuZ6i6bmJLDy-V7LGr3Io9N9Si2t9semCw-iuuAPKLrw4/s1600/cnn_003.png&quot; data-original-width=&quot;630&quot; data-original-height=&quot;193&quot; /&gt;&lt;/a&gt;
...
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidkggIeqMbpbDIA2sp7MrQx2OudP2rW0T2ofc9icl4_dYN0dZYFMXnzZph8C6ftRX1TuEZThx8VB1MDEx-d0MCEMnjBcwSzeTrCnWJQj_U1YZnf2LMx8usF73-wWuLBmvLT1TZtRfN8oLG/s1600/cnn_004.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidkggIeqMbpbDIA2sp7MrQx2OudP2rW0T2ofc9icl4_dYN0dZYFMXnzZph8C6ftRX1TuEZThx8VB1MDEx-d0MCEMnjBcwSzeTrCnWJQj_U1YZnf2LMx8usF73-wWuLBmvLT1TZtRfN8oLG/s1600/cnn_004.png&quot; data-original-width=&quot;630&quot; data-original-height=&quot;177&quot; /&gt;&lt;/a&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;6）顯示 Train History 訓練歷史記錄的準確率圖表&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 定義函數, 用來顯示訓練歷史記錄的圖表
####################&lt;/span&gt;
import matplotlib.pyplot as plot  # plot 可以視為畫布

def &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_history_graphic&lt;/span&gt;( history       &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 資料集合&lt;/span&gt;
                         , history_key1  &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 資料集合裡面的來源 1 (有 loss, acc, val_loss, val_acc 四種)&lt;/span&gt;
                         , history_key2  &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 資料集合裡面的來源 2 (有 loss, acc, val_loss, val_acc 四種)&lt;/span&gt;
                         , y_label       &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# Y 軸標籤文字&lt;/span&gt;
                         ) :
    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 資料來源 1&lt;/span&gt;
    plot.plot( history.history[history_key1] )

    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 資料來源 2&lt;/span&gt;
    plot.plot( history.history[history_key2] )

    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 標題&lt;/span&gt;
    plot.title( &#39;train history&#39; )

    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# X 軸標籤文字&lt;/span&gt;
    plot.xlabel( &#39;epochs&#39; )

    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# Y 軸標籤文字&lt;/span&gt;
    plot.ylabel( y_label )

    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定圖例
    # (參數 1 為圖例說明, 有幾個資料來源, 就對應幾個圖例說明)
    # (參數 2 為圖例位置, upper 為上面, lower 為下面, left 為左邊, right 為右邊)&lt;/span&gt;
    plot.legend( [&#39;train&#39;, &#39;validate&#39;]
               , loc = &#39;upper left&#39;
               )

    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 顯示畫布&lt;/span&gt;
    plot.show()

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 顯示 train history 準確率圖表
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_history_graphic&lt;/span&gt;( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;history&lt;/span&gt;, &#39;acc&#39;, &#39;val_acc&#39;, &#39;accuracy&#39; )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出結果 (可以得知, 隨著訓練次數的增加, 準確率也越來越高) :&lt;/span&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGazHzuWgYs8yhexrfVIWnUu8-r8i-yc4-pzpB1G51yJzVmLP5Rel0cK0s0lVIQ0Ev3cHbdCe8NeN_DRYWww-KRKF-x9q_ma6BPK0ne7Xgg8KAHv5Usbag9d-P_p7fhIyhIwLvcSwRhf_2/s1600/cnn_005.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGazHzuWgYs8yhexrfVIWnUu8-r8i-yc4-pzpB1G51yJzVmLP5Rel0cK0s0lVIQ0Ev3cHbdCe8NeN_DRYWww-KRKF-x9q_ma6BPK0ne7Xgg8KAHv5Usbag9d-P_p7fhIyhIwLvcSwRhf_2/s1600/cnn_005.png&quot; data-original-width=&quot;389&quot; data-original-height=&quot;278&quot; /&gt;&lt;/a&gt;

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 顯示 train history 損失函數誤差值圖表
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_history_graphic&lt;/span&gt;( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;history&lt;/span&gt;, &#39;loss&#39;, &#39;val_loss&#39;, &#39;loss&#39; )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出結果 (可以得知, 隨著訓練次數的增加, 誤差值率也越來越低) :&lt;/span&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaDqjwnW4O-SnVU0CZZcwgKpF39U8NwAPHzYzQAxtse9VFVk4oMbcCpXMXYUPf7yGoWbyQDcsMnDdo_EMktCwVOOHl6GVnV0YZ-5JI4f8lh0Y7L7rp7yNFjKyhGqqBM7MgpGWUBS7D0HVJ/s1600/cnn_006.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaDqjwnW4O-SnVU0CZZcwgKpF39U8NwAPHzYzQAxtse9VFVk4oMbcCpXMXYUPf7yGoWbyQDcsMnDdo_EMktCwVOOHl6GVnV0YZ-5JI4f8lh0Y7L7rp7yNFjKyhGqqBM7MgpGWUBS7D0HVJ/s1600/cnn_006.png&quot; data-original-width=&quot;389&quot; data-original-height=&quot;278&quot; /&gt;&lt;/a&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;7）用【訓練好的 Model】拿【Cifar10 測試資料】來評估【Model 準確率】&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# CNN 輸入層的每筆 Data 都是三維陣列
# 且 Test Feature 所有圖片, 每個本身就是三維陣列, 不用進行轉換
# RGB 顏色數值為 0~255, 除以 255, 讓顏色數值收斂到 0~1, 會讓後續模型預測時, 可以提高準確率
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature_vector&lt;/span&gt; = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature&lt;/span&gt; / 255

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# CNN 輸出層的每筆 Data 都是一維陣列
# 所以, 需將 Test Label 資料轉換為 One-Hot Encoding
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label_onehot&lt;/span&gt; = np_utils.to_categorical(&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label&lt;/span&gt;)

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 使用測試資料評估 Model 的【損失函數誤差值】與【準確率】
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;eval&lt;/span&gt; = model.evaluate( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature_vector&lt;/span&gt;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label_onehot&lt;/span&gt; )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 顯示 Model 評估測試資料的【損失函數誤差值】與【準確率】&lt;/span&gt;
print( &#39;loss =&#39;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;eval&lt;/span&gt;[0] )
print( &#39;accuracy =&#39;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;eval&lt;/span&gt;[1] )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出結果 (0.6044 準確率表示 10000 筆資料, 會對 6044 筆, 會錯 3956 筆) :
loss = 1.1440551203727722
accuracy = 0.6044  &lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;# 在相同的神經元數量, 比之前用「MLP 多層感知」得到的 0.4905 準確率高出許多&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;8）用【訓練好的 Model】拿【Cifar10 測試資料】進行【辨識物體圖片】&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 用【訓練好的 Model】進行【辨識物體圖片】
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;prediction&lt;/span&gt; = model.predict_classes( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature&lt;/span&gt; )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 顯示圖片集全部的預測結果
# 顯示圖片集第 340 ~ 360 筆的預測結果
####################&lt;/span&gt;
print( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;prediction&lt;/span&gt; )
print( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;prediction&lt;/span&gt;[340:360] )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出結果 :
[3 8 0 ... 5 1 7]
[4 6 2 7 8 5 7 6 8 9 9 1 8 2 2 4 2 2 1 0]&lt;/span&gt;

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 將 Prediction 數值轉換成 Prediction 說明文字
####################&lt;/span&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# Label 數值對應的說明文字&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;label_desc&lt;/span&gt; = [ &#39;airplane&#39;, &#39;automobile&#39;, &#39;bird&#39;, &#39;cat&#39;, &#39;deer&#39;, &#39;dog&#39;, &#39;frog&#39;, &#39;horse&#39;, &#39;ship&#39;, &#39;truck&#39; ]

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# Prediction 數值轉換成 Prediction 說明文字&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;prediction_desc&lt;/span&gt; = list( map( lambda x : &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;label_desc&lt;/span&gt;[x], &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;prediction&lt;/span&gt; ) )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 顯示圖片集第 340 ~ 360 筆的預測結果&lt;/span&gt;
print( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;prediction_desc&lt;/span&gt;[340:360] )
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出結果 :
[&#39;deer&#39;, &#39;frog&#39;, &#39;bird&#39;, &#39;horse&#39;, &#39;ship&#39;, &#39;bird&#39;, &#39;horse&#39;, &#39;frog&#39;, &#39;ship&#39;, &#39;truck&#39;, &#39;truck&#39;, &#39;automobile&#39;, &#39;ship&#39;, &#39;bird&#39;, &#39;bird&#39;, &#39;deer&#39;, &#39;bird&#39;, &#39;deer&#39;, &#39;automobile&#39;, &#39;ship&#39;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;9）預測結束後, 接下來試著找出預測錯誤的資料&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 透過 DataFrame 對照表清單, 來顯示 Label 真實數值, 與 AI 預設結果
####################&lt;/span&gt;
import pandas as pd

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# Pandas.DataFrame 的資料集需要一維陣列, 而 test_label 本身是二維陣列, 需透過 reshape 轉換為一維陣列&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label_onearr&lt;/span&gt; = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label&lt;/span&gt;.reshape(len(&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label&lt;/span&gt;))

&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;checkList&lt;/span&gt; = pd.DataFrame( {&#39;label&#39;:&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label_onearr&lt;/span&gt;       &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# Column1 名稱: 欄位值集合 (這裡提供 Label 真實數值)&lt;/span&gt;
                          ,&#39;prediction&#39;:&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;prediction&lt;/span&gt;  &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# Column2 名稱: 欄位值集合 (這裡提供 AI 預測結果)&lt;/span&gt;
                          }
                        )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 顯示對照表前 10 筆結果&lt;/span&gt;
print( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;checkList&lt;/span&gt;[0:10] )
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhKfX5tGrVVXcirE-eYA7CiVJKU979PLCnP9FfzD-aBMAI18z4rdlr2bclQMaJSjXHTIoth_cnW9Xt4gI_BkriiShljZQfLnx0xRZKl-oAQF2Pgt5lFQno_5b_nnk7McFfJ6uiQpzorWrx/s1600/cnn_007.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhKfX5tGrVVXcirE-eYA7CiVJKU979PLCnP9FfzD-aBMAI18z4rdlr2bclQMaJSjXHTIoth_cnW9Xt4gI_BkriiShljZQfLnx0xRZKl-oAQF2Pgt5lFQno_5b_nnk7McFfJ6uiQpzorWrx/s1600/cnn_007.png&quot; data-original-width=&quot;300&quot; data-original-height=&quot;197&quot; /&gt;&lt;/a&gt;

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 列出對照表中, prediction 欄位值 不等於 label 欄位值的資料
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;checkList&lt;/span&gt;[ &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;checkList&lt;/span&gt;.prediction != &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;checkList&lt;/span&gt;.label ]
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiahUOX0xR9xM7Zjj7ruZXjBKX7JJGv1kHRdO1c8rtvzRW6FPFAEr3brzB69r0m97AH5CAgqYyKcUOK9sDP2PXHIJlcymXymNaNdlWHh8UvLid2bLZk7Eisc82uqLNJhzSu_p1zpx-G-3j/s1600/cnn_008.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiahUOX0xR9xM7Zjj7ruZXjBKX7JJGv1kHRdO1c8rtvzRW6FPFAEr3brzB69r0m97AH5CAgqYyKcUOK9sDP2PXHIJlcymXymNaNdlWHh8UvLid2bLZk7Eisc82uqLNJhzSu_p1zpx-G-3j/s1600/cnn_008.png&quot; data-original-width=&quot;300&quot; data-original-height=&quot;190&quot; /&gt;&lt;/a&gt;
.....
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaQW4-V2cb5GxuGyoFST4F23bp53CK4kUWYZUVYQkPUmzkRt-fzs0qAkrkfNuB_kKUJMAfMu8nx_erfnwNm1Qn7ErjGtlc4tWnsSTv5wvnusLkuE32O_ysZ-pcSmHhuEZh6GB4L4Ge47sq/s1600/cnn_009.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaQW4-V2cb5GxuGyoFST4F23bp53CK4kUWYZUVYQkPUmzkRt-fzs0qAkrkfNuB_kKUJMAfMu8nx_erfnwNm1Qn7ErjGtlc4tWnsSTv5wvnusLkuE32O_ysZ-pcSmHhuEZh6GB4L4Ge47sq/s1600/cnn_009.png&quot; data-original-width=&quot;300&quot; data-original-height=&quot;168&quot; /&gt;&lt;/a&gt;

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 定義函數, 用來顯示 Cifar10 多筆影像, 真實數值, 與 AI 預設結果
####################&lt;/span&gt;
import matplotlib.pyplot as plot  &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# plot 可以視為畫布&lt;/span&gt;
import math

def &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;show_feature_label_prediction&lt;/span&gt;( features
                                 , labels
                                 , predictions
                                 , indexList  &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 資料集合中, 要顯示的索引陣列&lt;/span&gt;
                                 ) :
    # 要顯示的索引陣列長度
    num = len(indexList)

    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定畫布的寬（參數 1）與高（參數 2）&lt;/span&gt;
    plot.gcf().set_size_inches( 2*5, (2+0.4)*math.ceil(num/5) )

    loc = 0
    for i in indexList :

        &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 目前要在畫布上的哪個位置顯示 (從 1 開始)&lt;/span&gt;
        loc += 1

        &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 畫布區分為幾列（參數 1）, 幾欄（參數 2）, 目前在哪個位置（參數 3）&lt;/span&gt;
        subp = plot.subplot( math.ceil(num/5), 5, loc )

        &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 畫布上顯示圖案, 其中 cmap=binary 為顯示黑白圖案&lt;/span&gt;
        subp.imshow( features[i], cmap=&#39;binary&#39; )

        &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定標題內容
        # 有 AI 預測結果資料, 才在標題顯示預測結果&lt;/span&gt;
        if( len(predictions) &gt; 0 ) :
            title = &#39;ai = &#39; + label_desc[ predictions[i] ]
            title += (&#39; (o)&#39; if predictions[i]==labels[i] else &#39; (x)&#39;) &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 預測正確顯示(o), 錯誤顯示(x)&lt;/span&gt;
            title += &#39;\nlabel = &#39; + label_desc[ labels[i] ]
        &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 沒有 AI 預測結果資料, 則只在標題顯示真實數值&lt;/span&gt;
        else :
            title = &#39;label = &#39; + label_desc[ labels[i] ]

       &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 在畫布上顯示標題, 且字型大小為 12&lt;/span&gt;
        subp.set_title( title, fontsize=12 )

        &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# X, Y 軸不顯示刻度&lt;/span&gt;
        subp.set_xticks( [] )
        subp.set_yticks( [] )

    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 顯示畫布&lt;/span&gt;
    plot.show()

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 從測試資料集第 0 位置, 顯示 10 個資料的圖片, 真實數值, 與預測結果
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;show_feature_label_prediction&lt;/span&gt;( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature&lt;/span&gt;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label_onearr&lt;/span&gt;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;prediction&lt;/span&gt;, range(&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;10&lt;/span&gt;) )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出結果 :&lt;/span&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUqwoTn5le_vhUWgxS9dRK__-1KTSfRcUBhnSPVb-m4eLXx4qZr0Rt89L45ZN0e9KoV8TD0Y97JLie4ZrPcrtbBTnnKGTsBfYECGsVV31mNxF_Br_LGYoV8x115BJ6C66qEap4djnOrCJE/s1600/cnn_010.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUqwoTn5le_vhUWgxS9dRK__-1KTSfRcUBhnSPVb-m4eLXx4qZr0Rt89L45ZN0e9KoV8TD0Y97JLie4ZrPcrtbBTnnKGTsBfYECGsVV31mNxF_Br_LGYoV8x115BJ6C66qEap4djnOrCJE/s1600/cnn_010.png&quot; data-original-width=&quot;623&quot; data-original-height=&quot;288&quot; /&gt;&lt;/a&gt;

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 可以改版為顯示中文, 且預測錯誤顯示紅色字體 :&lt;/span&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX-XYx751XFPwFq0dol6mEsvDbMXMpnGdC7j7OOExs7CZF2YuvFaWwEnh8NzgTpHVA-9FuDTj0bvyGdgi_XgcfxevVcbm_1TWtlpp7KBc_sYLOjhId1nS5u1U0CZD1MmontT9PZqlnzrOw/s1600/cnn_10.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX-XYx751XFPwFq0dol6mEsvDbMXMpnGdC7j7OOExs7CZF2YuvFaWwEnh8NzgTpHVA-9FuDTj0bvyGdgi_XgcfxevVcbm_1TWtlpp7KBc_sYLOjhId1nS5u1U0CZD1MmontT9PZqlnzrOw/s1600/cnn_10.png&quot; data-original-width=&quot;581&quot; data-original-height=&quot;284&quot; /&gt;&lt;/a&gt;

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 之前評估 Model 準確率為 0.6044, 也就是 10000 筆資料, 會對 6044 筆, 會錯 3956 筆
# 將這些錯誤資料顯示出來, 看看是否為圖形太混亂不清楚, 從而了解 AI 為何會預測錯誤
# 另外, 可以藉由【&lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;提高訓練次數&lt;/span&gt;】或【&lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;增加卷積層的 filter 數&lt;/span&gt;】或【&lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;增加隱藏層的神經元數&lt;/span&gt;】
#       或【&lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;增加隱藏層&lt;/span&gt;】或【&lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;改變神經網路方式&lt;/span&gt;】, 來提升 AI 準確率
####################
# 顯示預測錯誤的前 20 筆資料&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;show_feature_label_prediction&lt;/span&gt;( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature&lt;/span&gt;
                             , &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label_onearr&lt;/span&gt;
                             , &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;prediction&lt;/span&gt;
                             , &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;checkList&lt;/span&gt;.index[&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;checkList&lt;/span&gt;.prediction != &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;checkList&lt;/span&gt;.label][0:20]
                             )
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTOpoHOCQw3hHVDjzPUPLjxPFz9WVtVXdsGc0PStTxt7h9jQFx63vInIZt1aSnylrkf8o_5UUbYY3tFUNjKQwd4wvWxMHPPN5y32nCGi_FcFcAUUCSR319XER1S_gMuNZGrQMH7lObtvDx/s1600/cnn_011.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTOpoHOCQw3hHVDjzPUPLjxPFz9WVtVXdsGc0PStTxt7h9jQFx63vInIZt1aSnylrkf8o_5UUbYY3tFUNjKQwd4wvWxMHPPN5y32nCGi_FcFcAUUCSR319XER1S_gMuNZGrQMH7lObtvDx/s1600/cnn_011.png&quot; data-original-width=&quot;595&quot; data-original-height=&quot;543&quot; /&gt;&lt;/a&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;10）將訓練好的 Model 模型儲存起來, 在日後可以直接載入使用, 而不用再重新訓練&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 將 Model 模型儲存成 HDF5 檔案, 路徑名稱為 D 槽下的 my_cifar10_cnn_model.h5
# 檔案命名規則: 資料集名稱_神經網路名稱_model.h5
####################&lt;/span&gt;
model.save(&#39;d:/my_cifar10_cnn_model.h5&#39;)

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 從 D 槽下的 my_cifar10_cnn_model.h5 檔案, 載入 Model 模型
####################&lt;/span&gt;
from keras.models import load_model

model = load_model(&#39;d:/my_cifar10_cnn_model.h5&#39;)
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
以上, 參考看看囉, 如有任何問題, 也歡迎一同一起研究 ^ ^
&lt;br&gt;
&lt;div class=&quot;hiddenCopyRight&quot;&gt;&lt;a href=&quot;https://tomkuo139.blogspot.com&quot;&gt;昭佑.天翔&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/6937363552740162586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/6937363552740162586'/><link rel='alternate' type='text/html' href='http://tomkuo139.blogspot.com/2018/05/aicnn-cifar10.html' title='我的第三個 AI：利用「CNN 卷積神經網路」針對「Cifar10」資料集，訓練「辨識物體圖片」'/><author><name>昭佑天翔</name><uri>http://www.blogger.com/profile/11034567866105362217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOdP8bqd_6TIzWn168ZxV8q8MA9-wG0B2Mvg7TeIdW9vxYcFkYuiuMHdJ6axGpE6eEHOMzOislRdfaLhPux0TYDV0r5gQmasshzwcYu074OW4-JC-6J_NAlwhH28oha3ov_M8dZSKe8UAX/s72-c/001.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7065255949366990244.post-2650819849507367726</id><published>2018-05-07T08:00:00.000+08:00</published><updated>2018-05-14T15:58:36.248+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="Keras"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="TensorFlow"/><category scheme="http://www.blogger.com/atom/ns#" term="我的 AI"/><title type='text'>我的第二個 AI：利用「MLP 多層感知」針對「Cifar10」資料集，訓練「辨識物體圖片」</title><content type='html'>在研究 AI 課題上,&lt;br&gt;
&lt;br&gt;
會從最多學習資源, 且簡單易學, 又支援多種程式語言, 所以選擇 Google TensorFlow,&lt;br&gt;
&lt;br&gt;
而 Keras 又是基於 TensorFlow, 提供更高階 API, 相對於 TensorFlow 更易學習,&lt;br&gt;
&lt;br&gt;
且 Keras 本身也內建提供了 AI 訓練資料集 (&lt;a href=&quot;https://keras.io/datasets/&quot; target=&quot;_blank&quot;&gt;英文官網&lt;/a&gt;、&lt;a href=&quot;https://keras.io/zh/datasets/&quot; target=&quot;_blank&quot;&gt;中文官網&lt;/a&gt;),&lt;br&gt;
&lt;br&gt;
節省了 AI 初學者準備大量資料的時間,&lt;br&gt;
&lt;br&gt;
而這次是利用 Cifar10 物體圖片集,&lt;br&gt;
&lt;br&gt;
也就是要讓 AI 辨識圖片是什麼物體, 範例如下 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOdP8bqd_6TIzWn168ZxV8q8MA9-wG0B2Mvg7TeIdW9vxYcFkYuiuMHdJ6axGpE6eEHOMzOislRdfaLhPux0TYDV0r5gQmasshzwcYu074OW4-JC-6J_NAlwhH28oha3ov_M8dZSKe8UAX/s1600/001.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOdP8bqd_6TIzWn168ZxV8q8MA9-wG0B2Mvg7TeIdW9vxYcFkYuiuMHdJ6axGpE6eEHOMzOislRdfaLhPux0TYDV0r5gQmasshzwcYu074OW4-JC-6J_NAlwhH28oha3ov_M8dZSKe8UAX/s1600/001.png&quot; data-original-width=&quot;576&quot; data-original-height=&quot;210&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
至於「AI 與機器學習」的觀念, 可以參考 Google 釋出的內部培訓教材 : &lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;https://developers.google.com/machine-learning/crash-course/&quot; target=&quot;_blank&quot;&gt;點選此處&lt;/a&gt;: 《Google 內部培訓教材》Machine Learning Crash Course 機器學習速成課程（影片可選擇顯示中文字幕）.&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;https://ai.google/education/&quot; target=&quot;_blank&quot;&gt;點選此處&lt;/a&gt;: 《Google 內部培訓教材》Learn with Google AI（影片可選擇顯示字幕；若無中文字幕，也可選擇自動翻譯字幕）.&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;https://tomkuo139.blogspot.tw/2017/11/sololearn-app-python.html&quot; target=&quot;_blank&quot;&gt;點選此處&lt;/a&gt;: TensorFlow 支援 Python 最完整, 且 Python 易學、應用廣泛, 建議學習.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
那就開始用「MLP 多層感知」來辨識「Cifar10 物體圖片集」, 其參考步驟, 如下 :&lt;br&gt;
&lt;br&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;a href=&quot;https://tomkuo139.blogspot.com/2018/03/anaconda-tensorflow-keras.html&quot; target=&quot;_blank&quot;&gt;點選此處&lt;/a&gt;: 參考我這篇文章【安裝 Google TensorFlow 與 Keras 環境】.&lt;br&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;1）透過 Keras 下載 Cifar10 資料集&lt;/div&gt;&lt;pre&gt;
from keras.datasets import cifar10

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 第一次執行 load_data() 會從網路下載 Cifar10 資料集
# load_data() 會分析 Cifar10 資料集, 且回傳 &quot;二維 Tuple 元組&quot;
####################&lt;/span&gt;
((&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_feature&lt;/span&gt;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_label&lt;/span&gt;), (&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature&lt;/span&gt;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label&lt;/span&gt;)) = cifar10.load_data()
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrfs1CQfDtSxNQQ_pEvXjaQa3mkiZjUPx5pf72od5zIKzd8n_ZotsUmqFekGkxpIfLTs0czdg06-9W70Xfb9qde8BgWpLSehWl5-Xb7hy0ade-o0iJeNSorfFkO-c33V3q20HkK0Zwn74J/s1600/002.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrfs1CQfDtSxNQQ_pEvXjaQa3mkiZjUPx5pf72od5zIKzd8n_ZotsUmqFekGkxpIfLTs0czdg06-9W70Xfb9qde8BgWpLSehWl5-Xb7hy0ade-o0iJeNSorfFkO-c33V3q20HkK0Zwn74J/s1600/002.png&quot; data-original-width=&quot;671&quot; data-original-height=&quot;47&quot; /&gt;&lt;/a&gt;

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 查看 train 與 test 的資料描述
####################&lt;/span&gt;
print( &#39;train feature datas =&#39;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_feature&lt;/span&gt;.shape )
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出結果: train feature datas = (50000, 32, 32, 3)
# 四維陣列, 第一維陣列長度 50000, 第二維陣列長度 32, 第三維陣列長度 32, 第四維陣列長度 3
# 說明: 訓練用的圖片資料有 50000 筆, 每筆長寬為 32x32 且為 RGB 三原色的彩色圖片&lt;/span&gt;

print( &#39;test feature datas =&#39;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature&lt;/span&gt;.shape )
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出結果: test feature datas = (10000, 32, 32, 3)
# 四維陣列, 第一維陣列長度 10000, 第二維陣列長度 32, 第三維陣列長度 32, 第四維陣列長度 3
# 說明: 測試用的圖片資料有 10000 筆, 每筆長寬為 32x32 且為 RGB 三原色的彩色圖片&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;2）將 Cifar10 訓練資料的二維圖片，轉換為一維陣列&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# Cifar10 提供的圖片格式為 32 x 32 x 3 (3 表示 RGB 三原色)
# MLP 輸入層的每筆 Data 都是一維陣列
# 所以, 需將 Train Feature 所有圖片, 每個都轉換成一維陣列, 且其資料值型態為 float32
# RGB 顏色數值為 0~255, 除以 255, 讓顏色數值收斂到 0~1, 會讓後續訓練模型時, 可以提高準確率
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_feature_vector&lt;/span&gt; = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_feature&lt;/span&gt;.reshape( len(&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_feature&lt;/span&gt;), 32*32*3 ).astype(&#39;float32&#39;)
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_feature_vector&lt;/span&gt; /= 255

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 查看 feature vector 集合&lt;/span&gt;
print( &#39;train feature vector datas =&#39;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_feature_vector&lt;/span&gt;.shape )
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出結果:&lt;/span&gt;
train feature vector datas = (50000, 3072)
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;3）將 Cifar10 訓練資料的真實數值，轉換為 One-Hot Encoding&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# MLP 輸出層的每筆 Data 都是一維陣列
# 所以, 需將 Train Label 資料轉換為 One-Hot Encoding, 也就是
# 1 轉換為 [0, &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;1&lt;/span&gt;, 0, 0, 0, 0, 0, 0, 0, 0]
# 5 轉換為 [0, 0, 0, 0, 0, &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;1&lt;/span&gt;, 0, 0, 0, 0]
# 9 轉換為 [0, 0, 0, 0, 0, 0, 0, 0, 0, &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;1&lt;/span&gt;]
####################&lt;/span&gt;
from keras.utils import np_utils

&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_label_onehot&lt;/span&gt; = np_utils.to_categorical(&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_label&lt;/span&gt;)
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;4）建立 MultiLayer Perceptron（MLP 多層感知器） Model 模型&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 載入所需的相關套件
####################&lt;/span&gt;
from keras.models import Sequential
from keras.layers import Dense

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 建立 Sequential 順序模組
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;model&lt;/span&gt; = Sequential()

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 模型加入【輸入層】與【隱藏層】
# 「隱藏層」可以有多層, 可比喻為「AI 人數」
# 「units 神經元」可比喻為「AI 智力」
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;model&lt;/span&gt;.add( Dense( input_dim = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;32*32*3&lt;/span&gt;           &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸入層有 32*32*3=3072 個神經元&lt;/span&gt;
                , units = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;256&lt;/span&gt;                   &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 隱藏層有 256 個神經元 (值越大, 訓練越精準, 相對訓練時間也越久)&lt;/span&gt;
                , kernel_initializer = &#39;&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;normal&lt;/span&gt;&#39; &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 使用 normal 初始化 weight 權重與 bias 偏差值&lt;/span&gt;
                , activation = &#39;&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;relu&lt;/span&gt;&#39;           &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 使用 relu 激活函數&lt;/span&gt;
                )
         )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 模型加入【輸出層】
# 沒有 input_dim 參數, 是因為 Keras 自動把上一層的 units 作為這一層的 input_dim
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;model&lt;/span&gt;.add( Dense( units = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;10&lt;/span&gt;                    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出層有 10 個神經元 (因為數字只有 0 ~ 9)&lt;/span&gt;
                , kernel_initializer = &#39;&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;normal&lt;/span&gt;&#39; &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 使用 normal 初始化 weight 權重與 bias 偏差值&lt;/span&gt;
                , activation = &#39;&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;softmax&lt;/span&gt;&#39;        &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 使用 softmax 激活函數 (softmax 值越高, 代表機率越大)&lt;/span&gt;
                )
         )
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;5）Model 模型進行【Train 訓練】&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 設定模型的訓練方式
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;model&lt;/span&gt;.compile( loss=&#39;&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;categorical_crossentropy&lt;/span&gt;&#39; &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定 Loss 損失函數 為 categorical_crossentropy&lt;/span&gt;
             , optimizer = &#39;&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;adam&lt;/span&gt;&#39;              &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定 Optimizer 最佳化方法 為 adam&lt;/span&gt;
             , metrics = [&#39;&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;accuracy&lt;/span&gt;&#39;]          &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定 Model 評估準確率方法 為 accuracy&lt;/span&gt;
             )


&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 開始訓練
# MLP 輸入層的每筆 Data 都是一維陣列, 這就是為何 x 輸入 train_feature_vector, 而非 train_feature
# MLP 輸出層的每筆 Data 都是一維陣列, 這就是為何 y 輸入 train_label_onehot,   而非 train_label
# &lt;font color=&quot;#FF0000&quot;&gt;(若準確率不高, 改善 1: 可再執行這個函數, 進行重覆訓練)&lt;/font&gt;
# &lt;font color=&quot;#FF0000&quot;&gt;(若準確率不高, 改善 2: 重新建立 Model, 且增加 隱藏層 units 神經元數, 重新進行訓練)&lt;/font&gt;
# &lt;font color=&quot;#FF0000&quot;&gt;(若準確率不高, 改善 3: 重新建立 Model, 且增加 隱藏層 layer, 重新進行訓練)&lt;/font&gt;
# &lt;font color=&quot;#FF0000&quot;&gt;(若準確率不高, 改善 4: 重新建立 Model, 且更換訓練方式（神經網路）, 重新進行訓練)&lt;/font&gt;
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;history&lt;/span&gt; = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;model&lt;/span&gt;.fit(               &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 訓練的歷史記錄, 會會回傳到指定變數 history&lt;/span&gt;
          x = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_feature_vector&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定 圖片 Features 特徵值 (cifar10 提供 50000 筆資料)&lt;/span&gt;
        , y = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_label_onehot&lt;/span&gt;   &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定 圖片 Label    真實值 (cifar10 提供 50000 筆資料)&lt;/span&gt;
        , validation_split = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;0.2&lt;/span&gt;   &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定 有多少筆驗證         (50000*0.2=10000 筆驗證, 50000*0.8=40000 筆訓練)&lt;/span&gt;
        , epochs = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;50&lt;/span&gt;              &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定 訓練次數             (值 10 以上,  值越大, 訓練時間越久, 但訓練越精準)&lt;/span&gt;
        , batch_size = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;1000&lt;/span&gt;        &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定 訓練時每批次有多少筆 (值 100 以上, 值越大, 訓練速度越快, 但需記憶體要夠大)&lt;/span&gt;
        , verbose = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;2&lt;/span&gt;              &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 是否 顯示訓練過程         (0: 不顯示, 1: 詳細顯示, 2: 簡易顯示)&lt;/span&gt;
)

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 執行的顯示結果 (這會花一些時間, 然後會逐次顯示訓練結果)
# &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;loss&lt;/span&gt;:     使用訓練資料, 得到的損失函數誤差值 (值越小, 代表準確率越高)
# &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;acc&lt;/span&gt;:      使用訓練資料, 得到的評估準確率     (值在 0~1, 值越大, 代表準確率越高)
# &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;val_loss&lt;/span&gt;: 使用驗證資料, 得到的損失函數誤差值 (值越小, 代表準確率越高)
# &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;val_acc&lt;/span&gt;:  使用驗證資料, 得到的評估準確率     (值在 0~1, 值越大, 代表準確率越高)

# 這是 epochs=50, batch_size=1000, verbose=2 顯示【簡易結果】&lt;/span&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7p2H1n99myyY4xhN4npSxvmlkZaheoL96a9XT0312ndoOFrYMb1mzL1h8H5ObTKOE0QOHXnczLzM44u_Mw0cPCx4I3o_h4D54xXzpJyfRqsO4X4RbXp598jbeCT2TXMpnENERGPPDM-WS/s1600/mlp_003.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7p2H1n99myyY4xhN4npSxvmlkZaheoL96a9XT0312ndoOFrYMb1mzL1h8H5ObTKOE0QOHXnczLzM44u_Mw0cPCx4I3o_h4D54xXzpJyfRqsO4X4RbXp598jbeCT2TXMpnENERGPPDM-WS/s1600/mlp_003.png&quot; data-original-width=&quot;630&quot; data-original-height=&quot;223&quot; /&gt;&lt;/a&gt;
...
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIyR_IoVHl5teI8dBqqlBfJpOJaXYmNEcW40Jy_7M073EjYkDNOIZVYzI5dhRT3f7Xdjrz0Iuz3vQC0Ga77iOekDa4DKG0iiwky0jgK9qJ0cdN5b94THt7KFkr0AMgZl0OToj3R_QDTK0C/s1600/mlp_004.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIyR_IoVHl5teI8dBqqlBfJpOJaXYmNEcW40Jy_7M073EjYkDNOIZVYzI5dhRT3f7Xdjrz0Iuz3vQC0Ga77iOekDa4DKG0iiwky0jgK9qJ0cdN5b94THt7KFkr0AMgZl0OToj3R_QDTK0C/s1600/mlp_004.png&quot; data-original-width=&quot;630&quot; data-original-height=&quot;210&quot; /&gt;&lt;/a&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;6）顯示 Train History 訓練歷史記錄的準確率圖表&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 定義函數, 用來顯示訓練歷史記錄的圖表
####################&lt;/span&gt;
import matplotlib.pyplot as plot  # plot 可以視為畫布

def &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_history_graphic&lt;/span&gt;( history       &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 資料集合&lt;/span&gt;
                         , history_key1  &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 資料集合裡面的來源 1 (有 loss, acc, val_loss, val_acc 四種)&lt;/span&gt;
                         , history_key2  &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 資料集合裡面的來源 2 (有 loss, acc, val_loss, val_acc 四種)&lt;/span&gt;
                         , y_label       &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# Y 軸標籤文字&lt;/span&gt;
                         ) :
    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 資料來源 1&lt;/span&gt;
    plot.plot( history.history[history_key1] )

    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 資料來源 2&lt;/span&gt;
    plot.plot( history.history[history_key2] )

    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 標題&lt;/span&gt;
    plot.title( &#39;train history&#39; )

    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# X 軸標籤文字&lt;/span&gt;
    plot.xlabel( &#39;epochs&#39; )

    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# Y 軸標籤文字&lt;/span&gt;
    plot.ylabel( y_label )

    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定圖例
    # (參數 1 為圖例說明, 有幾個資料來源, 就對應幾個圖例說明)
    # (參數 2 為圖例位置, upper 為上面, lower 為下面, left 為左邊, right 為右邊)&lt;/span&gt;
    plot.legend( [&#39;train&#39;, &#39;validate&#39;]
               , loc = &#39;upper left&#39;
               )

    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 顯示畫布&lt;/span&gt;
    plot.show()

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 顯示 train history 準確率圖表
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_history_graphic&lt;/span&gt;( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;history&lt;/span&gt;, &#39;acc&#39;, &#39;val_acc&#39;, &#39;accuracy&#39; )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出結果 (可以得知, 隨著訓練次數的增加, 準確率也越來越高) :&lt;/span&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiExlrb2Hg4jblKoTIeWfZ7sRPJJ168D_rmLDaGdCTu7X_8WlPZYo-nEAgHXhKCKuMD49Z67m1rMV0S4cW9cv6fki60paNzjulFjYzUFngWL6FwCF87NLQHxEE2hAnGV94iwtRA4vgH0hQT/s1600/mlp_005.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiExlrb2Hg4jblKoTIeWfZ7sRPJJ168D_rmLDaGdCTu7X_8WlPZYo-nEAgHXhKCKuMD49Z67m1rMV0S4cW9cv6fki60paNzjulFjYzUFngWL6FwCF87NLQHxEE2hAnGV94iwtRA4vgH0hQT/s1600/mlp_005.png&quot; data-original-width=&quot;395&quot; data-original-height=&quot;278&quot; /&gt;&lt;/a&gt;

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 顯示 train history 損失函數誤差值圖表
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_history_graphic&lt;/span&gt;( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;history&lt;/span&gt;, &#39;loss&#39;, &#39;val_loss&#39;, &#39;loss&#39; )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出結果 (可以得知, 隨著訓練次數的增加, 誤差值率也越來越低) :&lt;/span&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZVHJ9h88p7-oOkOmQXvJScYA7a8-hpXwiGhBIhd-gKztiJi0Fqzv49Qt1k2Pa7SewHJUZL3L9XDYPVmcoT-iboxcxoh3M_vC2EpI407Qhsrcm3zXgTrl6PsXpjqM3DZeYp6Fwd3xWqTA4/s1600/mlp_006.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZVHJ9h88p7-oOkOmQXvJScYA7a8-hpXwiGhBIhd-gKztiJi0Fqzv49Qt1k2Pa7SewHJUZL3L9XDYPVmcoT-iboxcxoh3M_vC2EpI407Qhsrcm3zXgTrl6PsXpjqM3DZeYp6Fwd3xWqTA4/s1600/mlp_006.png&quot; data-original-width=&quot;389&quot; data-original-height=&quot;278&quot; /&gt;&lt;/a&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;7）用【訓練好的 Model】拿【Cifar10 測試資料】來評估【Model 準確率】&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# MLP 輸入層的每筆 Data 都是一維陣列
# 所以, 需將 Test Feature 所有圖片, 每個都轉換成一維陣列, 且其資料值型態為 float32
# RGB 顏色數值為 0~255, 除以 255, 讓顏色數值收斂到 0~1, 會讓後續模型預測時, 可以提高準確率
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature_vector&lt;/span&gt; = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature&lt;/span&gt;.reshape( len(&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature&lt;/span&gt;), 32*32*3 ).astype(&#39;float32&#39;)
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature_vector&lt;/span&gt; /= 255

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# MLP 輸出層的每筆 Data 都是一維陣列
# 所以, 需將 Test Label 資料轉換為 One-Hot Encoding
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label_onehot&lt;/span&gt; = np_utils.to_categorical(&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label&lt;/span&gt;)

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 使用測試資料評估 Model 的【損失函數誤差值】與【準確率】
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;eval&lt;/span&gt; = model.evaluate( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature_vector&lt;/span&gt;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label_onehot&lt;/span&gt; )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 顯示 Model 評估測試資料的【損失函數誤差值】與【準確率】&lt;/span&gt;
print( &#39;loss =&#39;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;eval&lt;/span&gt;[0] )
print( &#39;accuracy =&#39;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;eval&lt;/span&gt;[1] )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出結果 (0.4905 準確率表示 10000 筆資料, 會對 4905 筆, 會錯 5095 筆) :
loss = 1.420945964050293
accuracy = 0.4905&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;8）用【訓練好的 Model】拿【Cifar10 測試資料】進行【辨識物體圖片】&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 用【訓練好的 Model】進行【辨識物體圖片】
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;prediction&lt;/span&gt; = model.predict_classes( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature&lt;/span&gt; )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 顯示圖片集全部的預測結果
# 顯示圖片集第 340 ~ 360 筆的預測結果
####################&lt;/span&gt;
print( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;prediction&lt;/span&gt; )
print( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;prediction&lt;/span&gt;[340:360] )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出結果 :
[3 9 0 ... 3 4 7]
[5 6 0 5 8 3 7 3 8 9 9 1 8 2 3 5 2 5 1 0]&lt;/span&gt;

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 將 Prediction 數值轉換成 Prediction 說明文字
####################&lt;/span&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# Label 數值對應的說明文字&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;label_desc&lt;/span&gt; = [ &#39;airplane&#39;, &#39;automobile&#39;, &#39;bird&#39;, &#39;cat&#39;, &#39;deer&#39;, &#39;dog&#39;, &#39;frog&#39;, &#39;horse&#39;, &#39;ship&#39;, &#39;truck&#39; ]

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# Prediction 數值轉換成 Prediction 說明文字&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;prediction_desc&lt;/span&gt; = list( map( lambda x : &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;label_desc&lt;/span&gt;[x], &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;prediction&lt;/span&gt; ) )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 顯示圖片集第 340 ~ 360 筆的預測結果&lt;/span&gt;
print( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;prediction_desc&lt;/span&gt;[340:360] )
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出結果 :
[&#39;dog&#39;, &#39;frog&#39;, &#39;airplane&#39;, &#39;dog&#39;, &#39;ship&#39;, &#39;cat&#39;, &#39;horse&#39;, &#39;cat&#39;, &#39;ship&#39;, &#39;truck&#39;, &#39;truck&#39;, &#39;automobile&#39;, &#39;ship&#39;, &#39;bird&#39;, &#39;cat&#39;, &#39;dog&#39;, &#39;bird&#39;, &#39;dog&#39;, &#39;automobile&#39;, &#39;airplane&#39;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;9）預測結束後, 接下來試著找出預測錯誤的資料&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 透過 DataFrame 對照表清單, 來顯示 Label 真實數值, 與 AI 預設結果
####################&lt;/span&gt;
import pandas as pd

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# Pandas.DataFrame 的資料集需要一維陣列, 而 test_label 本身是二維陣列, 需透過 reshape 轉換為一維陣列&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label_onearr&lt;/span&gt; = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label&lt;/span&gt;.reshape(len(&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label&lt;/span&gt;))

&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;checkList&lt;/span&gt; = pd.DataFrame( {&#39;label&#39;:&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label_onearr&lt;/span&gt;       &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# Column1 名稱: 欄位值集合 (這裡提供 Label 真實數值)&lt;/span&gt;
                          ,&#39;prediction&#39;:&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;prediction&lt;/span&gt;  &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# Column2 名稱: 欄位值集合 (這裡提供 AI 預測結果)&lt;/span&gt;
                          }
                        )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 顯示對照表前 10 筆結果&lt;/span&gt;
print( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;checkList&lt;/span&gt;[0:10] )
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjP1ESmqcYyfH7GVjWczyRBBU40TsxYMPo3gl0LvwBe7xVOBLbiFGEKqIqrSq01PvkoJiLEpusrJdKAcQbS3riZEtQMd3fk4k-5spiyWbNqIzXHKPQlah54Ld09Q3pw5knum-z8CU7ATUHf/s1600/mlp_007.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjP1ESmqcYyfH7GVjWczyRBBU40TsxYMPo3gl0LvwBe7xVOBLbiFGEKqIqrSq01PvkoJiLEpusrJdKAcQbS3riZEtQMd3fk4k-5spiyWbNqIzXHKPQlah54Ld09Q3pw5knum-z8CU7ATUHf/s1600/mlp_007.png&quot; data-original-width=&quot;211&quot; data-original-height=&quot;195&quot; /&gt;&lt;/a&gt;

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 列出對照表中, prediction 欄位值 不等於 label 欄位值的資料
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;checkList&lt;/span&gt;[ &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;checkList&lt;/span&gt;.prediction != &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;checkList&lt;/span&gt;.label ]
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6FKkTpf1y327jO1KOe_OXRd79XmzzekVyD2GEWeEptgGMxsCp2ZkcQfpYrXHcLrX3HZleZj30vEYNUYKdJGyBf673EjPL4lCeOpNN5gGZM5B8X4vVzp6LGVEM_D8_ZWaqmy4lepM5vKln/s1600/mlp_008.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6FKkTpf1y327jO1KOe_OXRd79XmzzekVyD2GEWeEptgGMxsCp2ZkcQfpYrXHcLrX3HZleZj30vEYNUYKdJGyBf673EjPL4lCeOpNN5gGZM5B8X4vVzp6LGVEM_D8_ZWaqmy4lepM5vKln/s1600/mlp_008.png&quot; data-original-width=&quot;250&quot; data-original-height=&quot;191&quot; /&gt;&lt;/a&gt;
.....
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYrjW4xYBqtZMYqlPO_UgC3CzQ6r8IZHPdbQjAwz470l9X5KB2vnoLsLmgg1Olp7UEz4Mr212um3PHhE7HHcwG1_8pbeg2tdk77LELF5VN_KCSKjLl2drNyqfnxKJ8t0xgS8Dje4q40a2j/s1600/mlp_009.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYrjW4xYBqtZMYqlPO_UgC3CzQ6r8IZHPdbQjAwz470l9X5KB2vnoLsLmgg1Olp7UEz4Mr212um3PHhE7HHcwG1_8pbeg2tdk77LELF5VN_KCSKjLl2drNyqfnxKJ8t0xgS8Dje4q40a2j/s1600/mlp_009.png&quot; data-original-width=&quot;250&quot; data-original-height=&quot;224&quot; /&gt;&lt;/a&gt;

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 定義函數, 用來顯示 Cifar10 多筆影像, 真實數值, 與 AI 預設結果
####################&lt;/span&gt;
import matplotlib.pyplot as plot  &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# plot 可以視為畫布&lt;/span&gt;
import math

def &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;show_feature_label_prediction&lt;/span&gt;( features
                                 , labels
                                 , predictions
                                 , indexList  &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 資料集合中, 要顯示的索引陣列&lt;/span&gt;
                                 ) :
    # 要顯示的索引陣列長度
    num = len(indexList)

    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定畫布的寬（參數 1）與高（參數 2）&lt;/span&gt;
    plot.gcf().set_size_inches( 2*5, (2+0.4)*math.ceil(num/5) )

    loc = 0
    for i in indexList :

        &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 目前要在畫布上的哪個位置顯示 (從 1 開始)&lt;/span&gt;
        loc += 1

        &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 畫布區分為幾列（參數 1）, 幾欄（參數 2）, 目前在哪個位置（參數 3）&lt;/span&gt;
        subp = plot.subplot( math.ceil(num/5), 5, loc )

        &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 畫布上顯示圖案, 其中 cmap=binary 為顯示黑白圖案&lt;/span&gt;
        subp.imshow( features[i], cmap=&#39;binary&#39; )

        &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定標題內容
        # 有 AI 預測結果資料, 才在標題顯示預測結果&lt;/span&gt;
        if( len(predictions) &gt; 0 ) :
            title = &#39;ai = &#39; + label_desc[ predictions[i] ]
            title += (&#39; (o)&#39; if predictions[i]==labels[i] else &#39; (x)&#39;) &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 預測正確顯示(o), 錯誤顯示(x)&lt;/span&gt;
            title += &#39;\nlabel = &#39; + label_desc[ labels[i] ]
        &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 沒有 AI 預測結果資料, 則只在標題顯示真實數值&lt;/span&gt;
        else :
            title = &#39;label = &#39; + label_desc[ labels[i] ]

       &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 在畫布上顯示標題, 且字型大小為 12&lt;/span&gt;
        subp.set_title( title, fontsize=12 )

        &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# X, Y 軸不顯示刻度&lt;/span&gt;
        subp.set_xticks( [] )
        subp.set_yticks( [] )

    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 顯示畫布&lt;/span&gt;
    plot.show()

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 從測試資料集第 0 位置, 顯示 10 個資料的圖片, 真實數值, 與預測結果
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;show_feature_label_prediction&lt;/span&gt;( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature&lt;/span&gt;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label_onearr&lt;/span&gt;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;prediction&lt;/span&gt;, range(&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;10&lt;/span&gt;) )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出結果 :&lt;/span&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiavTSn1E2I8xwwsp2IE9ZomeRcIV-AHKL0dttye6UivC0D-Kmvv3P28UJ9mMAYAEOpW_T1N5IIsop0n2uIe_lfICoIq19mofeJYSADOl8v59f_Yy_QmimBea-YBwAye3lw0EtB3ZsUleCY/s1600/mlp_010.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiavTSn1E2I8xwwsp2IE9ZomeRcIV-AHKL0dttye6UivC0D-Kmvv3P28UJ9mMAYAEOpW_T1N5IIsop0n2uIe_lfICoIq19mofeJYSADOl8v59f_Yy_QmimBea-YBwAye3lw0EtB3ZsUleCY/s1600/mlp_010.png&quot; data-original-width=&quot;596&quot; data-original-height=&quot;287&quot; /&gt;&lt;/a&gt;

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 可以改版為顯示中文, 且預測錯誤顯示紅色字體 :&lt;/span&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMMmpn5RjRl_fM-72u7IaDU8loW2qG25UKs6M26RkwLgwTqPAgjH4xdJJ3-7NEo1Zkk5wojgEtU76SHafJ2lse6zQLrvMhYDB0BTPEDR7rC-jtV-3yBrp3iB-EVMP4YZHvjjYpbgnb7UVE/s1600/mlp_10.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMMmpn5RjRl_fM-72u7IaDU8loW2qG25UKs6M26RkwLgwTqPAgjH4xdJJ3-7NEo1Zkk5wojgEtU76SHafJ2lse6zQLrvMhYDB0BTPEDR7rC-jtV-3yBrp3iB-EVMP4YZHvjjYpbgnb7UVE/s1600/mlp_10.png&quot; data-original-width=&quot;582&quot; data-original-height=&quot;285&quot; /&gt;&lt;/a&gt;

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 之前評估 Model 準確率為 0.4905, 也就是 10000 筆資料, 會對 4905 筆, 會錯 5095 筆
# 將這些錯誤資料顯示出來, 看看是否為圖形太混亂不清楚, 從而了解 AI 為何會預測錯誤
# 另外, 可以藉由【&lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;提高訓練次數&lt;/span&gt;】或【&lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;增加隱藏層的神經元數&lt;/span&gt;】或【&lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;增加隱藏層&lt;/span&gt;】或【&lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;改變神經網路方式&lt;/span&gt;】, 來提升 AI 準確率
####################
# 顯示預測錯誤的前 20 筆資料&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;show_feature_label_prediction&lt;/span&gt;( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature&lt;/span&gt;
                             , &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label_onearr&lt;/span&gt;
                             , &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;prediction&lt;/span&gt;
                             , &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;checkList&lt;/span&gt;.index[&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;checkList&lt;/span&gt;.prediction != &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;checkList&lt;/span&gt;.label][0:20]
                             )
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkRmFHFvmsJgeFMgRu8dNZ7sTYq2c0Mz6EI6HVZ28x-EnawSBMTeh9Vt465FQ-_PhyzXKmt8fQPQHYDg_HZ_coTMyeKRnWF_oZiM4N9jzKxg1o6RjMW49Zy4jN2w6edkNsklJNQVrbbc63/s1600/mlp_011.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkRmFHFvmsJgeFMgRu8dNZ7sTYq2c0Mz6EI6HVZ28x-EnawSBMTeh9Vt465FQ-_PhyzXKmt8fQPQHYDg_HZ_coTMyeKRnWF_oZiM4N9jzKxg1o6RjMW49Zy4jN2w6edkNsklJNQVrbbc63/s1600/mlp_011.png&quot; data-original-width=&quot;581&quot; data-original-height=&quot;548&quot; /&gt;&lt;/a&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;10）將訓練好的 Model 模型儲存起來, 在日後可以直接載入使用, 而不用再重新訓練&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 將 Model 模型儲存成 HDF5 檔案, 路徑名稱為 D 槽下的 my_cifar10_mlp_model.h5
# 檔案命名規則: 資料集名稱_神經網路名稱_model.h5
####################&lt;/span&gt;
model.save(&#39;d:/my_cifar10_mlp_model.h5&#39;)

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 從 D 槽下的 my_cifar10_mlp_model.h5 檔案, 載入 Model 模型
####################&lt;/span&gt;
from keras.models import load_model

model = load_model(&#39;d:/my_cifar10_mlp_model.h5&#39;)
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
以上, 參考看看囉, 如有任何問題, 也歡迎一同一起研究 ^ ^
&lt;br&gt;
&lt;div class=&quot;hiddenCopyRight&quot;&gt;&lt;a href=&quot;https://tomkuo139.blogspot.com&quot;&gt;昭佑.天翔&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/2650819849507367726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/2650819849507367726'/><link rel='alternate' type='text/html' href='http://tomkuo139.blogspot.com/2018/05/aimlp-cifar10.html' title='我的第二個 AI：利用「MLP 多層感知」針對「Cifar10」資料集，訓練「辨識物體圖片」'/><author><name>昭佑天翔</name><uri>http://www.blogger.com/profile/11034567866105362217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOdP8bqd_6TIzWn168ZxV8q8MA9-wG0B2Mvg7TeIdW9vxYcFkYuiuMHdJ6axGpE6eEHOMzOislRdfaLhPux0TYDV0r5gQmasshzwcYu074OW4-JC-6J_NAlwhH28oha3ov_M8dZSKe8UAX/s72-c/001.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7065255949366990244.post-4143179748570664713</id><published>2018-04-28T19:08:00.000+08:00</published><updated>2018-05-08T16:19:59.496+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="Keras"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="TensorFlow"/><category scheme="http://www.blogger.com/atom/ns#" term="我的 AI"/><title type='text'>我的第一個 AI：利用「MLP 多層感知」針對「Mnist」資料集，訓練「辨識數字圖片」</title><content type='html'>在研究第一個 AI 課題上,&lt;br&gt;
&lt;br&gt;
會從最多學習資源, 且簡單易學, 又支援多種程式語言, 所以選擇 Google TensorFlow,&lt;br&gt;
&lt;br&gt;
而 Keras 又是基於 TensorFlow, 提供更高階 API, 相對於 TensorFlow 更易學習,&lt;br&gt;
&lt;br&gt;
且 Keras 本身也內建提供了 AI 訓練資料集 (&lt;a href=&quot;https://keras.io/datasets/&quot; target=&quot;_blank&quot;&gt;英文官網&lt;/a&gt;、&lt;a href=&quot;https://keras.io/zh/datasets/&quot; target=&quot;_blank&quot;&gt;中文官網&lt;/a&gt;),&lt;br&gt;
&lt;br&gt;
節省了 AI 初學者準備大量資料的時間,&lt;br&gt;
&lt;br&gt;
而這次是利用 Mnist 數字圖片集,&lt;br&gt;
&lt;br&gt;
也就是要讓 AI 辨識圖片是什麼數字, 範例如下 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw93XqNj6A6opM1_A-ZE0DYSdeh5YN6BjcCUB0whmxsYMgYaEx3MwIMqoOuZ6ALCPqlvsW-FZwy_koGL_dgxVDBO3eK_VEKK4IJwv6rjCDs6gIZRaP6b-o4RhXRLgq0wOrOQX0kUxiwLEl/s1600/101.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw93XqNj6A6opM1_A-ZE0DYSdeh5YN6BjcCUB0whmxsYMgYaEx3MwIMqoOuZ6ALCPqlvsW-FZwy_koGL_dgxVDBO3eK_VEKK4IJwv6rjCDs6gIZRaP6b-o4RhXRLgq0wOrOQX0kUxiwLEl/s1600/101.png&quot; data-original-width=&quot;563&quot; data-original-height=&quot;101&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
至於「AI 與機器學習」的觀念, 可以參考 Google 釋出的內部培訓教材 : &lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;https://developers.google.com/machine-learning/crash-course/&quot; target=&quot;_blank&quot;&gt;點選此處&lt;/a&gt;: 《Google 內部培訓教材》Machine Learning Crash Course 機器學習速成課程（影片可選擇顯示中文字幕）.&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;https://ai.google/education/&quot; target=&quot;_blank&quot;&gt;點選此處&lt;/a&gt;: 《Google 內部培訓教材》Learn with Google AI（影片可選擇顯示字幕；若無中文字幕，也可選擇自動翻譯字幕）.&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;https://tomkuo139.blogspot.tw/2017/11/sololearn-app-python.html&quot; target=&quot;_blank&quot;&gt;點選此處&lt;/a&gt;: TensorFlow 支援 Python 最完整, 且 Python 易學、應用廣泛, 建議學習.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
那就開始用「MLP 多層感知」來辨識「Mnist 數字圖片集」, 其參考步驟, 如下 :&lt;br&gt;
&lt;br&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;a href=&quot;https://tomkuo139.blogspot.com/2018/03/anaconda-tensorflow-keras.html&quot; target=&quot;_blank&quot;&gt;點選此處&lt;/a&gt;: 參考我這篇文章【安裝 Google TensorFlow 與 Keras 環境】.&lt;br&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;1）透過 Keras 下載 Mnist 資料集&lt;/div&gt;&lt;pre&gt;
from keras.datasets import mnist

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 第一次執行 load_data() 會從網路下載 Mnist 資料集
# load_data() 會分析 Mnist 資料集, 且回傳 &quot;二維 Tuple 元組&quot;
####################&lt;/span&gt;
((&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_feature&lt;/span&gt;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_label&lt;/span&gt;), (&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature&lt;/span&gt;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label&lt;/span&gt;)) = mnist.load_data()
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg95YFIGV-t4_Cmlg5NN4t-DR6siQ5ohOTxfWIBNF2arTl9-M7oabAE0BeeCLM_txgSfjcmHaPsjwnuyd-j3kSqpW5USFaTKQdsBk7O7XDvHdoeDpksf8Q-tgWzrRJGW3FISWUiWGO_Kl5I/s1600/001.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg95YFIGV-t4_Cmlg5NN4t-DR6siQ5ohOTxfWIBNF2arTl9-M7oabAE0BeeCLM_txgSfjcmHaPsjwnuyd-j3kSqpW5USFaTKQdsBk7O7XDvHdoeDpksf8Q-tgWzrRJGW3FISWUiWGO_Kl5I/s1600/001.png&quot; data-original-width=&quot;542&quot; data-original-height=&quot;44&quot; /&gt;&lt;/a&gt;

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 查看 train 與 test 的資料描述
####################&lt;/span&gt;
print( &#39;train feature datas =&#39;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_feature&lt;/span&gt;.shape )
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出結果: train feature datas = (60000, 28, 28)
# 三維陣列, 第一維陣列長度 60000, 第二維陣列長度 28, 第三維陣列長度 28
# 說明: 訓練用的圖片資料有 60000 筆, 每筆長寬為 28x28 且為單色圖片&lt;/span&gt;

print( &#39;test feature datas =&#39;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature&lt;/span&gt;.shape )
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出結果: test feature datas = (10000, 28, 28)
# 三維陣列, 第一維陣列長度 10000, 第二維陣列長度 28, 第三維陣列長度 28
# 說明: 測試用的圖片資料有 10000 筆, 每筆長寬為 28x28 且為單色圖片&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;2）將 Mnist 訓練資料的二維圖片，轉換為一維陣列&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# Mnist 提供的數字圖片格式為 28 x 28
# MLP 輸入層的每筆 Data 都是一維陣列
# 所以, 需將 Train Feature 所有圖片, 每個都轉換成一維陣列, 且其資料值型態為 float32
# RGB 顏色數值為 0~255, 除以 255, 讓顏色數值收斂到 0~1, 會讓後續訓練模型時, 可以提高準確率
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_feature_vector&lt;/span&gt; = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_feature&lt;/span&gt;.reshape( len(&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_feature&lt;/span&gt;), 28*28 ).astype(&#39;float32&#39;)
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_feature_vector&lt;/span&gt; /= 255

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 查看 feature vector 集合&lt;/span&gt;
print( &#39;train feature vector datas =&#39;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_feature_vector&lt;/span&gt;.shape )
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出結果:&lt;/span&gt;
train feature vector datas = (60000, 784)
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;3）將 Mnist 訓練資料的真實數值，轉換為 One-Hot Encoding&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# MLP 輸出層的每筆 Data 都是一維陣列
# 所以, 需將 Train Label 資料轉換為 One-Hot Encoding, 也就是
# 1 轉換為 [0, &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;1&lt;/span&gt;, 0, 0, 0, 0, 0, 0, 0, 0]
# 5 轉換為 [0, 0, 0, 0, 0, &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;1&lt;/span&gt;, 0, 0, 0, 0]
# 9 轉換為 [0, 0, 0, 0, 0, 0, 0, 0, 0, &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;1&lt;/span&gt;]
####################&lt;/span&gt;
from keras.utils import np_utils

&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_label_onehot&lt;/span&gt; = np_utils.to_categorical(&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_label&lt;/span&gt;)
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;4）建立 MultiLayer Perceptron（MLP 多層感知器） Model 模型&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 載入所需的相關套件
####################&lt;/span&gt;
from keras.models import Sequential
from keras.layers import Dense

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 建立 Sequential 順序模組
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;model&lt;/span&gt; = Sequential()

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 模型加入【輸入層】與【隱藏層】
# 「隱藏層」可以有多層, 可比喻為「AI 人數」
# 「units 神經元」可比喻為「AI 智力」
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;model&lt;/span&gt;.add( Dense( input_dim = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;28*28&lt;/span&gt;             &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸入層有 28*28=784 個神經元&lt;/span&gt;
                , units = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;256&lt;/span&gt;                   &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 隱藏層有 256 個神經元 (值越大, 訓練越精準, 相對訓練時間也越久)&lt;/span&gt;
                , kernel_initializer = &#39;&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;normal&lt;/span&gt;&#39; &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 使用 normal 初始化 weight 權重與 bias 偏差值&lt;/span&gt;
                , activation = &#39;&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;relu&lt;/span&gt;&#39;           &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 使用 relu 激活函數&lt;/span&gt;
                )
         )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 模型加入【輸出層】
# 沒有 input_dim 參數, 是因為 Keras 自動把上一層的 units 作為這一層的 input_dim
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;model&lt;/span&gt;.add( Dense( units = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;10&lt;/span&gt;                    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出層有 10 個神經元 (因為數字只有 0 ~ 9)&lt;/span&gt;
                , kernel_initializer = &#39;&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;normal&lt;/span&gt;&#39; &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 使用 normal 初始化 weight 權重與 bias 偏差值&lt;/span&gt;
                , activation = &#39;&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;softmax&lt;/span&gt;&#39;        &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 使用 softmax 激活函數 (softmax 值越高, 代表機率越大)&lt;/span&gt;
                )
         )
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;5）Model 模型進行【Train 訓練】&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 設定模型的訓練方式
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;model&lt;/span&gt;.compile( loss=&#39;&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;categorical_crossentropy&lt;/span&gt;&#39; &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定 Loss 損失函數 為 categorical_crossentropy&lt;/span&gt;
             , optimizer = &#39;&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;adam&lt;/span&gt;&#39;              &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定 Optimizer 最佳化方法 為 adam&lt;/span&gt;
             , metrics = [&#39;&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;accuracy&lt;/span&gt;&#39;]          &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定 Model 評估準確率方法 為 accuracy&lt;/span&gt;
             )


&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 開始訓練
# MLP 輸入層的每筆 Data 都是一維陣列, 這就是為何 x 輸入 train_feature_vector, 而非 train_feature
# MLP 輸出層的每筆 Data 都是一維陣列, 這就是為何 y 輸入 train_label_onehot,   而非 train_label
# &lt;font color=&quot;#FF0000&quot;&gt;(若準確率不高, 改善 1: 可再執行這個函數, 進行重覆訓練)&lt;/font&gt;
# &lt;font color=&quot;#FF0000&quot;&gt;(若準確率不高, 改善 2: 重新建立 Model, 且增加 隱藏層 units 神經元數, 重新進行訓練)&lt;/font&gt;
# &lt;font color=&quot;#FF0000&quot;&gt;(若準確率不高, 改善 3: 重新建立 Model, 且增加 隱藏層 layer, 重新進行訓練)&lt;/font&gt;
# &lt;font color=&quot;#FF0000&quot;&gt;(若準確率不高, 改善 4: 重新建立 Model, 且更換訓練方式（神經網路）, 重新進行訓練)&lt;/font&gt;
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;history&lt;/span&gt; = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;model&lt;/span&gt;.fit(               &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 訓練的歷史記錄, 會會回傳到指定變數 history&lt;/span&gt;
          x = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_feature_vector&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定 圖片 Features 特徵值 (mnist 提供 60000 筆資料)&lt;/span&gt;
        , y = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_label_onehot&lt;/span&gt;   &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定 圖片 Label    真實值 (mnist 提供 60000 筆資料)&lt;/span&gt;
        , validation_split = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;0.2&lt;/span&gt;   &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定 有多少筆驗證         (60000*0.2=12000 筆驗證, 60000*0.8=48000 筆訓練)&lt;/span&gt;
        , epochs = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;50&lt;/span&gt;              &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定 訓練次數             (值 10 以上,  值越大, 訓練時間越久, 但訓練越精準)&lt;/span&gt;
        , batch_size = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;1000&lt;/span&gt;        &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定 訓練時每批次有多少筆 (值 100 以上, 值越大, 訓練速度越快, 但需記憶體要夠大)&lt;/span&gt;
        , verbose = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;2&lt;/span&gt;              &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 是否 顯示訓練過程         (0: 不顯示, 1: 詳細顯示, 2: 簡易顯示)&lt;/span&gt;
)

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 執行的顯示結果 (這會花一些時間, 然後會逐次顯示訓練結果)
# &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;loss&lt;/span&gt;:     使用訓練資料, 得到的損失函數誤差值 (值越小, 代表準確率越高)
# &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;acc&lt;/span&gt;:      使用訓練資料, 得到的評估準確率    (值在 0~1, 值越大, 代表準確率越高)
# &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;val_loss&lt;/span&gt;: 使用驗證資料, 得到的損失函數誤差值 (值越小, 代表準確率越高)
# &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;val_acc&lt;/span&gt;:  使用驗證資料, 得到的評估準確率    (值在 0~1, 值越大, 代表準確率越高)

# 這是 epochs=10, batch_size=200, verbose=2 顯示【簡易結果】&lt;/span&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhneCculxAbo8-dFXC8BgG1Ei3csEW8Y2WvPzPB5Cvjc-lt-JHRRQPfiSOXyajR4zXbRbLlvmx9ld8THigqo1eB6GooUDEFIEPOkFDztDiPpd8DGncVFVut36lyX6kqtPk6wskGqekEkh9g/s1600/005_1.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhneCculxAbo8-dFXC8BgG1Ei3csEW8Y2WvPzPB5Cvjc-lt-JHRRQPfiSOXyajR4zXbRbLlvmx9ld8THigqo1eB6GooUDEFIEPOkFDztDiPpd8DGncVFVut36lyX6kqtPk6wskGqekEkh9g/s1600/005_1.png&quot; data-original-width=&quot;560&quot; data-original-height=&quot;193&quot; /&gt;&lt;/a&gt;
...
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYZZ06OcZ1r8YGIpEJLVn4iyDA36GCdFa2UAkNg8lKt-s11lznPV8lDlvwyC2KLLgDLc4I0E0MRNyr2x7vIAHhedGUBKFruFIgWKvxnz_PbFDvj5Kvb6hmF-OarLAfKJkr8c9GNKysWx3s/s1600/005_2.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYZZ06OcZ1r8YGIpEJLVn4iyDA36GCdFa2UAkNg8lKt-s11lznPV8lDlvwyC2KLLgDLc4I0E0MRNyr2x7vIAHhedGUBKFruFIgWKvxnz_PbFDvj5Kvb6hmF-OarLAfKJkr8c9GNKysWx3s/s1600/005_2.png&quot; data-original-width=&quot;560&quot; data-original-height=&quot;107&quot; /&gt;&lt;/a&gt;

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 這是 epochs=50, batch_size=1000, verbose=1 顯示【詳細結果】&lt;/span&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAqcq2yek8BoiwpkegnaZS6J8aijOnyMtI23O77i4g66wsZ0EeelS808WVq30BrOnoK9Q5XJLAJ3kIYp4yLmJmr6YlczxgKSpsUYr902ieBdiarNc4PDXVuA8eNl1g5rrenCPkT4FNnmgO/s1600/005_3.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAqcq2yek8BoiwpkegnaZS6J8aijOnyMtI23O77i4g66wsZ0EeelS808WVq30BrOnoK9Q5XJLAJ3kIYp4yLmJmr6YlczxgKSpsUYr902ieBdiarNc4PDXVuA8eNl1g5rrenCPkT4FNnmgO/s1600/005_3.png&quot; data-original-width=&quot;975&quot; data-original-height=&quot;189&quot; /&gt;&lt;/a&gt;
...
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgUouYVhGMLgHUsS70sSR9FuUNrZ3diJk-DzX0osqOsdlCs1akmHnw7VdiYFNaqeSjOGxxmCEYJ1ia7WbjKfjnA5-N9fGM80_IMvvJpNAYWDhjH1jOcvLYnLmab3Ct86y2iXfo5Ss4mEtg/s1600/005_4.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgUouYVhGMLgHUsS70sSR9FuUNrZ3diJk-DzX0osqOsdlCs1akmHnw7VdiYFNaqeSjOGxxmCEYJ1ia7WbjKfjnA5-N9fGM80_IMvvJpNAYWDhjH1jOcvLYnLmab3Ct86y2iXfo5Ss4mEtg/s1600/005_4.png&quot; data-original-width=&quot;975&quot; data-original-height=&quot;108&quot; /&gt;&lt;/a&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;6）顯示 Train History 訓練歷史記錄的準確率圖表&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 定義函數, 用來顯示訓練歷史記錄的圖表
####################&lt;/span&gt;
import matplotlib.pyplot as plot  # plot 可以視為畫布

def &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_history_graphic&lt;/span&gt;( history       &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 資料集合&lt;/span&gt;
                         , history_key1  &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 資料集合裡面的來源 1 (有 loss, acc, val_loss, val_acc 四種)&lt;/span&gt;
                         , history_key2  &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 資料集合裡面的來源 2 (有 loss, acc, val_loss, val_acc 四種)&lt;/span&gt;
                         , y_label       &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# Y 軸標籤文字&lt;/span&gt;
                         ) :
    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 資料來源 1&lt;/span&gt;
    plot.plot( history.history[history_key1] )

    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 資料來源 2&lt;/span&gt;
    plot.plot( history.history[history_key2] )

    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 標題&lt;/span&gt;
    plot.title( &#39;train history&#39; )

    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# X 軸標籤文字&lt;/span&gt;
    plot.xlabel( &#39;epochs&#39; )

    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# Y 軸標籤文字&lt;/span&gt;
    plot.ylabel( y_label )

    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定圖例
    # (參數 1 為圖例說明, 有幾個資料來源, 就對應幾個圖例說明)
    # (參數 2 為圖例位置, upper 為上面, lower 為下面, left 為左邊, right 為右邊)&lt;/span&gt;
    plot.legend( [&#39;train&#39;, &#39;validate&#39;]
               , loc = &#39;upper left&#39;
               )

    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 顯示畫布&lt;/span&gt;
    plot.show()

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 顯示 train history 準確率圖表
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_history_graphic&lt;/span&gt;( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;history&lt;/span&gt;, &#39;acc&#39;, &#39;val_acc&#39;, &#39;accuracy&#39; )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出結果 (可以得知, 隨著訓練次數的增加, 準確率也越來越高) :&lt;/span&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8XNDNAsT9F0TS1woERrdwIwJykpkyXfIBvVE2oMM4qCFQ4zxXYQFacDAuPxzMITsOFFxlXBE2bCzk-lj7WpJgwlCG3oqF0V5QC-mG6FyC63thsMX7R-k3FCe-aefekkE-AOs4azO2C8Cf/s1600/006_1.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8XNDNAsT9F0TS1woERrdwIwJykpkyXfIBvVE2oMM4qCFQ4zxXYQFacDAuPxzMITsOFFxlXBE2bCzk-lj7WpJgwlCG3oqF0V5QC-mG6FyC63thsMX7R-k3FCe-aefekkE-AOs4azO2C8Cf/s1600/006_1.png&quot; data-original-width=&quot;395&quot; data-original-height=&quot;278&quot; /&gt;&lt;/a&gt;

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 顯示 train history 損失函數誤差值圖表
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;train_history_graphic&lt;/span&gt;( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;history&lt;/span&gt;, &#39;loss&#39;, &#39;val_loss&#39;, &#39;loss&#39; )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出結果 (可以得知, 隨著訓練次數的增加, 誤差值率也越來越低) :&lt;/span&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggzl2EQfqbr5QgBl6VXW4dgZPGBC-LALB9y0EtLy53ZLwqRJ0tEFboQsjpG8ghod5YHjgbnzYHJVbjMzEoEgYLUxFTDWjmGDYrhSuLZkBLPnflwsc4fziIET7aX6jETLAo-SPbrxgQLWAV/s1600/006_2.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggzl2EQfqbr5QgBl6VXW4dgZPGBC-LALB9y0EtLy53ZLwqRJ0tEFboQsjpG8ghod5YHjgbnzYHJVbjMzEoEgYLUxFTDWjmGDYrhSuLZkBLPnflwsc4fziIET7aX6jETLAo-SPbrxgQLWAV/s1600/006_2.png&quot; data-original-width=&quot;380&quot; data-original-height=&quot;278&quot; /&gt;&lt;/a&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;7）用【訓練好的 Model】拿【Mnist 測試資料】來評估【Model 準確率】&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# MLP 輸入層的每筆 Data 都是一維陣列
# 所以, 需將 Test Feature 所有圖片, 每個都轉換成一維陣列, 且其資料值型態為 float32
# RGB 顏色數值為 0~255, 除以 255, 讓顏色數值收斂到 0~1, 會讓後續模型預測時, 可以提高準確率
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature_vector&lt;/span&gt; = &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature&lt;/span&gt;.reshape( len(&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature&lt;/span&gt;), 28*28 ).astype(&#39;float32&#39;)
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature_vector&lt;/span&gt; /= 255

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# MLP 輸出層的每筆 Data 都是一維陣列
# 所以, 需將 Test Label 資料轉換為 One-Hot Encoding
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label_onehot&lt;/span&gt; = np_utils.to_categorical(&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label&lt;/span&gt;)

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 使用測試資料評估 Model 的【損失函數誤差值】與【準確率】
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;eval&lt;/span&gt; = model.evaluate( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature_vector&lt;/span&gt;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label_onehot&lt;/span&gt; )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 顯示 Model 評估測試資料的【損失函數誤差值】與【準確率】&lt;/span&gt;
print( &#39;loss =&#39;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;eval&lt;/span&gt;[0] )
print( &#39;accuracy =&#39;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;eval&lt;/span&gt;[1] )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出結果 (0.9757 準確率表示 10000 筆資料, 會對 9757 筆, 會錯 243 筆) :
loss = 0.35044183584242833
accuracy = 0.9757&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;8）用【訓練好的 Model】拿【Mnist 測試資料】進行【辨識數字圖片】&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 用【訓練好的 Model】進行【辨識數字圖片】
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;prediction&lt;/span&gt; = model.predict_classes( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature&lt;/span&gt; )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 顯示數字圖片全部的預測結果
# 顯示數字圖片第 340 ~ 360 筆的預測結果
####################&lt;/span&gt;
print( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;prediction&lt;/span&gt; )
print( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;prediction&lt;/span&gt;[340:360] )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出結果 :
[7 2 1 ... 4 5 6]
[3 6 1 3 8 1 0 5 1 3 1 5 5 6 1 8 5 1 7 9]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;9）預測結束後, 接下來試著找出預測錯誤的資料&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 透過 DataFrame 對照表清單, 來顯示 Label 真實數值, 與 AI 預設結果
####################&lt;/span&gt;
import pandas as pd

&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;checkList&lt;/span&gt; = pd.DataFrame( {&#39;label&#39;:&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label&lt;/span&gt;       &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# Column1 名稱: 欄位值集合 (這裡提供 Label 真實數值)&lt;/span&gt;
                          ,&#39;prediction&#39;:&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;prediction&lt;/span&gt;  &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# Column2 名稱: 欄位值集合 (這裡提供 AI 預測結果)&lt;/span&gt;
                          }
                        )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 顯示對照表前 10 筆結果&lt;/span&gt;
print( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;checkList&lt;/span&gt;[0:10] )
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkpHohtRuJ8C083b4G1jH55H4bmmN1baUqCQT2yDpZqrWDjOGcLFhaKg21CSWu7x-4I9q2CT73aoLoewMW6zpuP4nT3RyIXXeuFfaSJutLAlmx_02_T43UejlWPnyCa4rPpowHXKZAWOKe/s1600/101.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkpHohtRuJ8C083b4G1jH55H4bmmN1baUqCQT2yDpZqrWDjOGcLFhaKg21CSWu7x-4I9q2CT73aoLoewMW6zpuP4nT3RyIXXeuFfaSJutLAlmx_02_T43UejlWPnyCa4rPpowHXKZAWOKe/s1600/101.png&quot; data-original-width=&quot;244&quot; data-original-height=&quot;196&quot; /&gt;&lt;/a&gt;

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 列出對照表中, prediction 欄位值 不等於 label 欄位值的資料
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;checkList&lt;/span&gt;[ &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;checkList&lt;/span&gt;.prediction != &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;checkList&lt;/span&gt;.label ]
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEis6YsgAX1Ks28PZTKdA_J-TqzBP-zfAldgOg0TdEnVg_arEAxptmama2Yb0F0IVa8zTCY8dnfeOnBT0vOsJXiPEQeXTQmT9ok_GeE9kaArV0AaAgpeGBUPiMucAkB-YGvV2SFaKR0YeAAf/s1600/102_1.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEis6YsgAX1Ks28PZTKdA_J-TqzBP-zfAldgOg0TdEnVg_arEAxptmama2Yb0F0IVa8zTCY8dnfeOnBT0vOsJXiPEQeXTQmT9ok_GeE9kaArV0AaAgpeGBUPiMucAkB-YGvV2SFaKR0YeAAf/s1600/102_1.png&quot; data-original-width=&quot;230&quot; data-original-height=&quot;213&quot; /&gt;&lt;/a&gt;
.....
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1rs6CiV-hdgXFCaWpYEF95Y7XYR3pP7MjDPPfRFz2ajCl9HqKTtqp0mhIfShqgf-0aj1u-ZPYc1r0UBR2zyGcgG3nhGNWCACrNdbE7ewxwfTbBre77rHmgwDd7peVxoViacTxtT-aN22w/s1600/102_2.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1rs6CiV-hdgXFCaWpYEF95Y7XYR3pP7MjDPPfRFz2ajCl9HqKTtqp0mhIfShqgf-0aj1u-ZPYc1r0UBR2zyGcgG3nhGNWCACrNdbE7ewxwfTbBre77rHmgwDd7peVxoViacTxtT-aN22w/s1600/102_2.png&quot; data-original-width=&quot;230&quot; data-original-height=&quot;191&quot; /&gt;&lt;/a&gt;

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 定義函數, 用來顯示 Mnist 多筆影像, 真實數值, 與 AI 預設結果
####################&lt;/span&gt;
import matplotlib.pyplot as plot  &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# plot 可以視為畫布&lt;/span&gt;
import math

def &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;show_feature_label_prediction&lt;/span&gt;( features
                                 , labels
                                 , predictions
                                 , indexList  &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 資料集合中, 要顯示的索引陣列&lt;/span&gt;
                                 ) :
    # 要顯示的索引陣列長度
    num = len(indexList)

    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定畫布的寬（參數 1）與高（參數 2）&lt;/span&gt;
    plot.gcf().set_size_inches( 2*5, (2+0.4)*math.ceil(num/5) )

    loc = 0
    for i in indexList :

        &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 目前要在畫布上的哪個位置顯示 (從 1 開始)&lt;/span&gt;
        loc += 1

        &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 畫布區分為幾列（參數 1）, 幾欄（參數 2）, 目前在哪個位置（參數 3）&lt;/span&gt;
        subp = plot.subplot( math.ceil(num/5), 5, loc )

        &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 畫布上顯示圖案, 其中 cmap=binary 為顯示黑白圖案&lt;/span&gt;
        subp.imshow( features[i], cmap=&#39;binary&#39; )

        &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 設定標題內容
        # 有 AI 預測結果資料, 才在標題顯示預測結果&lt;/span&gt;
        if( len(predictions) &gt; 0 ) :
            title = &#39;ai = &#39; + str(predictions[i])
            title += (&#39; (o)&#39; if predictions[i]==labels[i] else &#39; (x)&#39;) &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 預測正確顯示(o), 錯誤顯示(x)&lt;/span&gt;
            title += &#39;\nlabel = &#39; + str(labels[i])
        &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 沒有 AI 預測結果資料, 則只在標題顯示真實數值&lt;/span&gt;
        else :
            title = &#39;label = &#39; + str(labels[i])

       &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 在畫布上顯示標題, 且字型大小為 12&lt;/span&gt;
        subp.set_title( title, fontsize=12 )

        &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# X, Y 軸不顯示刻度&lt;/span&gt;
        subp.set_xticks( [] )
        subp.set_yticks( [] )

    &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 顯示畫布&lt;/span&gt;
    plot.show()

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 從測試資料集第 0 位置, 顯示 10 個資料的圖片, 真實數值, 與預測結果
####################&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;show_feature_label_prediction&lt;/span&gt;( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature&lt;/span&gt;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label&lt;/span&gt;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;prediction&lt;/span&gt;, range(&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;10&lt;/span&gt;) )

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;# 輸出結果 :&lt;/span&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeptRLi2nryAlr78OAjsu1Mbmz5iOg_NR99iC0AQMVXbzW_KRZ1WchuEbQWIi70sy0-6co8Lfutf_pV2RTNVr9wAVXYMcD-C350dK0fVDNF8egvK6RXGq2ZlBVmWYlrJfuSop7JaFUNA0T/s1600/2018-03-18+19_01_40-008_1.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeptRLi2nryAlr78OAjsu1Mbmz5iOg_NR99iC0AQMVXbzW_KRZ1WchuEbQWIi70sy0-6co8Lfutf_pV2RTNVr9wAVXYMcD-C350dK0fVDNF8egvK6RXGq2ZlBVmWYlrJfuSop7JaFUNA0T/s1600/2018-03-18+19_01_40-008_1.jpg&quot; data-original-width=&quot;579&quot; data-original-height=&quot;287&quot; /&gt;&lt;/a&gt;

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 之前評估 Model 準確率為 0.9757, 也就是 10000 筆資料, 會對 9757 筆, 會錯 243 筆
# 將這些錯誤資料顯示出來, 看看是否為圖形太混亂不清楚, 從而了解 AI 為何會預測錯誤
# 另外, 可以藉由【&lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;提高訓練次數&lt;/span&gt;】或【&lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;增加隱藏層的神經元數&lt;/span&gt;】或【&lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;增加隱藏層&lt;/span&gt;】或【&lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;改變神經網路方式&lt;/span&gt;】, 來提升 AI 準確率
####################
# 顯示預測錯誤的前 20 筆資料&lt;/span&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;show_feature_label_prediction&lt;/span&gt;( &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_feature&lt;/span&gt;
                             , &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;test_label&lt;/span&gt;
                             , &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;prediction&lt;/span&gt;
                             , &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;checkList&lt;/span&gt;.index[&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;checkList&lt;/span&gt;.prediction != &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;checkList&lt;/span&gt;.label][0:20]
                             )
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFhMidEbt_I_lLFVu42U14Z-Vf_ltO_tyvj1MHbPuy2YSPyye5jdIS0NP0jER6W3CrVDRnWGxskh8og73LJEb6n15lqpD3yCmZaSIM2pWKGMl99OGhamWy6QCj_DuBhZd_Iyjvh9pzwNH9/s1600/103.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFhMidEbt_I_lLFVu42U14Z-Vf_ltO_tyvj1MHbPuy2YSPyye5jdIS0NP0jER6W3CrVDRnWGxskh8og73LJEb6n15lqpD3yCmZaSIM2pWKGMl99OGhamWy6QCj_DuBhZd_Iyjvh9pzwNH9/s1600/103.png&quot; data-original-width=&quot;570&quot; data-original-height=&quot;532&quot; /&gt;&lt;/a&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;10）將訓練好的 Model 模型儲存起來, 在日後可以直接載入使用, 而不用再重新訓練&lt;/div&gt;&lt;pre&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 將 Model 模型儲存成 HDF5 檔案, 路徑名稱為 D 槽下的 my_mnist_mlp_model.h5
# 檔案命名規則: 資料集名稱_神經網路名稱_model.h5
####################&lt;/span&gt;
model.save(&#39;d:/my_mnist_mlp_model.h5&#39;)

&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;####################
# 從 D 槽下的 my_mnist_mlp_model.h5 檔案, 載入 Model 模型
####################&lt;/span&gt;
from keras.models import load_model

model = load_model(&#39;d:/my_mnist_mlp_model.h5&#39;)
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
以上, 參考看看囉, 如有任何問題, 也歡迎一同一起研究 ^ ^
&lt;br&gt;
&lt;div class=&quot;hiddenCopyRight&quot;&gt;&lt;a href=&quot;https://tomkuo139.blogspot.com&quot;&gt;昭佑.天翔&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/4143179748570664713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/4143179748570664713'/><link rel='alternate' type='text/html' href='http://tomkuo139.blogspot.com/2018/03/ai.html' title='我的第一個 AI：利用「MLP 多層感知」針對「Mnist」資料集，訓練「辨識數字圖片」'/><author><name>昭佑天翔</name><uri>http://www.blogger.com/profile/11034567866105362217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw93XqNj6A6opM1_A-ZE0DYSdeh5YN6BjcCUB0whmxsYMgYaEx3MwIMqoOuZ6ALCPqlvsW-FZwy_koGL_dgxVDBO3eK_VEKK4IJwv6rjCDs6gIZRaP6b-o4RhXRLgq0wOrOQX0kUxiwLEl/s72-c/101.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7065255949366990244.post-4920843819041625365</id><published>2018-04-26T08:55:00.000+08:00</published><updated>2018-05-02T16:26:34.173+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="Anaconda"/><category scheme="http://www.blogger.com/atom/ns#" term="Keras"/><category scheme="http://www.blogger.com/atom/ns#" term="TensorFlow"/><title type='text'>透過 Anaconda 安裝 TensorFlow 與 Keras</title><content type='html'>&lt;br&gt;
在 Google 官網 &lt;a href=&quot;https://www.tensorflow.org/versions/master/install/&quot; target=&quot;_black&quot;&gt;https://www.tensorflow.org/versions/master/install/&lt;/a&gt; 中,&lt;br&gt;
&lt;br&gt;
有介紹如何安裝 TensorFlow,&lt;br&gt;
&lt;br&gt;
首先選擇您要在哪個 OS 安裝 TensorFlow, 官網截圖如下 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDrI326F7FuK-wVIX5XlVAj5OxdIstGyEa6NBrOuj97-AOpJ-KzTKc-eX-lNJ4mznfKmizEJNmbOtLVoxk64BIfUx9oxREDNbXEWaUf09WMxM5IToj00p8Xe7pC6sPwK9OH4lGEQLaQ1nH/s1600/001.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDrI326F7FuK-wVIX5XlVAj5OxdIstGyEa6NBrOuj97-AOpJ-KzTKc-eX-lNJ4mznfKmizEJNmbOtLVoxk64BIfUx9oxREDNbXEWaUf09WMxM5IToj00p8Xe7pC6sPwK9OH4lGEQLaQ1nH/s1600/001.png&quot; data-original-width=&quot;776&quot; data-original-height=&quot;189&quot; /&gt;&lt;/a&gt;
&lt;br&gt;
&lt;br&gt;
選擇好 OS 之後, 官網介紹兩種安裝 TensorFlow 方式, 如下 :&lt;br&gt;
● &quot;native&quot; pip&lt;br&gt;
● 透過 Anaconda&lt;br&gt;
&lt;br&gt;
因為 Anaconda 會幫您安裝一些 AI 常用的套件, 同時 Anaconda 可以建立多個虛擬環境, 對於有不同 Python 環境需求時, 是個非常好的解決方案,&lt;br&gt;
&lt;br&gt;
以下介紹如何透過 Anaconda 來安裝 TensorFlow, 參考步驟如下 :&lt;br&gt;
&lt;br&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
步驟一) 到 &lt;a href=&quot;https://www.anaconda.com/download/&quot; target=&quot;_blank&quot;&gt;Anaconda Download&lt;/a&gt; 下載安裝檔 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeswCEZ-4jq2pOP_GRBPwLi1j-NWUnYtenkV5XTMG1Ci53gRZKZfx5Feor_dQYUd9AhT19QPRIur3wR-iSKNrxCdyL3VQc3lH3hNvJj70R7TGxghNQgr22h4E0uTCUYS-fxMRmDQUxsMnm/s1600/002.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeswCEZ-4jq2pOP_GRBPwLi1j-NWUnYtenkV5XTMG1Ci53gRZKZfx5Feor_dQYUd9AhT19QPRIur3wR-iSKNrxCdyL3VQc3lH3hNvJj70R7TGxghNQgr22h4E0uTCUYS-fxMRmDQUxsMnm/s1600/002.png&quot; data-original-width=&quot;886&quot; data-original-height=&quot;322&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
步驟二) Anaconda 安裝過程中, 若遇到下面畫面, 則採用預設即可 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrqgYAxBnZ0qtygdHCwtgJF48KuX_rhiojD4FCUUy7U5ajCy6Y75ZHj8X9y5gfk_7VNtd0AcdFBAvKJTktidSvE1mqcC-ei_FYKzj15tSasQgAhXLntUA5TRQAr7-ppLLQOD-SPfHHiri3/s1600/003.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrqgYAxBnZ0qtygdHCwtgJF48KuX_rhiojD4FCUUy7U5ajCy6Y75ZHj8X9y5gfk_7VNtd0AcdFBAvKJTktidSvE1mqcC-ei_FYKzj15tSasQgAhXLntUA5TRQAr7-ppLLQOD-SPfHHiri3/s1600/003.png&quot; data-original-width=&quot;499&quot; data-original-height=&quot;388&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
之後, 若要手動加入到 Path, 參考如下畫面 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi12Bai07XIibA-8_BFoA9HHyXmZAhWRFjwTIuGuUfoese6Kgvg_YwYbehBPmkWVsAm0GboEJn_mCykCDFBR-Or9nvVm6GRx4G3hMZR_Mp8ze20lw2Cjs05i41XhRORCpigt0yqJ1LA6g48/s1600/004.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi12Bai07XIibA-8_BFoA9HHyXmZAhWRFjwTIuGuUfoese6Kgvg_YwYbehBPmkWVsAm0GboEJn_mCykCDFBR-Or9nvVm6GRx4G3hMZR_Mp8ze20lw2Cjs05i41XhRORCpigt0yqJ1LA6g48/s1600/004.png&quot; data-original-width=&quot;664&quot; data-original-height=&quot;221&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
步驟三) 安裝好 Anaconda 之後, 接著在 Anaconda 裡建立 Tensorflow 虛擬環境, 官網說明如下 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsr6B_5Lw8cwZ_mvtlOXOCwo3Ny2P5ce1sT2d7gk0TdW5yUk2UVOFfXUuXH6-ClQT60hj5gzC5ms_HktDeV15g7QK2-6yfhUzW1-Gyyex4DQU-YEZC89uH6ZkhF6aVOEqfu16uAg4PV-G_/s1600/005.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsr6B_5Lw8cwZ_mvtlOXOCwo3Ny2P5ce1sT2d7gk0TdW5yUk2UVOFfXUuXH6-ClQT60hj5gzC5ms_HktDeV15g7QK2-6yfhUzW1-Gyyex4DQU-YEZC89uH6ZkhF6aVOEqfu16uAg4PV-G_/s1600/005.png&quot; data-original-width=&quot;790&quot; data-original-height=&quot;569&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
指令的中文說明, 如下 :&lt;br&gt;
&lt;div class=&quot;noteBlock&quot;&gt;&lt;div class=&quot;noteBlockHeader&quot;&gt;&amp;nbsp;指令的中文說明&lt;/div&gt;&lt;pre&gt;
1) &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;conda create -n &lt;span style=&quot;color: rgb(153, 51, 153);&quot;&gt;envName&lt;/span&gt; python=&lt;span style=&quot;color: rgb(153, 51, 153);&quot;&gt;3.5&lt;/span&gt; [anaconda]&lt;/span&gt;: 建立 anaconda 虛擬環境, 且指定其名稱為 envName.

如: conda create -n tensorflow python=3.5 anaconda

create 指令: create -n 與 create --name 是相同的.

python 指令: 指定版本.

anaconda 指令: 額外安裝其他 python 套件, 若無加這指令, 需之後自行加裝.（沒加約 83M; 有加約 1.9G）（建議安裝）

在處理過程中, 會詢問 y/n, 則按 &quot;y&quot; 開始即可.

2) &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;activate &lt;span style=&quot;color: rgb(153, 51, 153);&quot;&gt;envName&lt;/span&gt;&lt;/span&gt;: 啟動 anaconda 某個虛擬環境.

   &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;deactivate&lt;/span&gt;: 關閉 anaconda 目前啟動的虛擬環境.

3) &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;pip install --ignore-installed --upgrade tensorflow&lt;/span&gt;: 在 anaconda 虛擬環境中, 安裝 Tensorflow. (約 250M)

4) &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;pip install --ignore-installed --upgrade keras&lt;/span&gt;: 在 anaconda 虛擬環境中, 安裝 Keras. (約 120M)

5) &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;conda env list&lt;/span&gt;: 列出 anaconda 所有虛擬環境.

6) &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;conda create -n &lt;span style=&quot;color: rgb(153, 51, 153);&quot;&gt;newEnvName&lt;/span&gt; --clone &lt;span style=&quot;color: rgb(153, 51, 153);&quot;&gt;oldEnvName&lt;/span&gt;&lt;/span&gt;: 複製 anaconda 某個虛擬環境.

7) &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;conda remove -n &lt;span style=&quot;color: rgb(153, 51, 153);&quot;&gt;envName&lt;/span&gt; --all&lt;/span&gt;: 移除 anaconda 某個虛擬環境.

anaconda 更多相關指令: &lt;a href=&quot;https://conda.io/docs/user-guide/tasks/manage-environments.html&quot; target=&quot;_blank&quot;&gt;https://conda.io/docs/user-guide/tasks/manage-environments.html&lt;/a&gt;&lt;br&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
步驟四) 驗證 Tensorflow 是否安裝成功, 執行以下程式碼, 若有顯示版本, 表示安裝成功 :&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;程式碼&lt;/div&gt;&lt;pre&gt;
import tensorflow as tf
tf.__version__
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
步驟五) 驗證 Keras 是否安裝成功, 執行以下程式碼, 若有顯示版本, 表示安裝成功 :&lt;br&gt;
&lt;div class=&quot;codeBlock&quot;&gt;&lt;div class=&quot;codeBlockHeader&quot;&gt;&amp;nbsp;程式碼&lt;/div&gt;&lt;pre&gt;
import keras as kr
kr.__version__
&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
這樣, 就可以開始您的 TensorFlow AI 的研究之旅囉 ^ ^&lt;br&gt;
&lt;br&gt;
&lt;div class=&quot;hiddenCopyRight&quot;&gt;&lt;a href=&quot;https://tomkuo139.blogspot.com&quot;&gt;昭佑.天翔&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/4920843819041625365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/4920843819041625365'/><link rel='alternate' type='text/html' href='http://tomkuo139.blogspot.com/2018/03/anaconda-tensorflow-keras.html' title='透過 Anaconda 安裝 TensorFlow 與 Keras'/><author><name>昭佑天翔</name><uri>http://www.blogger.com/profile/11034567866105362217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDrI326F7FuK-wVIX5XlVAj5OxdIstGyEa6NBrOuj97-AOpJ-KzTKc-eX-lNJ4mznfKmizEJNmbOtLVoxk64BIfUx9oxREDNbXEWaUf09WMxM5IToj00p8Xe7pC6sPwK9OH4lGEQLaQ1nH/s72-c/001.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7065255949366990244.post-651732213522112236</id><published>2018-04-03T16:48:00.001+08:00</published><updated>2018-04-03T16:48:50.642+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Firefox"/><category scheme="http://www.blogger.com/atom/ns#" term="Linux"/><title type='text'>Linux 的 Firefox Browser 介面中文化</title><content type='html'>Linux 內建的瀏覽器為 Firefox,&lt;br&gt;
&lt;br&gt;
但其介面一開始為英文介面,&lt;br&gt;
&lt;br&gt;
若要更換為中文介面,&lt;br&gt;
&lt;br&gt;
可以開啟【&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Terminal 終端機&lt;/span&gt;】, 輸入以下指令 :&lt;br&gt;
&lt;br&gt;
繁體中文: &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;sudo apt-get install firefox-locale-zh-han&lt;big&gt;t&lt;/big&gt;&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
簡體中文: &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;sudo apt-get install firefox-locale-zh-han&lt;big&gt;s&lt;/big&gt;&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
然後, 重新開啟 Firefox 即可.&lt;br&gt;
&lt;br&gt;
&lt;div class=&quot;hiddenCopyRight&quot;&gt;&lt;a href=&quot;https://tomkuo139.blogspot.com&quot;&gt;昭佑.天翔&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/651732213522112236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/651732213522112236'/><link rel='alternate' type='text/html' href='http://tomkuo139.blogspot.com/2018/04/linux-firefox-browser.html' title='Linux 的 Firefox Browser 介面中文化'/><author><name>昭佑天翔</name><uri>http://www.blogger.com/profile/11034567866105362217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7065255949366990244.post-6305144935570593541</id><published>2018-04-03T13:43:00.001+08:00</published><updated>2018-04-03T13:43:35.250+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Linux"/><category scheme="http://www.blogger.com/atom/ns#" term="MS Office"/><title type='text'>在 Linux 利用 WinE 安裝 MS Office</title><content type='html'>通常會想在 Linux 安裝 MS Office,&lt;br&gt;
&lt;br&gt;
無非就是 MS Office 檔案的排版在 LibreOffice 開啟後亂掉,&lt;br&gt;
&lt;br&gt;
而要安裝 MS Office 有幾種方式 :&lt;br&gt;
&lt;br&gt;
方式一) &lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;安裝 Linux 與 Windows 雙系統&lt;/span&gt;, 不過, 就為了 MS Office 而裝兩個 OS, 似乎太大費周章, 而且切換 OS 就要重新開機一次, 也挺麻煩的.&lt;br&gt;
&lt;br&gt;
方式二) &lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;在 Linux 安裝 VirtualBox 虛擬機, 然後在 VirtualBox 內安裝 Windows&lt;/span&gt;, 這樣就可以在 Windows 內安裝 MS Office, 不過因為虛擬機會瓜分掉電腦資源而影響效能, 所以前提是您的電腦效能要夠好.&lt;br&gt;
&lt;br&gt;
方式三) &lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;在 Linux 安裝 Wine, 透過 Wine 直接安裝 MS Office&lt;/span&gt;, 直接在 Linux 執行 MS Office, 這是目前最好也是最有效率的解決方式.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
所以, 以下將介紹在 Linux Mint 安裝 MS Office, 參考步驟如下 :&lt;br&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;br&gt;
1) 到「&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;管理 &amp;gt; 軟體管理員&lt;/span&gt;」搜尋 wine, 然後安裝【&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Wine&lt;/span&gt;】與【&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Wine-mono&lt;/span&gt;】兩個軟體.&lt;br&gt;
&lt;br&gt;
2) MS Office【&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Setup.exe&lt;/span&gt;】按右鍵, 選擇【&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;WinE Windows Program Loader&lt;/span&gt;】來開啟,&lt;br&gt;
&lt;br&gt;
若執行有問題, WinE 會自動針對問題點, 詢問是否安裝某套件軟體, 來解決相關問題, 只要點擊 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Yes&lt;/span&gt;&quot; 即可,&lt;br&gt;
&lt;br&gt;
例如步驟 1 若沒有安裝 Wine-mono, 則執行 Setup.exe 過程中有問題, 就會詢問是否安裝 Wine-mono.&lt;br&gt;
&lt;br&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;（這節省了找尋問題與如何解決的時間與精力, 太讚了 ^_^）&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
3) MS Office Setup.exe 安裝成功後, 執行 Word, Excel 看看是否可以編輯與儲存, 若可以, 則其他小問題可以忽略不計.&lt;br&gt;
&lt;br&gt;
開啟 Word 範例圖, 如下：&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRAM_XeUSl4HNDwU5wrjaroqJtU2pM3kWD69xWf_9Wr292iuvOMQ9BkxlboH2H0aEVz7UhK-nekdAp6s6rqnUSGGFlwxIhooRu_oM1eR9d4zPYnNMRqHpiTko3hyuEROz5YAovheYMPm0e/s1600/001.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRAM_XeUSl4HNDwU5wrjaroqJtU2pM3kWD69xWf_9Wr292iuvOMQ9BkxlboH2H0aEVz7UhK-nekdAp6s6rqnUSGGFlwxIhooRu_oM1eR9d4zPYnNMRqHpiTko3hyuEROz5YAovheYMPm0e/s1600/001.png&quot; data-original-width=&quot;1000&quot; data-original-height=&quot;625&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;div class=&quot;hiddenCopyRight&quot;&gt;&lt;a href=&quot;https://tomkuo139.blogspot.com&quot;&gt;昭佑.天翔&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/6305144935570593541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/6305144935570593541'/><link rel='alternate' type='text/html' href='http://tomkuo139.blogspot.com/2018/04/linux-wine-ms-office.html' title='在 Linux 利用 WinE 安裝 MS Office'/><author><name>昭佑天翔</name><uri>http://www.blogger.com/profile/11034567866105362217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRAM_XeUSl4HNDwU5wrjaroqJtU2pM3kWD69xWf_9Wr292iuvOMQ9BkxlboH2H0aEVz7UhK-nekdAp6s6rqnUSGGFlwxIhooRu_oM1eR9d4zPYnNMRqHpiTko3hyuEROz5YAovheYMPm0e/s72-c/001.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7065255949366990244.post-803915429367708969</id><published>2018-02-11T16:16:00.000+08:00</published><updated>2018-02-11T16:16:17.736+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><title type='text'>手機透過 FTP 無線連線到 Android 手機存取檔案</title><content type='html'>&lt;br&gt;
當您想到將 Android 手機上的檔案, 複製到其他手機,&lt;br&gt;
&lt;br&gt;
除了透過上傳到雲端（缺點：還要多一個中介端）, 或 Bluetooth 藍芽直接點對點連線（缺點：傳輸速度慢）之外,&lt;br&gt;
&lt;br&gt;
目前無線連接方式, 我常用的就是 FTP 連線（傳輸速度快）,&lt;br&gt;
&lt;br&gt;
這篇文章, 就是介紹手機如何透過 FTP 無線連接到另一台手機, 進行檔案的存取,&lt;br&gt;
&lt;br&gt;
參考方式, 如下 :&lt;br&gt;
&lt;br&gt;
1) 首先, 手機要先安裝 &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.alphainventor.filemanager&quot;&gt;File Manager +&lt;/a&gt; 這個 App,&lt;br&gt;
&lt;br&gt;
它除了是檔案管理員之外, 也可以是音樂播放器, 還可以將 App 匯出成 APK, 另外雲端連線、電腦連線都有支援,&lt;br&gt;
&lt;br&gt;
相當非常好用.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
2) 手機與電腦需連線到同一個行動網路, 若您手機有行動網路, 則開啟 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;無線基地台&lt;/span&gt;&quot;, 然後其他手機連線到這個 WiFi.&lt;br&gt;
&lt;br&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;br&gt;
3) 開啟 File Manager + 這個 App, 然後點選 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;從電腦存取&lt;/span&gt;&quot; &lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;（其實就是把手機做為 FTP Server）&lt;/span&gt; :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQF7PGofwONMKjdQ3Hk9edMVzl-YcRE7gr2FzI7GYZBcakTl893rzTyey2RQTjV5UVK5ZRPUWAs_2NvmVgL22z-909JmF4ADL3mESh6j2o0n2ksuR6LAGykMjGsA8ubWAOXPjuAgCP3AgJ/s1600/001.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQF7PGofwONMKjdQ3Hk9edMVzl-YcRE7gr2FzI7GYZBcakTl893rzTyey2RQTjV5UVK5ZRPUWAs_2NvmVgL22z-909JmF4ADL3mESh6j2o0n2ksuR6LAGykMjGsA8ubWAOXPjuAgCP3AgJ/s1600/001.jpg&quot; data-original-width=&quot;320&quot; data-original-height=&quot;569&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
按一下 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;開始&lt;/span&gt;&quot; 即可 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTJIAdQIEWeG0FWO1RAWhTy4tlNp2KY59oOUDQyTBHr5asVmshUqcXicxIwwYelmtodE_mNFznqs-bHXLmVlNOXjKW1Cg4GtyL4Uw6VGqOf-dWho39qOo7OmUnNqXUVDvXSP1YK-fBt0vY/s1600/002.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTJIAdQIEWeG0FWO1RAWhTy4tlNp2KY59oOUDQyTBHr5asVmshUqcXicxIwwYelmtodE_mNFznqs-bHXLmVlNOXjKW1Cg4GtyL4Uw6VGqOf-dWho39qOo7OmUnNqXUVDvXSP1YK-fBt0vY/s1600/002.jpg&quot; data-original-width=&quot;320&quot; data-original-height=&quot;569&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
這時會看到一組 &lt;span style=&quot;color: rgb(51, 51, 255); font-weight: bold;&quot;&gt;ftp  網路位置&lt;/span&gt;, 您可以在 Browser 或檔案總管, 輸入這個位置 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizkSo7ozOkebZkGGJE2kHwxy9y-T8YrjkuzYWy4_LMSwdcTZeIguLCpNh-j-pzgfjM9eCZJaaJNiP62e7Wh66EfWBfkMZDQMXCSsMuiCcWAg7wpx2oTcRN9s4GdyeiV0i-wzJ8M12Q7izL/s1600/003.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizkSo7ozOkebZkGGJE2kHwxy9y-T8YrjkuzYWy4_LMSwdcTZeIguLCpNh-j-pzgfjM9eCZJaaJNiP62e7Wh66EfWBfkMZDQMXCSsMuiCcWAg7wpx2oTcRN9s4GdyeiV0i-wzJ8M12Q7izL/s1600/003.jpg&quot; data-original-width=&quot;320&quot; data-original-height=&quot;569&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
4) 在其他手機中, 開啟有支援 FTP 的 app（如: File Manager +）, 點選 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;遠端&lt;/span&gt;&quot; :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDq15rf4TNaqnn-avI9F0AO-eFpFvead6v0uVm1gTt9wKVmP1ujkYj1vhjDqqKf523ZdkjZK4yHQ0FCu8ekDEywdqbK8aOZMvwOjrOraoJlcN2fB1ChUfn5HddAJFCEhdZkHHZ3qVmkPiU/s1600/101.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDq15rf4TNaqnn-avI9F0AO-eFpFvead6v0uVm1gTt9wKVmP1ujkYj1vhjDqqKf523ZdkjZK4yHQ0FCu8ekDEywdqbK8aOZMvwOjrOraoJlcN2fB1ChUfn5HddAJFCEhdZkHHZ3qVmkPiU/s400/101.png&quot; width=&quot;225&quot; height=&quot;400&quot; data-original-width=&quot;320&quot; data-original-height=&quot;569&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
點選 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;新增遠端位置&lt;/span&gt;&quot;, 然後再點選 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;FTP&lt;/span&gt;&quot; :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdjrzxjg1R-fDTXD8cfbmx-yYL7uNzQkMeFyx8PBjDEQWf9DCVGg925vCznqFJkfxAmFWHjIBCdCYuJPe6GD5xqha5A9InKxvttjWQ1-l-fyoWZre0FABIvn0rLZnJzQ6ReI2R7GTqwpOv/s1600/102.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdjrzxjg1R-fDTXD8cfbmx-yYL7uNzQkMeFyx8PBjDEQWf9DCVGg925vCznqFJkfxAmFWHjIBCdCYuJPe6GD5xqha5A9InKxvttjWQ1-l-fyoWZre0FABIvn0rLZnJzQ6ReI2R7GTqwpOv/s400/102.png&quot; width=&quot;225&quot; height=&quot;400&quot; data-original-width=&quot;320&quot; data-original-height=&quot;569&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
輸入 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;ftp  位置&lt;/span&gt;, &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;連接埠&lt;/span&gt;, 勾選 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;匿名&lt;/span&gt;&quot;, 然後按 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;確定&lt;/span&gt;&quot; 即可連線 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNflRiPceLZhJuJ23a21V2st8tBwobOi9u5rdlluH2cfqma19KC_upe_9kLdbTxpkMFXlOx4Tq-qGN8wajuPDcshSYMNPrm5kHBN1dLDR_8tnYJNjlwo2g1L9WQHXOCdPcdRDP-3u9wRc5/s1600/103.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNflRiPceLZhJuJ23a21V2st8tBwobOi9u5rdlluH2cfqma19KC_upe_9kLdbTxpkMFXlOx4Tq-qGN8wajuPDcshSYMNPrm5kHBN1dLDR_8tnYJNjlwo2g1L9WQHXOCdPcdRDP-3u9wRc5/s400/103.png&quot; width=&quot;225&quot; height=&quot;400&quot; data-original-width=&quot;320&quot; data-original-height=&quot;569&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
這時候, 就可以看到另一台手機的資料夾與檔案了 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyPXDXJj9UYiCJJNOB54r8WGVzhNWX2xGHYVHwL8UqWkMX_NVq-peNqwPLLa52t3drfAeJo3rXylmy71luTgbV58KCQ8CqWNaYxanLYXzJjCQysiiQ5rCF27J_9Up5Oa3OkyiStDv2CJd7/s1600/104.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyPXDXJj9UYiCJJNOB54r8WGVzhNWX2xGHYVHwL8UqWkMX_NVq-peNqwPLLa52t3drfAeJo3rXylmy71luTgbV58KCQ8CqWNaYxanLYXzJjCQysiiQ5rCF27J_9Up5Oa3OkyiStDv2CJd7/s400/104.png&quot; width=&quot;225&quot; height=&quot;400&quot; data-original-width=&quot;320&quot; data-original-height=&quot;569&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
5) 若要結束 ftp 連線, 則在手機的 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;File Manager +&lt;/span&gt; app 按 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;停止服務&lt;/span&gt;&quot;  即可 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ8XSJx7XkYR1nOOXmRGMIYUV3WT0JVAH5Ez4wm2Vp8Zu0Ih683Dgmta2O14Xcmt_zj0HZT9i9CHHm09Q_PrqDM2v1ZWoOMv7-anHLtyJoft3cbIoj0R-F2HW8GM4w6kgwCozANvCJfJzh/s1600/201.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ8XSJx7XkYR1nOOXmRGMIYUV3WT0JVAH5Ez4wm2Vp8Zu0Ih683Dgmta2O14Xcmt_zj0HZT9i9CHHm09Q_PrqDM2v1ZWoOMv7-anHLtyJoft3cbIoj0R-F2HW8GM4w6kgwCozANvCJfJzh/s1600/201.jpg&quot; data-original-width=&quot;320&quot; data-original-height=&quot;569&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
以上, 相當方便哦.&lt;br&gt;
&lt;br&gt;
&lt;div class=&quot;hiddenCopyRight&quot;&gt;&lt;a href=&quot;https://tomkuo139.blogspot.com&quot;&gt;昭佑.天翔&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/803915429367708969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/803915429367708969'/><link rel='alternate' type='text/html' href='http://tomkuo139.blogspot.com/2018/02/ftp-android_11.html' title='手機透過 FTP 無線連線到 Android 手機存取檔案'/><author><name>昭佑天翔</name><uri>http://www.blogger.com/profile/11034567866105362217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQF7PGofwONMKjdQ3Hk9edMVzl-YcRE7gr2FzI7GYZBcakTl893rzTyey2RQTjV5UVK5ZRPUWAs_2NvmVgL22z-909JmF4ADL3mESh6j2o0n2ksuR6LAGykMjGsA8ubWAOXPjuAgCP3AgJ/s72-c/001.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7065255949366990244.post-2087461834694822724</id><published>2018-02-11T08:54:00.000+08:00</published><updated>2018-02-11T08:54:10.818+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><title type='text'>電腦透過 USB 連接到 Android 手機，但在手機看得到的資料夾與檔案，卻在電腦看不到</title><content type='html'>&lt;br&gt;
在 Android&amp;nbsp;手機透過 USB&amp;nbsp;連接線連到電腦上,&lt;br&gt;
&lt;br&gt;
因為是&lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;透過 &quot;MTP&amp;nbsp;協定&quot; 進行檔案傳輸&lt;/span&gt;,&lt;br&gt;
&lt;br&gt;
這基本上就有一個問題,&lt;br&gt;
&lt;br&gt;
&lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;電腦看到的資料夾與檔案,&amp;nbsp;是手機上暫存區的資料夾與檔案&lt;/span&gt;,&lt;br&gt;
&lt;br&gt;
您若在手機上新增的資料夾或檔案,&amp;nbsp;將不會在電腦上同步顯示,&amp;nbsp;如下圖 :&lt;br&gt;
（電腦顯示）&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt4TVpr2-q6hkKqOaL2mSAjFcbK6c1JKjf-p9i3fNIsbYGSZ-nCNBk1eazS2whvOgorcqnR3SlCDWOg1_YpNU5rEs8w7j6qqYLVfnCe0W4LKEAjmms6jsAAueQcINA7ikFxuG3P7RHIs65/s1600/a02.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt4TVpr2-q6hkKqOaL2mSAjFcbK6c1JKjf-p9i3fNIsbYGSZ-nCNBk1eazS2whvOgorcqnR3SlCDWOg1_YpNU5rEs8w7j6qqYLVfnCe0W4LKEAjmms6jsAAueQcINA7ikFxuG3P7RHIs65/s1600/a02.png&quot; data-original-width=&quot;463&quot; data-original-height=&quot;155&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
（手機顯示）（電腦沒有顯示紅框線的資料夾與檔案）&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilrk2eI1yoKHXmbQYjGG9_1xFGIubwdL_dtICFq4XgxHq1MiS2sTdPR5VlPhxDaZR7ek6WImkWK2x0ImeLq91sTOmHZkFa_hCsBSUuWc68qTCUncbz8pP8W0p7Wt6rGkIBHal5lrILBObs/s1600/a01.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilrk2eI1yoKHXmbQYjGG9_1xFGIubwdL_dtICFq4XgxHq1MiS2sTdPR5VlPhxDaZR7ek6WImkWK2x0ImeLq91sTOmHZkFa_hCsBSUuWc68qTCUncbz8pP8W0p7Wt6rGkIBHal5lrILBObs/s1600/a01.jpg&quot; data-original-width=&quot;320&quot; data-original-height=&quot;569&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
目前的解決方案有四種 :&lt;br&gt;
&lt;br&gt;
方案一) 一般人常用的方式, 就是 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;USB&amp;nbsp;連接線拔掉, &amp;nbsp;然後重新接上&lt;/span&gt;,&amp;nbsp;看看電腦是否已有同步更新,&amp;nbsp;不過&lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;這方式不是對所有手機都有效&lt;/span&gt;.&lt;br&gt;
&lt;br&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
方案二) 方案一不行, 則透過 &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.alphainventor.filemanager&quot;&gt;File Manager +&lt;/a&gt; app,&amp;nbsp;點選&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;右上角按鈕&lt;/span&gt;, 再點擊 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;更新&lt;/span&gt;&quot;, 回到電腦,&amp;nbsp;重新整理目錄即可&lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;（但只限影片、音樂、圖片這類型檔案,&amp;nbsp;且有時未必有效）&lt;/span&gt; :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihC-SmyWju51Z0Vhrgc_I0lp24nB_K-EDRHMzrZu-GqBm9A_UZZmCmU12W1qz1GkaBQGSY1T2AekcGXjdLrTSx1jdw2mnoa6ABfB_JWL6rIgEF3RNeHVbRry637tlQCYWcNiS6Ny9zgeFQ/s1600/a03.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihC-SmyWju51Z0Vhrgc_I0lp24nB_K-EDRHMzrZu-GqBm9A_UZZmCmU12W1qz1GkaBQGSY1T2AekcGXjdLrTSx1jdw2mnoa6ABfB_JWL6rIgEF3RNeHVbRry637tlQCYWcNiS6Ny9zgeFQ/s1600/a03.jpg&quot; data-original-width=&quot;320&quot; data-original-height=&quot;260&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
方案三) 方案二不行, 則採用 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;ftp 無線連接&lt;/span&gt;來存取, 相關步驟, 請參考我的這篇文章: &lt;a href=&quot;http://tomkuo139.blogspot.com/2018/02/ftp-android.html&quot;&gt;點選此處&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
方案四) &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;手機重新開機&lt;/span&gt;, 但這種方法實在是有夠費時又令人生氣的（如果您趕時間的話）.&lt;br&gt;
&lt;br&gt;
以上,&amp;nbsp;到目前為止,&amp;nbsp;我都是用方案三來解決這問題的,&amp;nbsp;相當有用哦.&lt;br&gt;
&lt;br&gt;
&lt;div class=&quot;hiddenCopyRight&quot;&gt;&lt;a href=&quot;https://tomkuo139.blogspot.com&quot;&gt;昭佑.天翔&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/2087461834694822724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/2087461834694822724'/><link rel='alternate' type='text/html' href='http://tomkuo139.blogspot.com/2018/02/usb-android.html' title='電腦透過 USB 連接到 Android 手機，但在手機看得到的資料夾與檔案，卻在電腦看不到'/><author><name>昭佑天翔</name><uri>http://www.blogger.com/profile/11034567866105362217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt4TVpr2-q6hkKqOaL2mSAjFcbK6c1JKjf-p9i3fNIsbYGSZ-nCNBk1eazS2whvOgorcqnR3SlCDWOg1_YpNU5rEs8w7j6qqYLVfnCe0W4LKEAjmms6jsAAueQcINA7ikFxuG3P7RHIs65/s72-c/a02.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7065255949366990244.post-3936289873443287613</id><published>2018-02-11T08:50:00.000+08:00</published><updated>2018-02-11T16:16:49.786+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><title type='text'>電腦透過 FTP 無線連線到 Android 手機存取檔案</title><content type='html'>&lt;br&gt;
當您想到將 Android&amp;nbsp;手機上的檔案,&amp;nbsp;複製到電腦,&lt;br&gt;
&lt;br&gt;
除了透過 USB 連接線將手機與電腦連線之外,&lt;br&gt;
&lt;br&gt;
若手邊剛好沒有 USB&amp;nbsp;連接線,&amp;nbsp;這時候可以透過無線連接方式,&lt;br&gt;
&lt;br&gt;
無線連接方式,&amp;nbsp;目前我常用的就是藍芽連線（傳輸速度慢）,&amp;nbsp;或者 FTP&amp;nbsp;連線（傳輸速度快）,&lt;br&gt;
&lt;br&gt;
這篇文章,&amp;nbsp;就是介紹電腦如何透過 FTP&amp;nbsp;無線連接手機,&amp;nbsp;進行檔案的存取,&lt;br&gt;
&lt;br&gt;
參考方式,&amp;nbsp;如下 :&lt;br&gt;
&lt;br&gt;
1)&amp;nbsp;首先,&amp;nbsp;手機要先安裝 &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.alphainventor.filemanager&quot;&gt;File Manager +&lt;/a&gt;&amp;nbsp;這個 App,&lt;br&gt;
&lt;br&gt;
它除了是檔案管理員之外,&amp;nbsp;也可以是音樂播放器,&amp;nbsp;還可以將 App&amp;nbsp;匯出成 APK,&amp;nbsp;另外雲端連線、電腦連線都有支援,&lt;br&gt;
&lt;br&gt;
相當非常好用.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
2)&amp;nbsp;手機與電腦需連線到同一個行動網路, 若您手機有行動網路, 則開啟 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;無線基地台&lt;/span&gt;&quot;, 然後電腦連線到這個 WiFi.&lt;br&gt;
&lt;br&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;br&gt;
3)&amp;nbsp;開啟 File Manager +&amp;nbsp;這個 App,&amp;nbsp;然後點選 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;從電腦存取&lt;/span&gt;&quot; &lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;（其實就是把手機做為 FTP Server）&lt;/span&gt; :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQF7PGofwONMKjdQ3Hk9edMVzl-YcRE7gr2FzI7GYZBcakTl893rzTyey2RQTjV5UVK5ZRPUWAs_2NvmVgL22z-909JmF4ADL3mESh6j2o0n2ksuR6LAGykMjGsA8ubWAOXPjuAgCP3AgJ/s1600/001.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQF7PGofwONMKjdQ3Hk9edMVzl-YcRE7gr2FzI7GYZBcakTl893rzTyey2RQTjV5UVK5ZRPUWAs_2NvmVgL22z-909JmF4ADL3mESh6j2o0n2ksuR6LAGykMjGsA8ubWAOXPjuAgCP3AgJ/s1600/001.jpg&quot; data-original-width=&quot;320&quot; data-original-height=&quot;569&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
按一下 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;開始&lt;/span&gt;&quot; 即可 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTJIAdQIEWeG0FWO1RAWhTy4tlNp2KY59oOUDQyTBHr5asVmshUqcXicxIwwYelmtodE_mNFznqs-bHXLmVlNOXjKW1Cg4GtyL4Uw6VGqOf-dWho39qOo7OmUnNqXUVDvXSP1YK-fBt0vY/s1600/002.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTJIAdQIEWeG0FWO1RAWhTy4tlNp2KY59oOUDQyTBHr5asVmshUqcXicxIwwYelmtodE_mNFznqs-bHXLmVlNOXjKW1Cg4GtyL4Uw6VGqOf-dWho39qOo7OmUnNqXUVDvXSP1YK-fBt0vY/s1600/002.jpg&quot; data-original-width=&quot;320&quot; data-original-height=&quot;569&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
這時會看到一組 &lt;span style=&quot;color: rgb(51, 51, 255); font-weight: bold;&quot;&gt;ftp&amp;nbsp; 網路位置&lt;/span&gt;,&amp;nbsp;您可以在 Browser&amp;nbsp;或檔案總管,&amp;nbsp;輸入這個位置 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizkSo7ozOkebZkGGJE2kHwxy9y-T8YrjkuzYWy4_LMSwdcTZeIguLCpNh-j-pzgfjM9eCZJaaJNiP62e7Wh66EfWBfkMZDQMXCSsMuiCcWAg7wpx2oTcRN9s4GdyeiV0i-wzJ8M12Q7izL/s1600/003.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizkSo7ozOkebZkGGJE2kHwxy9y-T8YrjkuzYWy4_LMSwdcTZeIguLCpNh-j-pzgfjM9eCZJaaJNiP62e7Wh66EfWBfkMZDQMXCSsMuiCcWAg7wpx2oTcRN9s4GdyeiV0i-wzJ8M12Q7izL/s1600/003.jpg&quot; data-original-width=&quot;320&quot; data-original-height=&quot;569&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
4) 因為在檔案總管可以一次存取多個檔案,&amp;nbsp;而 Browser&amp;nbsp;只能一次存取一個檔案,&amp;nbsp;所以在 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;檔案總管&lt;/span&gt;&quot; 按右鍵,&amp;nbsp;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;新增一個網路位置&lt;/span&gt; :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjRUsS2n2-rrqy5JVICFatH40GgL4AOJdkzEcSa7PH-OMAqLt-d70UUdVRK9slf15x2Gfun4y6dxG04NoXPrLqQ7DNx3GPBASbafju6Y-nxO0UKR979C9vY3ArB-9mahex2fEc-XXWN5-m/s1600/101.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjRUsS2n2-rrqy5JVICFatH40GgL4AOJdkzEcSa7PH-OMAqLt-d70UUdVRK9slf15x2Gfun4y6dxG04NoXPrLqQ7DNx3GPBASbafju6Y-nxO0UKR979C9vY3ArB-9mahex2fEc-XXWN5-m/s1600/101.png&quot; data-original-width=&quot;251&quot; data-original-height=&quot;286&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
輸入上一步驟得到的 ftp&amp;nbsp;網路位置 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYjFLmtKSCFBOC2TK3QopMO1DgW6ZfuFJFOxNJmYHvEBnLzCEt0GrS0ka-8JdlAsazzm_Nwn2eSjoW_dE_P4Zp7ENi6Aw7TROxyJz0Qlu08YJ5izxlvgmHIYL3TCenwVNOW3a09XqBnfdb/s1600/102.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYjFLmtKSCFBOC2TK3QopMO1DgW6ZfuFJFOxNJmYHvEBnLzCEt0GrS0ka-8JdlAsazzm_Nwn2eSjoW_dE_P4Zp7ENi6Aw7TROxyJz0Qlu08YJ5izxlvgmHIYL3TCenwVNOW3a09XqBnfdb/s1600/102.png&quot; data-original-width=&quot;467&quot; data-original-height=&quot;292&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
勾選 &quot;匿名登入&quot; :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4ogKDvaSsO7MVGjlqD_LLde1bUhfuw9SSdTvbQqlan_7b5ztiqDU130FjaXhBNAGFjiTf_zzxMv83X2vXYJSmJHTyctHiQ4Uq0CV5Y97N-5dhDlXtENh4Y-LEFGDsvhjRcesfMSSlOdzd/s1600/103.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4ogKDvaSsO7MVGjlqD_LLde1bUhfuw9SSdTvbQqlan_7b5ztiqDU130FjaXhBNAGFjiTf_zzxMv83X2vXYJSmJHTyctHiQ4Uq0CV5Y97N-5dhDlXtENh4Y-LEFGDsvhjRcesfMSSlOdzd/s1600/103.png&quot; data-original-width=&quot;546&quot; data-original-height=&quot;266&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
若這個網路位置是您常用的,&amp;nbsp;建議輸入一個清楚易記的名稱 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-fiFQcj5QiJq2V3rSGYj_PZ6bikxKAATIaGxiGjoOkoJAtahWUHppo0F-S1InyfbWiiHQFOTj0VCOBMcjAFFUhELHO5-eOjZWGaLhxyGyzBc7XgvOMWQHAbUJSGHe1V43yLrECMh6E3Hg/s1600/104.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-fiFQcj5QiJq2V3rSGYj_PZ6bikxKAATIaGxiGjoOkoJAtahWUHppo0F-S1InyfbWiiHQFOTj0VCOBMcjAFFUhELHO5-eOjZWGaLhxyGyzBc7XgvOMWQHAbUJSGHe1V43yLrECMh6E3Hg/s1600/104.png&quot; data-original-width=&quot;386&quot; data-original-height=&quot;315&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&amp;nbsp;最後,&amp;nbsp;按 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;完成&lt;/span&gt;&quot; 即可連線 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgDXfqQEm2YcsD7IWzjl3FTrW2LvTq3jEEFLhuNdjmKXVmCVAB8ZbZXb2HOxCLSKn2YBUnESNeaz426wpUrMmjDpJe1uRiK8ccC1-bhlRTJYw9cOYZycXV6rx4gbCLvutdfqRKlo5aLJUY/s1600/105.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgDXfqQEm2YcsD7IWzjl3FTrW2LvTq3jEEFLhuNdjmKXVmCVAB8ZbZXb2HOxCLSKn2YBUnESNeaz426wpUrMmjDpJe1uRiK8ccC1-bhlRTJYw9cOYZycXV6rx4gbCLvutdfqRKlo5aLJUY/s1600/105.png&quot; data-original-width=&quot;594&quot; data-original-height=&quot;367&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
5)&amp;nbsp;這時候,&amp;nbsp;就可以在 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;檔案總管&lt;/span&gt;&quot; 看到手機的目錄了,&amp;nbsp;若發生內容沒有同步,&amp;nbsp;則按 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;重新整理&lt;/span&gt;&quot;&amp;nbsp;即可 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhq3Nqa8hOV9VcU3wgbNq6S8Mrq2_331Lb6u6cr7zayX7b__Wcn3va9ZNGvTz3EWZgDIeol_Q1lyArIRLnydika4OAovHZuaERt4iioIsbzMGWPuFDvc8i5OVyZH_GfPpCv9EZQ0YtniNEe/s1600/106.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhq3Nqa8hOV9VcU3wgbNq6S8Mrq2_331Lb6u6cr7zayX7b__Wcn3va9ZNGvTz3EWZgDIeol_Q1lyArIRLnydika4OAovHZuaERt4iioIsbzMGWPuFDvc8i5OVyZH_GfPpCv9EZQ0YtniNEe/s1600/106.png&quot; data-original-width=&quot;645&quot; data-original-height=&quot;158&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
6)&amp;nbsp;若要結束 ftp 連線,&amp;nbsp;則在手機的 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;File Manager +&lt;/span&gt; app 按 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;停止服務&lt;/span&gt;&quot;&amp;nbsp; 即可 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ8XSJx7XkYR1nOOXmRGMIYUV3WT0JVAH5Ez4wm2Vp8Zu0Ih683Dgmta2O14Xcmt_zj0HZT9i9CHHm09Q_PrqDM2v1ZWoOMv7-anHLtyJoft3cbIoj0R-F2HW8GM4w6kgwCozANvCJfJzh/s1600/201.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ8XSJx7XkYR1nOOXmRGMIYUV3WT0JVAH5Ez4wm2Vp8Zu0Ih683Dgmta2O14Xcmt_zj0HZT9i9CHHm09Q_PrqDM2v1ZWoOMv7-anHLtyJoft3cbIoj0R-F2HW8GM4w6kgwCozANvCJfJzh/s1600/201.jpg&quot; data-original-width=&quot;320&quot; data-original-height=&quot;569&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
以上,&amp;nbsp;只有第一次步驟就多,&amp;nbsp;往後就進行 ftp&amp;nbsp;連線,&amp;nbsp;只需步驟 2&amp;nbsp;與&amp;nbsp;步驟 3,&lt;br&gt;
&lt;br&gt;
然後就可以直接在檔案總管開啟已儲存的 ftp&amp;nbsp;連線位置即可,&amp;nbsp;相當方便哦.&lt;br&gt;
&lt;br&gt;
&lt;div class=&quot;hiddenCopyRight&quot;&gt;&lt;a href=&quot;https://tomkuo139.blogspot.com&quot;&gt;昭佑.天翔&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/3936289873443287613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/3936289873443287613'/><link rel='alternate' type='text/html' href='http://tomkuo139.blogspot.com/2018/02/ftp-android.html' title='電腦透過 FTP 無線連線到 Android 手機存取檔案'/><author><name>昭佑天翔</name><uri>http://www.blogger.com/profile/11034567866105362217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQF7PGofwONMKjdQ3Hk9edMVzl-YcRE7gr2FzI7GYZBcakTl893rzTyey2RQTjV5UVK5ZRPUWAs_2NvmVgL22z-909JmF4ADL3mESh6j2o0n2ksuR6LAGykMjGsA8ubWAOXPjuAgCP3AgJ/s72-c/001.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7065255949366990244.post-2445652814774701412</id><published>2017-12-14T13:47:00.001+08:00</published><updated>2017-12-14T13:47:32.915+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><title type='text'>Android Studio (base on IntelliJ IDEA) 自訂程式風格</title><content type='html'>&lt;br&gt;
在 Android Studio 或者 IntelliJ IDEA 中,&lt;br&gt;
&lt;br&gt;
其 Java 預設的程式風格, 有些緊湊, 如下範例, 雖然有些人喜歡, 但有些人就不是很喜歡 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhecsRfxs2G4NFHgfZYUH0zkIarPpOlm2IVjbZLS-X69RPCGmUOQQbWKaLcqCg3CLXSD0Ponq6puHarXgAs9LNPEPX01NGy8ndfL5-7ecfCRwVdUVxLfI6jcNVTXLtz1X5KOcaXI_e0xn30/s1600/000.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhecsRfxs2G4NFHgfZYUH0zkIarPpOlm2IVjbZLS-X69RPCGmUOQQbWKaLcqCg3CLXSD0Ponq6puHarXgAs9LNPEPX01NGy8ndfL5-7ecfCRwVdUVxLfI6jcNVTXLtz1X5KOcaXI_e0xn30/s1600/000.png&quot; data-original-width=&quot;500&quot; data-original-height=&quot;392&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
可以在 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Menu: File &amp;gt; Settings&lt;/span&gt; 作業中進行設定修改, 參考步驟如下 :&lt;br&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;br&gt;
1) 在 Settings 中, 切換到 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Editor &amp;gt; Code Style &amp;gt; Java&lt;/span&gt;, 在 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Tabs and Indents&lt;/span&gt; 頁籤中, 設定 Tab 鍵被 4 個空白取代 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeD1xvAYdW3UguVoyFyi1gptBoqqJiuhfQfwLbDDts7AcGByvEeNpPFeewe2yendhH28LMjuW5lRIyXKG_s_VIvkLEWltNo4rE_FxtbdCvWXU3e6XcLvnwMkXL9_n9k1L59AH2-fKQLKSU/s1600/001.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeD1xvAYdW3UguVoyFyi1gptBoqqJiuhfQfwLbDDts7AcGByvEeNpPFeewe2yendhH28LMjuW5lRIyXKG_s_VIvkLEWltNo4rE_FxtbdCvWXU3e6XcLvnwMkXL9_n9k1L59AH2-fKQLKSU/s1600/001.png&quot; data-original-width=&quot;280&quot; data-original-height=&quot;277&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
2) 在 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Spaces&lt;/span&gt; 頁籤中, &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Before Parentheses&lt;/span&gt; 項目: ( 左括弧之前, 是否要有空白, 這裡我修改如下 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG80-bxY2YgwWTBP2cfK0ZyngF3KKVRaKw9meK4bCiSfGI0XEGA59PIdQJ57oAP22mweJ_kE49UNXGmOWBpNJIcjpfSllrnxytVP0ZgelN_ok4vZ75Af-pOy5ucmk2s25YypnSQtkTTXi7/s1600/002_1.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG80-bxY2YgwWTBP2cfK0ZyngF3KKVRaKw9meK4bCiSfGI0XEGA59PIdQJ57oAP22mweJ_kE49UNXGmOWBpNJIcjpfSllrnxytVP0ZgelN_ok4vZ75Af-pOy5ucmk2s25YypnSQtkTTXi7/s1600/002_1.png&quot; data-original-width=&quot;313&quot; data-original-height=&quot;259&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Within&lt;/span&gt; 項目: 左右兩括弧內側, 是否要有空白, 這裡我修改如下 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9KT93MWs_UxXMRogOZYVTQ8AikGSiSCW8EOx3fyFP5BulJGhU-aHYR5quFodWrT1koKZfSIpqXm176c1bvHclimyMWg98cbAuRPQ7kYb4nAqUirrquTwkr86wr7UZXTWyeKL-mCStgLwQ/s1600/002_2.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9KT93MWs_UxXMRogOZYVTQ8AikGSiSCW8EOx3fyFP5BulJGhU-aHYR5quFodWrT1koKZfSIpqXm176c1bvHclimyMWg98cbAuRPQ7kYb4nAqUirrquTwkr86wr7UZXTWyeKL-mCStgLwQ/s1600/002_2.png&quot; data-original-width=&quot;313&quot; data-original-height=&quot;439&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
3) 在 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Wrapping and Braces&lt;/span&gt; 頁籤中, &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Braces placement&lt;/span&gt; 項目, { 括弧是否換行顯示, 這裡我修改如下 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUdicOLYBc3eoGRWPv1c-3JdPH3ondg_a_y9Ex-KjmuDs_JIIp2t5v_He30xx-1Hw6RmazR_PetKlBeeXeQRGtmgpe3muy7w7KeAqHc_pYmtu9iKbVjeRQ-I9fw4pBZy0exORPyc-dAsWq/s1600/003_1.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUdicOLYBc3eoGRWPv1c-3JdPH3ondg_a_y9Ex-KjmuDs_JIIp2t5v_He30xx-1Hw6RmazR_PetKlBeeXeQRGtmgpe3muy7w7KeAqHc_pYmtu9iKbVjeRQ-I9fw4pBZy0exORPyc-dAsWq/s1600/003_1.png&quot; data-original-width=&quot;375&quot; data-original-height=&quot;111&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;if() statement&lt;/span&gt; 項目: else 是否換行顯示, 這裡我修改如下 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2-Rz7LYaCv_yBVuJB8x03Q3hnVtxhwBWbVXwe2TzkBMnnNJKEzvdvNqSbY2wEF1iGja-4joYA-TFs7UI7UKesvJvaC85nTwMb9hC2jVqNMIpgEt4ZMTvKQZTMNQg5HbR1PBw638bHwcsR/s1600/003_2.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2-Rz7LYaCv_yBVuJB8x03Q3hnVtxhwBWbVXwe2TzkBMnnNJKEzvdvNqSbY2wEF1iGja-4joYA-TFs7UI7UKesvJvaC85nTwMb9hC2jVqNMIpgEt4ZMTvKQZTMNQg5HbR1PBw638bHwcsR/s1600/003_2.png&quot; data-original-width=&quot;366&quot; data-original-height=&quot;111&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;switch statement&lt;/span&gt; 項目: case 是否內縮, 這裡我修改如下 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqBE62IVaxtH0ibH2tF98nPFOhcOWc6-Ktc55xNTXWTOG_rCMnUOrfXB1NglV1ljzHd82adctVfmV1oEVc5OZksRgeD_7egKuyRDHxQvQKQ8x8KB1aYvt5VP_d8nCw3Nf6jZaGzLV5eXwM/s1600/003_3.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqBE62IVaxtH0ibH2tF98nPFOhcOWc6-Ktc55xNTXWTOG_rCMnUOrfXB1NglV1ljzHd82adctVfmV1oEVc5OZksRgeD_7egKuyRDHxQvQKQ8x8KB1aYvt5VP_d8nCw3Nf6jZaGzLV5eXwM/s1600/003_3.png&quot; data-original-width=&quot;369&quot; data-original-height=&quot;77&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;try statement&lt;/span&gt; 項目: catch 與 finally 是否換行顯示, 這裡我修改如下 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7BNWEuAEQo4QJr6zybqPDOFb8_Wtm-FGPAkmzzMVhGygW5tbl0QEi251SuIXGw2qUfOJozuNZbN92QXUOXu_uaOs4_9Jx2godA4uaJND4D80GaDSTg_h2NQ_FmeLiRfFlb9eLKNSnQV86/s1600/003_4.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7BNWEuAEQo4QJr6zybqPDOFb8_Wtm-FGPAkmzzMVhGygW5tbl0QEi251SuIXGw2qUfOJozuNZbN92QXUOXu_uaOs4_9Jx2godA4uaJND4D80GaDSTg_h2NQ_FmeLiRfFlb9eLKNSnQV86/s1600/003_4.png&quot; data-original-width=&quot;375&quot; data-original-height=&quot;94&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
4) 在修改完畢後, 也可以將這些設定 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Export&lt;/span&gt; 匯出成檔案備份 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhRidWEVzDQJCUYeOc9pDlqWXIC2HED9hnK_SNDeAvA1_51EoZVzEBSzA3YS2BfcV3GLbaIooi6cY0TaoA8VrEH7m2ZRqSPKG3wq7wUzolK-svwYW4e-XIp4UVezIDt_4Iy6K1DqxQBwcX/s1600/004.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhRidWEVzDQJCUYeOc9pDlqWXIC2HED9hnK_SNDeAvA1_51EoZVzEBSzA3YS2BfcV3GLbaIooi6cY0TaoA8VrEH7m2ZRqSPKG3wq7wUzolK-svwYW4e-XIp4UVezIDt_4Iy6K1DqxQBwcX/s1600/004.png&quot; data-original-width=&quot;395&quot; data-original-height=&quot;193&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
最後, 修改之後的程式風格如下, 比較寬鬆, 也比較明瞭, 至少我個人是這麼認為啦, 參考看看囉 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj15BiNk0H_EJnlSb95iXUPuYaKS00adJOn0-Mnz8A56CME8Np8KSY3CsjhmXLDx4ucHid7QrO9LVKqvx0R47_vAilDt7S30MLoBdbMxtWvaAcvhjcHkuaSjuBlyxxviTRNi4N5bi_wk1u/s1600/005.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj15BiNk0H_EJnlSb95iXUPuYaKS00adJOn0-Mnz8A56CME8Np8KSY3CsjhmXLDx4ucHid7QrO9LVKqvx0R47_vAilDt7S30MLoBdbMxtWvaAcvhjcHkuaSjuBlyxxviTRNi4N5bi_wk1u/s1600/005.png&quot; data-original-width=&quot;500&quot; data-original-height=&quot;525&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;div class=&quot;hiddenCopyRight&quot;&gt;&lt;a href=&quot;https://tomkuo139.blogspot.com&quot;&gt;昭佑.天翔&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/2445652814774701412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/2445652814774701412'/><link rel='alternate' type='text/html' href='http://tomkuo139.blogspot.com/2017/12/android-studio-base-on-intellij-idea.html' title='Android Studio (base on IntelliJ IDEA) 自訂程式風格'/><author><name>昭佑天翔</name><uri>http://www.blogger.com/profile/11034567866105362217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhecsRfxs2G4NFHgfZYUH0zkIarPpOlm2IVjbZLS-X69RPCGmUOQQbWKaLcqCg3CLXSD0Ponq6puHarXgAs9LNPEPX01NGy8ndfL5-7ecfCRwVdUVxLfI6jcNVTXLtz1X5KOcaXI_e0xn30/s72-c/000.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7065255949366990244.post-8406418918436803746</id><published>2017-11-02T17:58:00.000+08:00</published><updated>2017-12-03T16:59:09.361+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java Script"/><category scheme="http://www.blogger.com/atom/ns#" term="Java 技術分享"/><category scheme="http://www.blogger.com/atom/ns#" term="jQuery"/><category scheme="http://www.blogger.com/atom/ns#" term="Node.js"/><category scheme="http://www.blogger.com/atom/ns#" term="Oracle DB"/><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>利用 SoloLearn app 循序漸進學習 Program</title><content type='html'>&lt;br&gt;
現在學習程式設計比以往方便且有效率,&lt;br&gt;
&lt;br&gt;
透過手機或平板隨時隨地就可以線上學習,&lt;br&gt;
&lt;br&gt;
特別介紹 &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.sololearn&quot; target=&quot;_blank&quot;&gt;SoloLearn&lt;/a&gt; 這個循序漸進且超好用的免費 app,&lt;br&gt;
&lt;br&gt;
1) 安裝 &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.sololearn&quot; target=&quot;_blank&quot;&gt;SoloLearn&lt;/a&gt; app 後開啟, 它提供&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;多個程式語言課程&lt;/span&gt;, 供您線上學習, 如: Java / JavaScript / Python / SQL / HTML / C# ... 等 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2dv-4amHBr5O0sL3uJbUTO9-vy31bVi7AOKSW343tVgy1JDfM8fZk6tgjxmcOvbUnVf5jWzZxWI6vq4LHVw_2WDJizvg6PXD5J36Ma_ieZhhLOUvJsnPotrIaglvqi6zTUwEtr7Fl4OIV/s1600/001.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2dv-4amHBr5O0sL3uJbUTO9-vy31bVi7AOKSW343tVgy1JDfM8fZk6tgjxmcOvbUnVf5jWzZxWI6vq4LHVw_2WDJizvg6PXD5J36Ma_ieZhhLOUvJsnPotrIaglvqi6zTUwEtr7Fl4OIV/s1600/001.png&quot; data-original-width=&quot;240&quot; data-original-height=&quot;427&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;br&gt;
2) 以 Python 課程為例, 就會依序有簡單到進階的&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;章節&lt;/span&gt; :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVBj9IpXIEZluigf_0ZYTM97Q9kovhTDzYDRWR821S3_SQrqmy9OrFv39j753B9lp4weFJj6rB7pSSpXmW5piITVFFYbL1_BkO3nWrcQSeyi8FYKURX7MyYv4JdlTXhGjXU9spRjR06u3g/s1600/002.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVBj9IpXIEZluigf_0ZYTM97Q9kovhTDzYDRWR821S3_SQrqmy9OrFv39j753B9lp4weFJj6rB7pSSpXmW5piITVFFYbL1_BkO3nWrcQSeyi8FYKURX7MyYv4JdlTXhGjXU9spRjR06u3g/s1600/002.png&quot; data-original-width=&quot;240&quot; data-original-height=&quot;427&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
已經完成的章節, 會呈現綠色; 進行中的章節, 會呈現深藍色; 尚未解鎖的章節, 會呈現灰色, 等上一個章節完成後, 會自動解鎖 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0b06Cs5NYP59OYFduQ9TdE7AkC2-B492Aof_pxFT07FeanH_Xei2UiRf9nhyphenhyphenzCLxxPUe31U9iWw264ekpfVa1wKrWtjAAmgcNdS6aMLfhVek2nLB2SDOYmRcobAe2fRLn7HibirEWuayO/s1600/002_2.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0b06Cs5NYP59OYFduQ9TdE7AkC2-B492Aof_pxFT07FeanH_Xei2UiRf9nhyphenhyphenzCLxxPUe31U9iWw264ekpfVa1wKrWtjAAmgcNdS6aMLfhVek2nLB2SDOYmRcobAe2fRLn7HibirEWuayO/s1600/002_2.png&quot; data-original-width=&quot;240&quot; data-original-height=&quot;427&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
3) 進入章節後, 會區分多個&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;單元&lt;/span&gt;, 同樣已完成的單元, 呈現綠色; 進行中的單元, 會呈現深藍色; 等上一個單元完成後, 會自動解鎖下一個單元 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigHPrNF5sFJ7BaCv1mLxSi4hkFikS8fxlaPnYf09b2TUUOnMnXfaUWZ-wEI4pER0pzVIMS8cRyit4h0Hnpmkd0PGldA0y4ZNFes2ldOjxGJ35P5zd2UuQJqfdwSYHMYg9y6R1u44wZEHt0/s1600/003.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigHPrNF5sFJ7BaCv1mLxSi4hkFikS8fxlaPnYf09b2TUUOnMnXfaUWZ-wEI4pER0pzVIMS8cRyit4h0Hnpmkd0PGldA0y4ZNFes2ldOjxGJ35P5zd2UuQJqfdwSYHMYg9y6R1u44wZEHt0/s1600/003.png&quot; data-original-width=&quot;240&quot; data-original-height=&quot;427&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
4) 單元裡面, 會有一頁一頁的&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;說明與範例&lt;/span&gt;, 而且範例您還可以點擊 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;TRY IT YOURSELF&lt;/span&gt;&quot; 來修改與練習 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTsWVBcUWzbzxzlHLDxO25w5neW0taaMlX14ML-3RmYMyYhPKeHOwsYb9x8B4qfCV37NI5Sf3z7pvg1x5NfeOkO8j43xtbR-G_KF6BFs4w1amkuEO2j71Ogw0jNs8h0XqdcnWpDYAyFjk2/s1600/004.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTsWVBcUWzbzxzlHLDxO25w5neW0taaMlX14ML-3RmYMyYhPKeHOwsYb9x8B4qfCV37NI5Sf3z7pvg1x5NfeOkO8j43xtbR-G_KF6BFs4w1amkuEO2j71Ogw0jNs8h0XqdcnWpDYAyFjk2/s1600/004.png&quot; data-original-width=&quot;240&quot; data-original-height=&quot;427&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
因為都是英文的, 但沒關係, 可以&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;選擇您看不懂的英文段落&lt;/span&gt;, 然後按右上角&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;複製鈕&lt;/span&gt; :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqbK3o8WExVQ6ke1KCrSOfZN8bMyQ_1LbQvbd21b3M87yrPqPw7jJ0vPDMIUD9NZoEOVbSv_yVHTh_1j_f4vwgE8k2r3MKDZ0XFDs2Ph509Z_Plw4L4-X5VV0Kb0dgukM23wnVJxo9PBDz/s1600/004_1.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqbK3o8WExVQ6ke1KCrSOfZN8bMyQ_1LbQvbd21b3M87yrPqPw7jJ0vPDMIUD9NZoEOVbSv_yVHTh_1j_f4vwgE8k2r3MKDZ0XFDs2Ph509Z_Plw4L4-X5VV0Kb0dgukM23wnVJxo9PBDz/s1600/004_1.png&quot; data-original-width=&quot;240&quot; data-original-height=&quot;427&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
就會出現 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Google 翻譯鈕&lt;/span&gt;, 按一下就可以查看英翻中的文字了 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_jy5MeRqhmHKp2dsiYd7LSHW6zn03ZqT28B5qpHtLXqXQ-OeRTHV70e2l4Wxw6eaVjW5Ftb3HiOVkgK3AfRqoEL9GInK1Fjn0euahSh8jQ7XlIW4ig4Q5evo0Y75i2AMee8b6sMN5trPM/s1600/004_1_2.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_jy5MeRqhmHKp2dsiYd7LSHW6zn03ZqT28B5qpHtLXqXQ-OeRTHV70e2l4Wxw6eaVjW5Ftb3HiOVkgK3AfRqoEL9GInK1Fjn0euahSh8jQ7XlIW4ig4Q5evo0Y75i2AMee8b6sMN5trPM/s1600/004_1_2.png&quot; data-original-width=&quot;240&quot; data-original-height=&quot;427&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
同時, 每一頁都有 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Comments&lt;/span&gt; 看看其他人對於這個頁面的討論 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf9Zm75F1ux1IKtk2ot8ll9JOOd0DpEvSviKhv_Y-9Urx9M0A3_JbrldVsr8wDNBPb-ewCIvdbRi6OyXCQGVcVjmJQC0KLUPhe-cJ2dUo89j29yp-njWaG2H1AxAgwksztM_GfJtvS41SA/s1600/004_2.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf9Zm75F1ux1IKtk2ot8ll9JOOd0DpEvSviKhv_Y-9Urx9M0A3_JbrldVsr8wDNBPb-ewCIvdbRi6OyXCQGVcVjmJQC0KLUPhe-cJ2dUo89j29yp-njWaG2H1AxAgwksztM_GfJtvS41SA/s1600/004_2.png&quot; data-original-width=&quot;240&quot; data-original-height=&quot;427&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
看完上一頁的說明與範例後, 馬上進行&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;小小測驗&lt;/span&gt;, 來驗收結果 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgq3mpiG83uQvGoOOQOFF8Q4xmE9piqh91FK57BywsK_UM53dsrBbtvzgPJycMeFofNvjWtVJOVfs3nu6LyEdmwUGt6JQlUQlJVWdSQtn0d7Uin9Abi4tm6FEGDOyfjCiX0mXeeNqF2SydU/s1600/004_3.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgq3mpiG83uQvGoOOQOFF8Q4xmE9piqh91FK57BywsK_UM53dsrBbtvzgPJycMeFofNvjWtVJOVfs3nu6LyEdmwUGt6JQlUQlJVWdSQtn0d7Uin9Abi4tm6FEGDOyfjCiX0mXeeNqF2SydU/s1600/004_3.png&quot; data-original-width=&quot;240&quot; data-original-height=&quot;427&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
最後, 完成一整個課程, 也會頒布證明給您哦 :&lt;br&gt;
&lt;a href=&quot;https://www.sololearn.com/Certificate/1073-2694472/jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://www.sololearn.com/Certificate/1073-2694472/jpg&quot; width=&quot;453px&quot; height=&quot;320px&quot; /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;

&lt;a href=&quot;https://www.sololearn.com/Certificate/1068-2694472/jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://www.sololearn.com/Certificate/1068-2694472/jpg&quot; width=&quot;453px&quot; height=&quot;320px&quot; /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;

&lt;a href=&quot;https://www.sololearn.com/Certificate/1080-2694472/jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://www.sololearn.com/Certificate/1080-2694472/jpg&quot; width=&quot;453px&quot; height=&quot;320px&quot; /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;

&lt;a href=&quot;https://www.sololearn.com/Certificate/1060-2694472/jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://www.sololearn.com/Certificate/1060-2694472/jpg&quot; width=&quot;453px&quot; height=&quot;320px&quot; /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;br&gt;&lt;br&gt;
這是我目前遇到最好的程式語言線上學習 app, 而且完全免費, 超級推薦的.&lt;br&gt;
&lt;br&gt;
&lt;div class=&quot;hiddenCopyRight&quot;&gt;&lt;a href=&quot;https://tomkuo139.blogspot.com&quot;&gt;昭佑.天翔&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/8406418918436803746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/8406418918436803746'/><link rel='alternate' type='text/html' href='http://tomkuo139.blogspot.com/2017/11/sololearn-app-python.html' title='利用 SoloLearn app 循序漸進學習 Program'/><author><name>昭佑天翔</name><uri>http://www.blogger.com/profile/11034567866105362217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2dv-4amHBr5O0sL3uJbUTO9-vy31bVi7AOKSW343tVgy1JDfM8fZk6tgjxmcOvbUnVf5jWzZxWI6vq4LHVw_2WDJizvg6PXD5J36Ma_ieZhhLOUvJsnPotrIaglvqi6zTUwEtr7Fl4OIV/s72-c/001.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7065255949366990244.post-355303551371597654</id><published>2017-11-02T17:50:00.000+08:00</published><updated>2017-11-02T17:50:23.900+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>Python 套件管理工具 - PIP</title><content type='html'>&lt;br&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;PIP&lt;/span&gt; (&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;P&lt;/span&gt;ython &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;I&lt;/span&gt;nstall &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;P&lt;/span&gt;ackage) 是 Python 官方的線上安裝套件工具,&lt;br&gt;
&lt;br&gt;
其指令為 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;pip install &lt;span style=&quot;color: rgb(153, 51, 153);&quot;&gt;套件名稱&lt;/span&gt;&lt;/span&gt;,&lt;br&gt;
&lt;br&gt;
就會從 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;PyPI&lt;/span&gt; (&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Py&lt;/span&gt;thon &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;P&lt;/span&gt;ackage &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;I&lt;/span&gt;ndex) 搜尋該套件, 並且連同相依套件一併安裝之,&lt;br&gt;
&lt;br&gt;
如 1: pip install sqlobject&lt;br&gt;
&lt;br&gt;
如 2: pip install pygame&lt;br&gt;
&lt;br&gt;
PyPI 網址: &lt;a href=&quot;https://pypi.python.org/pypi&quot; target=&quot;_blank&quot;&gt;https://pypi.python.org/pypi&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
完整的 Python 第三方套件列表 1: &lt;a href=&quot;https://wiki.python.org/moin/UsefulModules&quot; target=&quot;_blank&quot;&gt;https://wiki.python.org/moin/UsefulModules&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
完整的 Python 第三方套件列表 2: &lt;a href=&quot;https://en.wikipedia.org/wiki/List_of_Python_software&quot; target=&quot;_blank&quot;&gt;https://en.wikipedia.org/wiki/List_of_Python_software&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
以上, 參考看看囉 ^^.
&lt;br&gt;
&lt;div class=&quot;hiddenCopyRight&quot;&gt;&lt;a href=&quot;https://tomkuo139.blogspot.com&quot;&gt;昭佑.天翔&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/355303551371597654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/355303551371597654'/><link rel='alternate' type='text/html' href='http://tomkuo139.blogspot.com/2017/11/python-pip.html' title='Python 套件管理工具 - PIP'/><author><name>昭佑天翔</name><uri>http://www.blogger.com/profile/11034567866105362217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7065255949366990244.post-606036627276997197</id><published>2017-11-02T17:43:00.000+08:00</published><updated>2017-11-02T17:43:00.870+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>在 PyCharm 實現 Python Debug</title><content type='html'>&lt;br&gt;
在 PyCharm 中,&lt;br&gt;
&lt;br&gt;
如何實現 Python Debug,&lt;br&gt;
&lt;br&gt;
參考步驟如下 :&lt;br&gt;
&lt;br&gt;
1) 在 Python 檔案的行列旁邊, click 要 debug 的地方 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2WhRWw4k8sjBTiJUuOT0DZqAzsFrL6W7qihRsXNDm-UpPQaXKcKw5h-TmFjL9pzfqS1CHr1T3oX_mK77Z4Sts2_h21UQB8KgxiSuSwz1Ek4q0fMaU1WsI62-5yayYFh-qQvJKbZKHlxeU/s1600/001.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2WhRWw4k8sjBTiJUuOT0DZqAzsFrL6W7qihRsXNDm-UpPQaXKcKw5h-TmFjL9pzfqS1CHr1T3oX_mK77Z4Sts2_h21UQB8KgxiSuSwz1Ek4q0fMaU1WsI62-5yayYFh-qQvJKbZKHlxeU/s1600/001.png&quot; data-original-width=&quot;270&quot; data-original-height=&quot;180&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;br&gt;
2) 在 Python File 按滑鼠右鍵, 然後點選 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Debug&lt;/span&gt;&quot; :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgO1ym1fGPdlbTsl1WiDhW3TD6T1s2ztDSPL_h-6hKwCR3gY8vXZkTg0u3vmYXaf7cSuA6YqbteJIzmWzD2jjJMghpJPTrL55Hxfnzd6r9UGbAo2F1BMuzWBKgd_-RnFKU2jMjVDW6_5xCA/s1600/002.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgO1ym1fGPdlbTsl1WiDhW3TD6T1s2ztDSPL_h-6hKwCR3gY8vXZkTg0u3vmYXaf7cSuA6YqbteJIzmWzD2jjJMghpJPTrL55Hxfnzd6r9UGbAo2F1BMuzWBKgd_-RnFKU2jMjVDW6_5xCA/s1600/002.png&quot; data-original-width=&quot;389&quot; data-original-height=&quot;421&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
3) 這時會發現 PyCharm 自動開啟 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Debugger&lt;/span&gt; 視窗 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX6PaW3rgxAm_OhkUXl0qsNTaEMjLEzGIua4NtIN3EtAU5LE_c1MUdlUc0TsBnd_7pBp8Kcez86OXDETf9P-HWy9pcrN5B3cQFx39_oYsCwImHNV6SyJ9fpo0SWrZu0QdAf_55xvmUMCWr/s1600/003.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX6PaW3rgxAm_OhkUXl0qsNTaEMjLEzGIua4NtIN3EtAU5LE_c1MUdlUc0TsBnd_7pBp8Kcez86OXDETf9P-HWy9pcrN5B3cQFx39_oYsCwImHNV6SyJ9fpo0SWrZu0QdAf_55xvmUMCWr/s1600/003.png&quot; data-original-width=&quot;560&quot; data-original-height=&quot;200&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
切換到 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Console&lt;/span&gt; 視窗, 會發現執行停留在 debug break point 中 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC6ssp6oPf8T71mkWoGhROZA5HHgEhyphenhyphenoQ6Pgkg1KsqY5rN6HQ_q_XCcS0Jp0IjzGWSjKgyH0TMv4DV-Hc2LxcsqlcdLBIMnuW4l2Jf8CStgvxp39kwkrHdeRzjtMJP67VyX9ZwKsE3-Xye/s1600/003_2.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC6ssp6oPf8T71mkWoGhROZA5HHgEhyphenhyphenoQ6Pgkg1KsqY5rN6HQ_q_XCcS0Jp0IjzGWSjKgyH0TMv4DV-Hc2LxcsqlcdLBIMnuW4l2Jf8CStgvxp39kwkrHdeRzjtMJP67VyX9ZwKsE3-Xye/s1600/003_2.png&quot; data-original-width=&quot;560&quot; data-original-height=&quot;210&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
按 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Step Into&lt;/span&gt;&quot; 繼續執行下一行程式 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGiRi19y_Nw-1VF9wi0yc3ZRQ_SwsXxrAd_Ua79sBAEYCfvlTzYpATLzq8wZUT0CbYm6D8nv3MtWtHjlaMJw3w-pYigoN68Sm4z1VsVHhYCVKIdxO7FMrap0HSLedsI8BRqqhRrhClY3dd/s1600/003_3.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGiRi19y_Nw-1VF9wi0yc3ZRQ_SwsXxrAd_Ua79sBAEYCfvlTzYpATLzq8wZUT0CbYm6D8nv3MtWtHjlaMJw3w-pYigoN68Sm4z1VsVHhYCVKIdxO7FMrap0HSLedsI8BRqqhRrhClY3dd/s1600/003_3.png&quot; data-original-width=&quot;560&quot; data-original-height=&quot;210&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
這時候會看到執行結果, 而且指標已指向下一行程式了 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj151pK5v4UKDPeE2QSgm3XToDOJYX0DTQJd1NZHxfQo1P405quGuh1PBIoa_3suQweyivlaoqvXu08lKclePo2f1oR-Jh4Pak1RlSgVODjTnEdVH97FCvunqLwOUQ3sk86evV2GWz8D4QH/s1600/003_4.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj151pK5v4UKDPeE2QSgm3XToDOJYX0DTQJd1NZHxfQo1P405quGuh1PBIoa_3suQweyivlaoqvXu08lKclePo2f1oR-Jh4Pak1RlSgVODjTnEdVH97FCvunqLwOUQ3sk86evV2GWz8D4QH/s1600/003_4.png&quot; data-original-width=&quot;560&quot; data-original-height=&quot;360&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
以上, 參考看看囉 !!&lt;br&gt;
&lt;br&gt;
&lt;div class=&quot;hiddenCopyRight&quot;&gt;&lt;a href=&quot;https://tomkuo139.blogspot.com&quot;&gt;昭佑.天翔&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/606036627276997197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/606036627276997197'/><link rel='alternate' type='text/html' href='http://tomkuo139.blogspot.com/2017/11/pycharm-python-debug.html' title='在 PyCharm 實現 Python Debug'/><author><name>昭佑天翔</name><uri>http://www.blogger.com/profile/11034567866105362217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2WhRWw4k8sjBTiJUuOT0DZqAzsFrL6W7qihRsXNDm-UpPQaXKcKw5h-TmFjL9pzfqS1CHr1T3oX_mK77Z4Sts2_h21UQB8KgxiSuSwz1Ek4q0fMaU1WsI62-5yayYFh-qQvJKbZKHlxeU/s72-c/001.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7065255949366990244.post-3144641487081784572</id><published>2017-11-02T17:34:00.000+08:00</published><updated>2017-11-02T17:34:52.409+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>在 PyCharm 開發 Python</title><content type='html'>&lt;br&gt;
前提: 在安裝 PyCharm 之前, 請需在電腦中安裝 Python: &lt;a href=&quot;http://tomkuo139.blogspot.com/2017/11/python.html&quot; target=&quot;_blank&quot;&gt;參考我這篇文章&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
1) 到 PyCharm 網站: &lt;a href=&quot;http://www.jetbrains.com/pycharm/index.html&quot; target=&quot;_blank&quot;&gt;http://www.jetbrains.com/pycharm/index.html&lt;/a&gt;, 點擊 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;DOWNLOAD NOW&lt;/span&gt;&quot; 下載 PyCharm 安裝檔 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzF1QvCu5BAo0ZiUasAz0b_PMJ_wlxnlA2mkrDlLjwjaKN1nMvs1vXyZiVjgOu73Q4yu1mATALMOvNgYxFIQQQyVyx9cgFoAkhrwaUdI9IZwsRJ5zFDDsITUX_X_-tubDOqz9L8eFmat37/s1600/001.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzF1QvCu5BAo0ZiUasAz0b_PMJ_wlxnlA2mkrDlLjwjaKN1nMvs1vXyZiVjgOu73Q4yu1mATALMOvNgYxFIQQQyVyx9cgFoAkhrwaUdI9IZwsRJ5zFDDsITUX_X_-tubDOqz9L8eFmat37/s1600/001.png&quot; data-original-width=&quot;545&quot; data-original-height=&quot;321&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
2) PyCharm 提供兩個版本: &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Professional&lt;/span&gt; 專業付費版, &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Community&lt;/span&gt; 簡易免費版 (這個免費版對初學者而言夠用了)&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLBCG3QaGSJXKMNrQzVuT0xzkFC2J5IU_F7x7htJ3jEF4NB35gfWJD4UWRBBbzk2xPMjAj0MzOVe7TpGv-nRz3sAm9OyraB3QKK8Fzy-SbsYr3ZozLD597FS5zkE2EkuNGSa7U_SZg_94v/s1600/002.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLBCG3QaGSJXKMNrQzVuT0xzkFC2J5IU_F7x7htJ3jEF4NB35gfWJD4UWRBBbzk2xPMjAj0MzOVe7TpGv-nRz3sAm9OyraB3QKK8Fzy-SbsYr3ZozLD597FS5zkE2EkuNGSa7U_SZg_94v/s1600/002.png&quot; data-original-width=&quot;600&quot; data-original-height=&quot;380&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
3) 安裝 PyCharm 中 ...&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVlqSGLfmgILj6OqzQ-VWcUYDtop0C_yyw2TFWrZxyrUCmvYv9px01hH-dCJ3RRbe-xrVq2_379BcGs1WhxrXalu4qDqDJNiEkwDJ4r9Rjc9axDcJwWMu9hcpMzzYzpIO06_N-Juu28a3U/s1600/003.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVlqSGLfmgILj6OqzQ-VWcUYDtop0C_yyw2TFWrZxyrUCmvYv9px01hH-dCJ3RRbe-xrVq2_379BcGs1WhxrXalu4qDqDJNiEkwDJ4r9Rjc9axDcJwWMu9hcpMzzYzpIO06_N-Juu28a3U/s1600/003.png&quot; data-original-width=&quot;499&quot; data-original-height=&quot;388&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
4) 安裝完畢, 開啟 PyCharm, 因為是第一次使用, 點擊 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Create New Project&lt;/span&gt;&quot; 建立新專案 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwHJlQK6J3vcYxNABOM3xBX3JSQjiK1FsbRWZUGp43b7SSCsrDjISxoxtIatKh7yNE0-mgGFq0F4x14nNr4ee-KeSpFeUbEl7iqLZB-EgHHPTXxxYkfdcZpLvWB5unofuOHNfyFb0j_d5U/s1600/101.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwHJlQK6J3vcYxNABOM3xBX3JSQjiK1FsbRWZUGp43b7SSCsrDjISxoxtIatKh7yNE0-mgGFq0F4x14nNr4ee-KeSpFeUbEl7iqLZB-EgHHPTXxxYkfdcZpLvWB5unofuOHNfyFb0j_d5U/s1600/101.png&quot; data-original-width=&quot;600&quot; data-original-height=&quot;437&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
輸入專案所在的目錄位置, 然後按 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Create&lt;/span&gt;&quot; 建立 :&lt;br&gt;
(&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Interpreter&lt;/span&gt; 會自動偵測您電腦已有安裝的 Python 檔案)&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjijmhYAZlNR7qNAhE5W3GF9sOmPSYBnnE3bn3jY_qkAG3VhJerJDFHZeAGJQeN2Bvstg0zcl2YZsk6MSahpLMRVAqHntz91cn1QLfmmgX3RjP1JVXx4nK1UMNifNOMTgAoYzNZ2g79dFzQ/s1600/102.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjijmhYAZlNR7qNAhE5W3GF9sOmPSYBnnE3bn3jY_qkAG3VhJerJDFHZeAGJQeN2Bvstg0zcl2YZsk6MSahpLMRVAqHntz91cn1QLfmmgX3RjP1JVXx4nK1UMNifNOMTgAoYzNZ2g79dFzQ/s1600/102.png&quot; data-original-width=&quot;600&quot; data-original-height=&quot;437&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
在 Project 按右鍵, 選擇 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;New &amp;gt; Python File&lt;/span&gt; :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg24O4Yrnttftvi-Nq69sY-ktfjXLO2LLAgeqQVJo9HDEQbiSkeOEFVHyRicVnLCpZ0Wkq48leRiQVZfUO9mi2jFZvfDAKmg76kVc32jZrxJxGWOhVuT55t9nJJ0AORmhfrJ5QcR64byBAF/s1600/103.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg24O4Yrnttftvi-Nq69sY-ktfjXLO2LLAgeqQVJo9HDEQbiSkeOEFVHyRicVnLCpZ0Wkq48leRiQVZfUO9mi2jFZvfDAKmg76kVc32jZrxJxGWOhVuT55t9nJJ0AORmhfrJ5QcR64byBAF/s1600/103.png&quot; data-original-width=&quot;555&quot; data-original-height=&quot;238&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
輸入 Python 檔案名稱 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnFZCdWEK3vf0DX3TTablyd9TGi_VP11GEnEqAgmEna0WLZw3eg5JAGgqHRxP7iP36bdXhwVH0_ZKlp4BtMfjSLfXywxmTT6NH0cMfJzfKvLhC38WLo5I_MJ6VArdHvXVlJFYF4XiagO4E/s1600/104.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnFZCdWEK3vf0DX3TTablyd9TGi_VP11GEnEqAgmEna0WLZw3eg5JAGgqHRxP7iP36bdXhwVH0_ZKlp4BtMfjSLfXywxmTT6NH0cMfJzfKvLhC38WLo5I_MJ6VArdHvXVlJFYF4XiagO4E/s1600/104.png&quot; data-original-width=&quot;350&quot; data-original-height=&quot;133&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
這樣, 就可以開始撰寫 Python 了.&lt;br&gt;
(以下輸入 el, 自動提示相關 el 指令, 相當快速且好用)&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9C5bgTXDQs9p-vPZ40KT5eP-7ZJIrQbNFSTaqW4CtW26PMUmgNRpiyX1dJZGfNyu_jOciH2Itv4qeuUbmR7BAPa8AxH-gnsF-0Mr2bR86YWvBJHEI11RBpJJ3MRiFpQgmIBJkID1sTRUU/s1600/105.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9C5bgTXDQs9p-vPZ40KT5eP-7ZJIrQbNFSTaqW4CtW26PMUmgNRpiyX1dJZGfNyu_jOciH2Itv4qeuUbmR7BAPa8AxH-gnsF-0Mr2bR86YWvBJHEI11RBpJJ3MRiFpQgmIBJkID1sTRUU/s1600/105.png&quot; data-original-width=&quot;548&quot; data-original-height=&quot;277&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;div class=&quot;hiddenCopyRight&quot;&gt;&lt;a href=&quot;https://tomkuo139.blogspot.com&quot;&gt;昭佑.天翔&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/3144641487081784572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/3144641487081784572'/><link rel='alternate' type='text/html' href='http://tomkuo139.blogspot.com/2017/11/pycharm-python.html' title='在 PyCharm 開發 Python'/><author><name>昭佑天翔</name><uri>http://www.blogger.com/profile/11034567866105362217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzF1QvCu5BAo0ZiUasAz0b_PMJ_wlxnlA2mkrDlLjwjaKN1nMvs1vXyZiVjgOu73Q4yu1mATALMOvNgYxFIQQQyVyx9cgFoAkhrwaUdI9IZwsRJ5zFDDsITUX_X_-tubDOqz9L8eFmat37/s72-c/001.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7065255949366990244.post-1571857341077890812</id><published>2017-11-02T17:05:00.000+08:00</published><updated>2017-11-02T17:05:24.688+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>利用 IDLE 簡易開發環境, 編寫與執行 Python 簡易語法</title><content type='html'>&lt;br&gt;
安裝好 Python 之後, 可以利用 Python 內建簡易執行環境, 進行簡單的 Python 執行,&lt;br&gt;
&lt;br&gt;
參考如下 :&lt;br&gt;
&lt;br&gt;
1) Python 提供兩個執行環境 : &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Python IDLE&lt;/span&gt; 與 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Python&lt;/span&gt; :&lt;br&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdCmw8_xnKpkvHQzojkTq78NSF748W5Mtr0w2d93IxTQdTatFPc5kjdd9tQ5CTUaU3SpWr8KBE1KVFYqyFS7-6FzcEix6wdRx6XRLcbEkZsmKVTWQ7gplt7kzxi5TKyYO7suoZeVxmmd_K/s1600/001.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdCmw8_xnKpkvHQzojkTq78NSF748W5Mtr0w2d93IxTQdTatFPc5kjdd9tQ5CTUaU3SpWr8KBE1KVFYqyFS7-6FzcEix6wdRx6XRLcbEkZsmKVTWQ7gplt7kzxi5TKyYO7suoZeVxmmd_K/s1600/001.png&quot; data-original-width=&quot;250&quot; data-original-height=&quot;186&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
2) 開啟 Python, 一個類似 Command 視窗, 執行基本指令 OK, 但執行判斷式就有些問題了, &lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;不建議使用&lt;/span&gt; :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimAkYOCvjPbacAe_7qVienwcG8GBjZ0cFBwTcKUgMv3SxjkjWD4QFsd6szbV4qu-9PoqRMFbTRAVeXf3NqIeh-lJ8qlalpKncyN3MHE-LRip4XNTvSUCiUi-23G-EtsTupajbWsojdNRjp/s1600/002.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimAkYOCvjPbacAe_7qVienwcG8GBjZ0cFBwTcKUgMv3SxjkjWD4QFsd6szbV4qu-9PoqRMFbTRAVeXf3NqIeh-lJ8qlalpKncyN3MHE-LRip4XNTvSUCiUi-23G-EtsTupajbWsojdNRjp/s1600/002.png&quot; data-original-width=&quot;422&quot; data-original-height=&quot;240&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
3) 開啟 Python IDLE, 也是一個類似 Command 視窗, 執行基本指令 OK, 但執行判斷式仍就有問題, &lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;不建議在這下指令使用&lt;/span&gt; :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7DkySLBYfZOaRSsIOzTOin3HWYR1llDvMzKb_hLE5QnqZK3MbESOaYK8CeMuS49Hv4hvvpNQ8B9wxqi2jsIU6E6T7-EYcLs8cLNEUnhNY9o5J5B9aQi_ZIuf_5-M5pg29f8jpJkKKFq5L/s1600/003.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7DkySLBYfZOaRSsIOzTOin3HWYR1llDvMzKb_hLE5QnqZK3MbESOaYK8CeMuS49Hv4hvvpNQ8B9wxqi2jsIU6E6T7-EYcLs8cLNEUnhNY9o5J5B9aQi_ZIuf_5-M5pg29f8jpJkKKFq5L/s1600/003.png&quot; data-original-width=&quot;591&quot; data-original-height=&quot;264&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
4) 點擊 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;IDLE&lt;/span&gt; 的 Menu: &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;File &amp;gt; New File&lt;/span&gt;, 開啟新檔案 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAnGvg5jpmOoFUQm-6nQgO8xnzawGRS2yCvM6xfm4JoqfCotUrRw0sqvSbzD3q5oJup8cTG6aq2D4Pp3CnxkEUWXNKxGgZlMUgAKYK5k4zN15LYD11rvenPPTpbMfQqlU3vBsHU0R4i0Vs/s1600/004.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAnGvg5jpmOoFUQm-6nQgO8xnzawGRS2yCvM6xfm4JoqfCotUrRw0sqvSbzD3q5oJup8cTG6aq2D4Pp3CnxkEUWXNKxGgZlMUgAKYK5k4zN15LYD11rvenPPTpbMfQqlU3vBsHU0R4i0Vs/s1600/004.png&quot; data-original-width=&quot;217&quot; data-original-height=&quot;170&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
在這個簡易文字編輯器中, 撰寫 Python 程式, 然後存檔 (副檔名為 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;.py&lt;/span&gt;) :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir8dohZF-Jaz1nP5_DeBb_0FvhebwQ0t9sJDMQ_9Ga6mXPYxp0BWiKudiqgQHGuoiWq5zO-Z7PxpuGIcQM7ghqTL3p59zY_d1nF1tkRhJp7Cpx01XG3Muk8y22pYqur9HHKtiUAIwMNHfQ/s1600/004_2.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir8dohZF-Jaz1nP5_DeBb_0FvhebwQ0t9sJDMQ_9Ga6mXPYxp0BWiKudiqgQHGuoiWq5zO-Z7PxpuGIcQM7ghqTL3p59zY_d1nF1tkRhJp7Cpx01XG3Muk8y22pYqur9HHKtiUAIwMNHfQ/s1600/004_2.png&quot; data-original-width=&quot;460&quot; data-original-height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
點擊 Menu: &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Run &amp;gt; Run Module&lt;/span&gt; 執行 Python :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHZP03npP5E110Mefc5KMZ_2MzZwbhqDb7g_iHCBTMpLGrul5hxwW2ZTmIJ1ypJwN5in9_oaVFuIVr7tZuhB1Tf4FK9mOWIID04ow8gWPe9JKDG-sLctH7uRJOI1Ey6H4faftk-h2oLQaM/s1600/004_3.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHZP03npP5E110Mefc5KMZ_2MzZwbhqDb7g_iHCBTMpLGrul5hxwW2ZTmIJ1ypJwN5in9_oaVFuIVr7tZuhB1Tf4FK9mOWIID04ow8gWPe9JKDG-sLctH7uRJOI1Ey6H4faftk-h2oLQaM/s1600/004_3.png&quot; data-original-width=&quot;460&quot; data-original-height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
Python 執行結果顯示在 IDLE 中 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYhE2fQX7gY_QYUE3FSqUqTDwZB_Yit7ykmt-In44SSG0rw7vgQh9X3n6dzwL41GJh51yDKBtgcwsjzHSlNr-_H_TGygBEhiTdCyTI-7UpHc6iw0nHfYzpBfHVkcut3bssXKf0VSbiymCp/s1600/004_4.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYhE2fQX7gY_QYUE3FSqUqTDwZB_Yit7ykmt-In44SSG0rw7vgQh9X3n6dzwL41GJh51yDKBtgcwsjzHSlNr-_H_TGygBEhiTdCyTI-7UpHc6iw0nHfYzpBfHVkcut3bssXKf0VSbiymCp/s1600/004_4.png&quot; data-original-width=&quot;460&quot; data-original-height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;big&gt;&lt;b&gt;結論:&lt;/b&gt;&lt;/big&gt;&lt;br&gt;
&lt;br&gt;
Python 內建的執行環境, 對於新手而言, 不建議用 Python Command, 而 Python IDLE 勉強可以用, 但需開兩個視窗, 又顯得不方便,&lt;br&gt;
&lt;br&gt;
所以, 可以改用 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;PyCharm&lt;/span&gt; 或 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Eclipse+PyDev&lt;/span&gt; 等 IDE 整合開發工具, 會讓您用起來感覺比 IDLE 好太多了.&lt;br&gt;
&lt;br&gt;
&lt;div class=&quot;hiddenCopyRight&quot;&gt;&lt;a href=&quot;https://tomkuo139.blogspot.com&quot;&gt;昭佑.天翔&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/1571857341077890812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/1571857341077890812'/><link rel='alternate' type='text/html' href='http://tomkuo139.blogspot.com/2017/11/idle-python.html' title='利用 IDLE 簡易開發環境, 編寫與執行 Python 簡易語法'/><author><name>昭佑天翔</name><uri>http://www.blogger.com/profile/11034567866105362217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdCmw8_xnKpkvHQzojkTq78NSF748W5Mtr0w2d93IxTQdTatFPc5kjdd9tQ5CTUaU3SpWr8KBE1KVFYqyFS7-6FzcEix6wdRx6XRLcbEkZsmKVTWQ7gplt7kzxi5TKyYO7suoZeVxmmd_K/s72-c/001.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7065255949366990244.post-4085673401394191606</id><published>2017-11-02T16:53:00.000+08:00</published><updated>2017-11-02T16:53:22.445+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>建構 Python 環境</title><content type='html'>&lt;br&gt;
1) 到 &lt;a href=&quot;https://www.python.org/&quot; target=&quot;_blank&quot;&gt;https://www.python.org/&lt;/a&gt; 下載 Python 安裝程式 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgshphXMRcTuKeJ4BGqAvwSHrcnBOM-TCcoJ3Un08gJktLs_cUbPvyrKTWN_FROHd7TRVqX0OqiUCbmswItf_1Fw34SQ5fw8qi_uXK927PRtb3O_KqHHdbD5j98vtaXgpKSzkoYPog9mz1K/s1600/001.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgshphXMRcTuKeJ4BGqAvwSHrcnBOM-TCcoJ3Un08gJktLs_cUbPvyrKTWN_FROHd7TRVqX0OqiUCbmswItf_1Fw34SQ5fw8qi_uXK927PRtb3O_KqHHdbD5j98vtaXgpKSzkoYPog9mz1K/s1600/001.png&quot; data-original-width=&quot;500&quot; data-original-height=&quot;221&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
2) 進行 Python 安裝, 然後點擊 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Customize installation&lt;/span&gt;&quot;, 可以查看安裝哪些項目 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrKtpHmnFeAxPG1dyQNT4unRn136eXGgnpa6f4O7hoB6Ij1v3F-QbMUP9O_Dp58r_oWZq7qluv5r2TSHeHY9Pw1W1HN1dl2l56LaZueZtXuQJ3y3nmm2btV1Z5wTmNa8K-ikBdOCUePNH0/s1600/002.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrKtpHmnFeAxPG1dyQNT4unRn136eXGgnpa6f4O7hoB6Ij1v3F-QbMUP9O_Dp58r_oWZq7qluv5r2TSHeHY9Pw1W1HN1dl2l56LaZueZtXuQJ3y3nmm2btV1Z5wTmNa8K-ikBdOCUePNH0/s1600/002.png&quot; data-original-width=&quot;500&quot; data-original-height=&quot;308&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
3) 基本上, 採用預設選項即可, 按 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Next&lt;/span&gt;&quot; 進行下一步 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaa1tB_INLxDmtyO3mbDUCbUUJoU5B77UcS7ojeH_tfn-drGF919FnQ7Ed2Vgiy_cyjwGT378MkCnesr8EtVA6bujmdaat2qqVDfNUIAK3rJ8eGUoqDTbep6DH2TluLFuoWEOUaGHMjZ79/s1600/003.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaa1tB_INLxDmtyO3mbDUCbUUJoU5B77UcS7ojeH_tfn-drGF919FnQ7Ed2Vgiy_cyjwGT378MkCnesr8EtVA6bujmdaat2qqVDfNUIAK3rJ8eGUoqDTbep6DH2TluLFuoWEOUaGHMjZ79/s1600/003.png&quot; data-original-width=&quot;500&quot; data-original-height=&quot;308&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
4) 基本上, 採用預設選項即可, 按 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Next&lt;/span&gt;&quot; 進行下一步 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXVkrY0_5i4itCn5nDaEbiCXOcpNSN9OjSJCT1ePA_RFRQCwJmhAoXi5tiT-H2JFlGmZs-13juP0BSTgV5DqQc8atIJ41_O0Qga2JfdtZ0czb68BTZSyVgFa9Ue8D1V3r0VLJeNSqBWtrA/s1600/004.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXVkrY0_5i4itCn5nDaEbiCXOcpNSN9OjSJCT1ePA_RFRQCwJmhAoXi5tiT-H2JFlGmZs-13juP0BSTgV5DqQc8atIJ41_O0Qga2JfdtZ0czb68BTZSyVgFa9Ue8D1V3r0VLJeNSqBWtrA/s1600/004.png&quot; data-original-width=&quot;500&quot; data-original-height=&quot;308&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
然後, 等待 Python 安裝完畢即可.&lt;br&gt;
&lt;br&gt;
&lt;div class=&quot;hiddenCopyRight&quot;&gt;&lt;a href=&quot;https://tomkuo139.blogspot.com&quot;&gt;昭佑.天翔&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/4085673401394191606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/4085673401394191606'/><link rel='alternate' type='text/html' href='http://tomkuo139.blogspot.com/2017/11/python.html' title='建構 Python 環境'/><author><name>昭佑天翔</name><uri>http://www.blogger.com/profile/11034567866105362217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgshphXMRcTuKeJ4BGqAvwSHrcnBOM-TCcoJ3Un08gJktLs_cUbPvyrKTWN_FROHd7TRVqX0OqiUCbmswItf_1Fw34SQ5fw8qi_uXK927PRtb3O_KqHHdbD5j98vtaXgpKSzkoYPog9mz1K/s72-c/001.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7065255949366990244.post-4588761891319234135</id><published>2017-11-02T16:42:00.002+08:00</published><updated>2017-11-02T16:42:40.948+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><title type='text'>Android Studio (base on IntelliJ IDEA) 自訂快捷鍵</title><content type='html'>在 Android Studio 中,&lt;br&gt;
&lt;br&gt;
因為常用的 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Content Assist&lt;/span&gt; 提示功能快捷鍵, 預設為 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Ctrl + Space&lt;/span&gt;,&lt;br&gt;
&lt;br&gt;
但在中文 OS 中, 這是切換中英文輸入法的快捷鍵,&lt;br&gt;
&lt;br&gt;
所以, 必須在 Android Studio 中自訂這個快捷鍵,&lt;br&gt;
&lt;br&gt;
參考步驟, 如下 :&lt;br&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;br&gt;
1) 點選 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Menu: File &amp;gt; Settings&lt;/span&gt; 開啟偏好設定, 切換到 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Keymap&lt;/span&gt;, 預設為 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Default&lt;/span&gt;, 若您從 Eclipse 轉換過來, 也可以切換到 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Eclipse&lt;/span&gt; Keymap :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMgkch268IaLxcjKuwINfcNvupmVjPkcLhILaDlOe7Rh7STV04ihmNdMmKcyLXH_G9DLes60Slu39mQLySwn-9j6hz4gvBjM4bVocV3cAs24gCUe_-8WOOIdfUWX-9p1zxZzF1Lw-TySL7/s1600/001.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMgkch268IaLxcjKuwINfcNvupmVjPkcLhILaDlOe7Rh7STV04ihmNdMmKcyLXH_G9DLes60Slu39mQLySwn-9j6hz4gvBjM4bVocV3cAs24gCUe_-8WOOIdfUWX-9p1zxZzF1Lw-TySL7/s1600/001.png&quot; data-original-width=&quot;447&quot; data-original-height=&quot;288&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
2) 選擇我們要修改的功能快捷鍵, Content Assist 在 Android Studio 的位置為 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Code &amp;gt; Completion &amp;gt; Basic&lt;/span&gt;, 然後點擊 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Edit&lt;/span&gt; 按鈕 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7Vmva3vNoHR0BoAo3eXwsiiMQ44aUoanfmCHZptj8CZBiqwjnsnbNVtKe0WNEr-JKFgzHLorclyfvSxFDDFc2W58MYrRHkrATAAj66IMiaPFo_DaQMhSmhrAgl6oHwPUaXpkFMg5eyLiQ/s1600/002.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7Vmva3vNoHR0BoAo3eXwsiiMQ44aUoanfmCHZptj8CZBiqwjnsnbNVtKe0WNEr-JKFgzHLorclyfvSxFDDFc2W58MYrRHkrATAAj66IMiaPFo_DaQMhSmhrAgl6oHwPUaXpkFMg5eyLiQ/s1600/002.png&quot; data-original-width=&quot;788&quot; data-original-height=&quot;334&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
因為是修改鍵盤快捷鍵, 所以, 點選 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Add Keyboard Shortcut&lt;/span&gt; :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil8mxAXM62PWdZQEvfk4-bqRjXzKCjehg4GXFopqGDYS58KGPmzR_cueqWLuHF8WbnyKoKNSYSvoNYcCwwA0c5h_uN4TbspcTvFPJUfUFTo2C9TWSabhn4RfCogNk1Vu4Mc0wBqRH_3oQ7/s1600/002_2.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil8mxAXM62PWdZQEvfk4-bqRjXzKCjehg4GXFopqGDYS58KGPmzR_cueqWLuHF8WbnyKoKNSYSvoNYcCwwA0c5h_uN4TbspcTvFPJUfUFTo2C9TWSabhn4RfCogNk1Vu4Mc0wBqRH_3oQ7/s1600/002_2.png&quot; data-original-width=&quot;512&quot; data-original-height=&quot;276&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
3) 這是 Content Assist 預設快捷鍵 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI9R3b5PZdwSpPVhzjwera0d8S4szNPDt58wpZo7OXWK7SX1fancdhSzN4hyeucE6jMuXCMZjF0nBYu95aZHlYgzLXwrpeWXg-PwpXHWpix3Q4bZwztdD9yKbh-i4mB5s5cLUmQRRNV037/s1600/003.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI9R3b5PZdwSpPVhzjwera0d8S4szNPDt58wpZo7OXWK7SX1fancdhSzN4hyeucE6jMuXCMZjF0nBYu95aZHlYgzLXwrpeWXg-PwpXHWpix3Q4bZwztdD9yKbh-i4mB5s5cLUmQRRNV037/s1600/003.png&quot; data-original-width=&quot;302&quot; data-original-height=&quot;178&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
直接在鍵盤按您要的快捷鍵, 如: &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Ctrl + Alt + /&lt;/span&gt;, 再按 OK 即可 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp21nTLy9QBQRvb8KqVKjhKT9Y5Jn_ZxC-6yraia0NmejdmT9hYO1UOBW9SxnFO3XOWRauOxc5fvmKyP_q8IWT4bZE4GMJWsShKtOuqiKqHGfEdTAuIN-GSMFjmvioVca8pSYXSV66Dgmc/s1600/003_2.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp21nTLy9QBQRvb8KqVKjhKT9Y5Jn_ZxC-6yraia0NmejdmT9hYO1UOBW9SxnFO3XOWRauOxc5fvmKyP_q8IWT4bZE4GMJWsShKtOuqiKqHGfEdTAuIN-GSMFjmvioVca8pSYXSV66Dgmc/s1600/003_2.png&quot; data-original-width=&quot;302&quot; data-original-height=&quot;178&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
4) 回到 Keymap 畫面, 這時您會發現多了一個自訂的快捷鍵了 :&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXY97F1rOkCyjcO-O84xq3z1ei05wppi16yWEWKyrxqOXT3YNE-TDsP8CRTqSd37_84ts9t-THZBbUPoRKrGIk__pmn5wg_1Eo2z06B_2remf81eTAnhTss-nVOAFYs8qQRO2lz8fJzeK4/s1600/004.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXY97F1rOkCyjcO-O84xq3z1ei05wppi16yWEWKyrxqOXT3YNE-TDsP8CRTqSd37_84ts9t-THZBbUPoRKrGIk__pmn5wg_1Eo2z06B_2remf81eTAnhTss-nVOAFYs8qQRO2lz8fJzeK4/s1600/004.png&quot; data-original-width=&quot;827&quot; data-original-height=&quot;422&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;div class=&quot;hiddenCopyRight&quot;&gt;&lt;a href=&quot;https://tomkuo139.blogspot.com&quot;&gt;昭佑.天翔&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/4588761891319234135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/4588761891319234135'/><link rel='alternate' type='text/html' href='http://tomkuo139.blogspot.com/2017/11/android-studio-base-on-intellij-idea.html' title='Android Studio (base on IntelliJ IDEA) 自訂快捷鍵'/><author><name>昭佑天翔</name><uri>http://www.blogger.com/profile/11034567866105362217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMgkch268IaLxcjKuwINfcNvupmVjPkcLhILaDlOe7Rh7STV04ihmNdMmKcyLXH_G9DLes60Slu39mQLySwn-9j6hz4gvBjM4bVocV3cAs24gCUe_-8WOOIdfUWX-9p1zxZzF1Lw-TySL7/s72-c/001.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7065255949366990244.post-8544560262177651747</id><published>2017-10-17T16:32:00.001+08:00</published><updated>2017-10-17T16:32:17.570+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Eclipse"/><title type='text'>Android Studio (base on IntelliJ IDEA) 與 Eclipse 的功能與快捷鍵對照</title><content type='html'>&lt;big&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;快捷鍵 :&lt;/span&gt;&lt;/big&gt;&lt;br&gt;
&lt;table
style=&quot;text-align: left; border-collapse: collapse; height: 259px; width: 100%;&quot; border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; background-color: rgb(255, 255, 153); width: 30%; height: 50px;&quot;&gt;項目&lt;/td&gt;
&lt;td style=&quot;text-align: center; background-color: rgb(255, 255, 153); width: 35%;&quot;&gt;Eclipse&lt;/td&gt;
&lt;td style=&quot;text-align: center; background-color: rgb(255, 255, 153); width: 35%;&quot;&gt;Android Studio&lt;br&gt;(base on IntelliJ IDEA)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: rgb(204, 255, 255); height: 40px;&quot;&gt;快速移到某個 Method / Function&amp;nbsp;的原始位置&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;F3&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Ctrl + B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: rgb(204, 255, 255); height: 60px;&quot;&gt;快速自動 import 所有使用到的 class&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Ctrl + Shift + O&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;br&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;在 File &amp;gt; Settings &amp;gt; Editor &amp;gt; General &amp;gt; Auto Import 預設沒有勾選下面兩項目 :&lt;br&gt;
&quot;Optimize imports on th fly&quot;&lt;br&gt;
&quot;Add unambiguous imports on the fly&quot;&lt;br&gt;
&lt;br&gt;
若有勾選上述兩項,&amp;nbsp;則會自動 import&amp;nbsp;用到的 class,與移除沒有用到的 class.&lt;br&gt;
&lt;br&gt;
若沒勾選上述兩項, 則只能透過 Alt + Enter, 一次 import&amp;nbsp;一個 class.&lt;br&gt;
&lt;br&gt;
若沒勾選上述兩項, 則只能透過 Ctrl + Alt + O&amp;nbsp;移除沒有用到的 class.&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: rgb(204, 255, 255); height: 40px;&quot;&gt;快速變更某個變數名稱&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Alt + Shift + R&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Shift + F6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;height: 40px; background-color: rgb(204, 255, 255);&quot;&gt;快速建立 Java Doc&amp;nbsp;備註&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Alt + Shift + J&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1) 先輸入&lt;small&gt;&amp;nbsp;&lt;/small&gt;/**&lt;br&gt;
2) 再按 Enter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;vertical-align: middle; height: 60px; background-color: rgb(204, 255, 255);&quot;&gt;快速顯示變數或函數的文件備註說明&lt;br&gt;
(Quick Document)&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;游標移到變數或函數名稱後,&lt;br&gt;
自動顯示&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;游標移到變數或函數名稱後,&lt;br&gt;
按 Ctrl + Q&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;vertical-align: middle; height: 40px; background-color: rgb(204, 255, 255);&quot;&gt;快速設定備註 /&amp;nbsp;取消備註&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Ctrl + /&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Ctrl + /&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;height: 40px; background-color: rgb(204, 255, 255);&quot;&gt;快速移到某一列&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Ctrl + L&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Ctrl + G&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;vertical-align: middle; height: 40px; background-color: rgb(204, 255, 255);&quot;&gt;快速移到下一個錯誤程式碼&lt;/td&gt;
&lt;td style=&quot;text-align: center; color: rgb(153, 153, 153);&quot;&gt;不支援&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;F2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;vertical-align: middle; height: 40px; background-color: rgb(204, 255, 255);&quot;&gt;快速移到上一個錯誤程式碼&lt;/td&gt;
&lt;td style=&quot;text-align: center; color: rgb(153, 153, 153);&quot;&gt;不支援&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Shift + F2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;vertical-align: middle; height: 40px; background-color: rgb(204, 255, 255);&quot;&gt;搜尋內容&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Ctrl + F&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Ctrl + F&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;vertical-align: middle; background-color: rgb(204, 255, 255); height: 40px;&quot;&gt;搜尋下一個內容&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Ctrl + K&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;F3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;vertical-align: middle; background-color: rgb(204, 255, 255); height: 40px;&quot;&gt;搜尋上一個內容&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Ctrl + Shift + K&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Shift + F3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;vertical-align: middle; height: 40px; background-color: rgb(204, 255, 255);&quot;&gt;取代內容&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Ctrl + F&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Ctrl + R&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;vertical-align: middle; height: 60px; background-color: rgb(204, 255, 255);&quot;&gt;欄編輯模式&lt;br&gt;
(Column Edit Mode)
&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Alt + Shift + A&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Alt +&amp;nbsp;滑鼠左鍵, 選擇編輯範圍&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;vertical-align: middle; height: 60px; background-color: rgb(204, 255, 255);&quot;&gt;程式碼的結構&lt;br&gt;
(Structure / Outline)
&lt;/td&gt;
&lt;td style=&quot;text-align: center; color: rgb(153, 153, 153);&quot;&gt;不支援&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Alt + 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;vertical-align: middle; height: 40px; background-color: rgb(204, 255, 255);&quot;&gt;搜尋 Keyword&amp;nbsp;在哪些檔案中&lt;/td&gt;
&lt;td style=&quot;text-align: center; color: rgb(153, 153, 153);&quot;&gt;不支援&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Ctrl + Shift + F&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;height: 40px; background-color: rgb(204, 255, 255);&quot;&gt;開啟 Content Assist 程式助手&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Alt + /&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Alt + /&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: rgb(204, 255, 255); height: 40px;&quot;&gt;得知某物件的 Hierarchy 繼承關係&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;F4&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Ctrl + H&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;vertical-align: middle; height: 40px; background-color: rgb(204, 255, 255);&quot;&gt;Run&amp;nbsp;執行&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Ctrl + F11&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Shift + F10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;br&gt;
&lt;big&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;功能 &lt;/span&gt;&lt;/big&gt;&lt;big&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;:&lt;/span&gt;&lt;/big&gt;&lt;br&gt;
&lt;table style=&quot;text-align: left; border-collapse: collapse; height: 210px; width: 100%;&quot; border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; background-color: rgb(255, 255, 153); width: 30%; height: 50px;&quot;&gt;項目&lt;/td&gt;
&lt;td style=&quot;text-align: center; background-color: rgb(255, 255, 153); width: 35%;&quot;&gt;Eclipse&lt;/td&gt;
&lt;td style=&quot;text-align: center; background-color: rgb(255, 255, 153); width: 35%;&quot;&gt;Android Studio&lt;br&gt;
(base on IntelliJ IDEA)
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: rgb(204, 255, 255); height: 40px;&quot;&gt;程式碼的結構 (Structure / Outline) &lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Menu: Navigate &amp;gt; Show In &amp;gt; Outline&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Menu: View &amp;gt; Tool Windows &amp;gt; Structure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: rgb(204, 255, 255); height: 40px;&quot;&gt;Clone&amp;nbsp;編輯器&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Menu: Window &amp;gt; Editor &amp;gt; Clone&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: rgb(153, 153, 153);&quot;&gt;不支援&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: rgb(204, 255, 255); height: 40px;&quot;&gt;搜尋 Keyword&amp;nbsp;在哪些檔案中&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Menu: Search &amp;gt; File&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Menu: Edit &amp;gt; Find &amp;gt; Find in Path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;vertical-align: middle; height: 40px; background-color: rgb(204, 255, 255);&quot;&gt;執行 Android App&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;專案右鍵: Run As &amp;gt; Android Application&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Menu: Run &amp;gt; Run app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;vertical-align: middle; height: 60px; background-color: rgb(204, 255, 255);&quot;&gt;產生 Android APK&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;專案右鍵: Android Tools &amp;gt; Export Signed&amp;nbsp; Application Package&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Menu: Build &amp;gt; Generate Signed APK&lt;br&gt;
&lt;small&gt;注意事項： &lt;a href=&quot;http://tomkuo139.blogspot.com/2017/10/android-studio-generate-signed-apk-auto.html&quot;&gt; 項目一&lt;/a&gt;&lt;/small&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;div class=&quot;hiddenCopyRight&quot;&gt;&lt;a href=&quot;https://tomkuo139.blogspot.com&quot;&gt;昭佑.天翔&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/8544560262177651747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/8544560262177651747'/><link rel='alternate' type='text/html' href='http://tomkuo139.blogspot.com/2017/10/android-studio-base-on-intellij-idea.html' title='Android Studio (base on IntelliJ IDEA) 與 Eclipse 的功能與快捷鍵對照'/><author><name>昭佑天翔</name><uri>http://www.blogger.com/profile/11034567866105362217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7065255949366990244.post-3858211988200258663</id><published>2017-10-17T16:22:00.001+08:00</published><updated>2017-10-17T16:22:39.264+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><title type='text'>Android Studio generate signed APK auto add uses-permission</title><content type='html'>在 Android Studio 中,&lt;br&gt;
&lt;br&gt;
進行 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Generate Signed APK&lt;/span&gt; 產生 APK 檔案後,&lt;br&gt;
&lt;br&gt;
會發現在 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;AndroidManifest.xml&lt;/span&gt; 檔案中, 被自動加入了一些不是自己設定的 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;uses-permission&lt;/span&gt; 權限, 如: READ_PHONE_STATE,&lt;br&gt;
&lt;br&gt;
而導致上傳到 Google Play 會要求隱私權說明而上傳失敗,&lt;br&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;br&gt;
關於 Android Studio 會自動加入一些 uses-permission 權限,&lt;br&gt;
&lt;br&gt;
是因為 AndroidManifest.xml 內的 &quot;&lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;android:targetSdkVersion 設定值太小 or 沒有設定&lt;/span&gt;&quot; 的緣故,&lt;br&gt;
&lt;br&gt;
所以, 除了檢查 &lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;Module 本身&lt;/span&gt;的 AndroidManifest.xml 之外, 也要檢查 &lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;Dependencies&lt;/span&gt; 的 AndroidManifest.xml 內的 android:targetSdkVersion 設定,&lt;br&gt;
&lt;br&gt;
參考相關資訊 1: &lt;a href=&quot;https://stackoverflow.com/questions/30277242/why-is-my-app-asking-for-phone-id-permission&quot; target=&quot;_blank&quot;&gt;https://stackoverflow.com/questions/30277242/why-is-my-app-asking-for-phone-id-permission&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
參考相關資訊 2: &lt;a href=&quot;https://stackoverflow.com/questions/27490598/why-does-my-app-has-the-read-phone-state-permission-although-its-not-declared-i&quot; target=&quot;_blank&quot;&gt;https://stackoverflow.com/questions/27490598/why-does-my-app-has-the-read-phone-state-permission-although-its-not-declared-i&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;div class=&quot;hiddenCopyRight&quot;&gt;&lt;a href=&quot;https://tomkuo139.blogspot.com&quot;&gt;昭佑.天翔&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/3858211988200258663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/3858211988200258663'/><link rel='alternate' type='text/html' href='http://tomkuo139.blogspot.com/2017/10/android-studio-generate-signed-apk-auto.html' title='Android Studio generate signed APK auto add uses-permission'/><author><name>昭佑天翔</name><uri>http://www.blogger.com/profile/11034567866105362217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7065255949366990244.post-9078032496289791603</id><published>2017-07-13T17:48:00.000+08:00</published><updated>2017-07-13T17:48:11.878+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><title type='text'>Windows 10 突然開機變很慢, 執行速度也超慢的</title><content type='html'>&lt;br&gt;
在某一天, 我的 Windows 10 突然開機變很慢, 執行速度也超慢的,&lt;br&gt;
&lt;br&gt;
開個機要十幾分鐘, 好不容易進入 Windows 桌面了,&lt;br&gt;
&lt;br&gt;
開個檔案總管也要五六分鐘, 天啊, 這要如何做事情啊,&lt;br&gt;
&lt;br&gt;
上網搜尋解決方案以及結果, 如下 :&lt;br&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;table style=&quot;text-align: left; width: 100%; border-collapse: collapse; height: 401px;&quot; border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width:120px; height: 50px; background-color: rgb(204, 255, 255);&quot;&gt;可能原因&lt;br&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: rgb(204, 255, 255);&quot;&gt;說明&lt;br&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: rgb(204, 255, 255);&quot;&gt;結論&lt;br&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;height: 55px; background-color: rgb(255, 255, 204);&quot;&gt;Windows 安全性更新&lt;/td&gt;
&lt;td&gt;看過 Windows 設定 &amp;gt; 更新與安全性 &amp;gt; Windows Update, 最近一次更新在 6/18, 但 7/7 晚上突然才這樣的&lt;/td&gt;
&lt;td&gt;排除這個原因&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;height: 55px; background-color: rgb(255, 255, 204);&quot;&gt;防毒軟體更新&lt;/td&gt;
&lt;td&gt;目前只用 Windows Defender, 所以開啟 Windows Defender, 查看更新紀錄, 最近一次更新在 7/5, 而 7/6 使用正常, 7/7 早上也正常, 但 7/7 晚上才這樣&lt;/td&gt;
&lt;td&gt;排除這個原因&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;height: 55px; background-color: rgb(255, 255, 204);&quot;&gt;電腦中木馬&lt;/td&gt;
&lt;td&gt;可是我有啟動 Windows Defender, 而且 7/7 早上使用還很正常, 7/7 晚上才突然這樣, 這期間也沒有上網&lt;/td&gt;
&lt;td&gt;排除這個原因&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;height: 55px; background-color: rgb(255, 255, 204);&quot;&gt;硬碟沒裝好&lt;/td&gt;
&lt;td&gt;7/7 晚上筆電確實有不小心沒拿好, 碰撞到地面&lt;/td&gt;
&lt;td&gt;重新將硬碟拔除再裝好, 還是沒改善&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;height: 55px; background-color: rgb(255, 255, 204);&quot;&gt;記憶體沒裝好&lt;/td&gt;
&lt;td&gt;7/7 晚上筆電確實有不小心沒拿好, 碰撞到地面&lt;/td&gt;
&lt;td&gt;重新將記憶體拔除再裝好, 還是沒改善&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: rgb(255, 255, 204);&quot; colspan=&quot;1&quot; rowspan=&quot;6&quot;&gt;磁碟 100%&lt;/td&gt;
&lt;td style=&quot;height: 35px;&quot;&gt;查看工作管理員, 磁碟使用率 100%, 哇哩, 找到問題了&lt;/td&gt;
&lt;td&gt;&lt;br&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;height: 35px;&quot;&gt;檢查硬碟有無壞軌：磁碟 &amp;gt; 內容 &amp;gt; 工具 &amp;gt; 檢查錯誤&lt;/td&gt;
&lt;td&gt;沒有壞軌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;height: 35px;&quot;&gt;網路上建議：關閉 Connected User Experiences and Telemetry 服務&lt;/td&gt;
&lt;td&gt;沒有改善&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;height: 35px;&quot;&gt;網路上建議：關閉 HomeGroupListener 服務&lt;/td&gt;
&lt;td&gt;沒有改善&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;height: 35px;&quot;&gt;網路上建議：關閉 Superfetch 服務&lt;/td&gt;
&lt;td&gt;沒有改善&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;vertical-align: middle; height: 35px;&quot;&gt;網路上建議：設定 &amp;gt; 復原 &amp;gt; 重設電腦&lt;br&gt;(等同重灌電腦, 但不需要 Windows 安裝片)&lt;/td&gt;
&lt;td style=&quot;vertical-align: middle;&quot;&gt;上述情況都無法改善, 而且也使用三年多了, 而且不需要 Windows 安裝片, 那就來重設電腦吧, 結果, 問題解決了.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;div class=&quot;hiddenCopyRight&quot;&gt;&lt;a href=&quot;https://tomkuo139.blogspot.com&quot;&gt;昭佑.天翔&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/9078032496289791603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/9078032496289791603'/><link rel='alternate' type='text/html' href='http://tomkuo139.blogspot.com/2017/07/windows-10.html' title='Windows 10 突然開機變很慢, 執行速度也超慢的'/><author><name>昭佑天翔</name><uri>http://www.blogger.com/profile/11034567866105362217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7065255949366990244.post-3782749973453153659</id><published>2017-07-13T17:36:00.000+08:00</published><updated>2017-07-13T17:36:24.973+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Linux"/><title type='text'>Linux GRUB 開機順序設定</title><content type='html'>&lt;br&gt;
在 Command-Line 模式,&lt;br&gt;
&lt;br&gt;
輸入 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;sudo gedit /etc/default/grub&lt;/span&gt; 來開啟 grub 設定檔,&lt;br&gt;
&lt;br&gt;
找到 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;GRUB_DEFAULT=&quot;&lt;span style=&quot;color: rgb(204, 51, 204);&quot;&gt;0&lt;/span&gt;&quot;&lt;/span&gt; 這個設定項目,&lt;br&gt;
&lt;br&gt;
可以修改這個值來決定&lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;預設的開機位置 (從 0 開始算)&lt;/span&gt;,&lt;br&gt;
&lt;br&gt;
例如, Windows 在 grub 第三個位置, 則修改為 GRUB_DEFAULT=&quot;2&quot;,&lt;br&gt;
&lt;br&gt;
修改後儲存再退回到 Command-Line,&lt;br&gt;
&lt;br&gt;
然後輸入 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;sudo update-grub&lt;/span&gt; 來生效,&lt;br&gt;
&lt;br&gt;
這時候重新開機, 就會看到 grub 預設的開機位置已有改變了.&lt;br&gt;
&lt;br&gt;
&lt;div class=&quot;hiddenCopyRight&quot;&gt;&lt;a href=&quot;https://tomkuo139.blogspot.com&quot;&gt;昭佑.天翔&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/3782749973453153659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/3782749973453153659'/><link rel='alternate' type='text/html' href='http://tomkuo139.blogspot.com/2017/07/linux-grub.html' title='Linux GRUB 開機順序設定'/><author><name>昭佑天翔</name><uri>http://www.blogger.com/profile/11034567866105362217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7065255949366990244.post-5307490744360961753</id><published>2017-06-22T17:40:00.000+08:00</published><updated>2017-06-22T17:40:03.211+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Game Engine"/><title type='text'>Unity3d 簡介</title><content type='html'>&lt;br&gt;
&lt;big&gt;&lt;big&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;起因&lt;/span&gt;&lt;/big&gt;&lt;/big&gt;&lt;br&gt;
&lt;br&gt;
之前開發 Android 遊戲, 因為都是用 Android 原生物件處理,&lt;br&gt;
&lt;br&gt;
所以, 開發益智遊戲（如：知識達人、撲克牌系列、數獨）還可以應付,&lt;br&gt;
&lt;br&gt;
但對於遊戲有更複雜需求（&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;粒子特效、碰撞處理、物理引擎、3D、跨平台&lt;/span&gt;）, 可能就必須仰賴 Game Engine (遊戲引擎) 了,&lt;br&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;hr style=&quot;width: 100%; height: 2px;&quot;&gt;&lt;br&gt;
&lt;big&gt;&lt;big&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;比較&lt;/span&gt;&lt;/big&gt;&lt;/big&gt;&lt;br&gt;
&lt;br&gt;
選擇的遊戲引擎方案有幾種: &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Unreal
Engine(UE)&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;&lt;/span&gt;、&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Unity&lt;/span&gt;、&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Cocos&lt;/span&gt;、&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;libGDX&lt;/span&gt;、&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;AndEngine&lt;/span&gt;,&lt;br&gt;
&lt;br&gt;
在使用 Game Engine 之前,&lt;br&gt;
&lt;br&gt;
必須先比較與粗略了解自己想要用的 Game Engine,&lt;br&gt;
&lt;br&gt;
上述符合我複雜需求的 Game Engine, 就是 Unreal / Unity / Cocos 之間做選擇, 而且都有免費版本可供下載 &lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;(不是試用版喔)&lt;/span&gt;,&lt;br&gt;
&lt;br&gt;
網路上也有 Unity / Cocos 相關的比較文章: &lt;a href=&quot;https://www.google.com.tw/search?q=unity3d+%3F+cocos2d+%3F%3F&quot;&gt;點選此處&lt;/a&gt;,&lt;br&gt;
&lt;br&gt;
也有 Unity / Unreal Engine 相關的比較文章: &lt;a href=&quot;https://www.google.com.tw/search?q=unreal+unity&quot;&gt;點選此處&lt;/a&gt;,&lt;br&gt;
&lt;br&gt;
雖然 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Unreal Engine&amp;nbsp;是世界搜尋 Game Engine 第一位, 也一直是大型團隊與大型遊戲開發的首選 &lt;/span&gt; &lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;(我是獨立開發者, 沒有足夠人力與 $$, 難以駕馭)&lt;/span&gt;,
&lt;br&gt;
&lt;br&gt;
所以, 就比較 Unity 與 Cocos,&lt;br&gt;
&lt;br&gt;
以前結論是: 做 2d game 就用 Cocos2d, 3d game 就用 Unity3d,&lt;br&gt;
&lt;br&gt;
但自從 Unity 跨入 2d game 領域, 而 Cocos 也跨入 3d game 領域 (Cocos3d),&lt;br&gt;
&lt;br&gt;
而 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Unity 在 3d 領域無可取代, 而 2d 領域愈漸成熟&lt;/span&gt;,&lt;br&gt;
&lt;br&gt;
反觀, Cocos3d 與 Unity 有著一段不小差距 &lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;(當然 Cocos3d 也會愈來愈好, 就看您有沒有時間等待囉)&lt;/span&gt;,&lt;br&gt;
&lt;br&gt;
而在&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;網路中文教學 / Youtube 中文影片 / 中文書籍上, Unity 也比較多&lt;/span&gt;&lt;span
style=&quot;font-weight: bold; color: red;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;(因為我英文不是很好, 需要中文手冊快速入門)&lt;/span&gt;&lt;/span&gt;,&lt;br&gt;
&lt;br&gt;
不過, &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Cocos 官方也有完整且是最新的中文教學&lt;/span&gt;&lt;span
style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt; (&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;對一般新手而言, 我是覺得夠用了&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;,&lt;br&gt;
&lt;br&gt;
至於新手建構一個 Hello World 專案, 且可運行在手機, 或打包成 Android APK 檔案, Unity 比 Cocos 簡單多了,&lt;br&gt;
&lt;br&gt;
&lt;span style=&quot;font-weight: bold; color: red; background-color: transparent;&quot;&gt;總之, 若您 1) 不在乎是否開源, 2) 想做 2d/3d 手遊, 3) 想用 JavaScript / C# 開發, 4) 免費軟體但不在乎打開 App 會出現 Unity Logo,&lt;br&gt;
&lt;br&gt;
那用 Unity 就對了.&lt;/span&gt;&lt;br&gt;
&lt;hr style=&quot;width: 100%; height: 2px;&quot;&gt;&lt;br&gt;
&lt;big&gt;&lt;big&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Unity 資訊&lt;/span&gt;&lt;/big&gt;&lt;/big&gt;&lt;br&gt;
&lt;br&gt;
Unity 維基百科: &lt;a href=&quot;https://zh.wikipedia.org/wiki/Unity_%28%E6%B8%B8%E6%88%8F%E5%BC%95%E6%93%8E%29&quot;&gt;https://zh.wikipedia.org/wiki/Unity_(游戏引擎)&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
Unity 中文官網: &lt;a href=&quot;https://unity3d.com/cn/&quot;&gt;https://unity3d.com/cn/&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
Unity Download 網址: &lt;a href=&quot;https://unity3d.com/unity/download&quot;&gt;https://unity3d.com/unity/download&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
Download 有分四個版本, Personal 是免費版本但功能有限制,&lt;br&gt;
&lt;br&gt;
下載來的檔案是 UnityDownloadAssistant.exe, 這是一個安裝程序檔, 而非 Setup 離線安裝檔,&lt;br&gt;
&lt;br&gt;
至於 UnityDownloadAssistant.exe 安裝使用, 可以參考這網址: &lt;a href=&quot;https://kknews.cc/zh-tw/game/gv28vy9.html&quot;&gt;https://kknews.cc/zh-tw/game/gv28vy9.html&lt;br&gt;
&lt;/a&gt;&lt;br&gt;
若要下載 Unity Setup 離線安裝檔 or Unity Old Version, 可以到這網址: &lt;a href=&quot;https://unity3d.com/cn/get-unity/download/archive&quot;&gt;https://unity3d.com/cn/get-unity/download/archive&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Unity 官方教學網址: &lt;a href=&quot;https://unity3d.com/cn/learn&quot;&gt;https://unity3d.com/cn/learn&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
Unity 網路中文教學 (CG 數位學習網, 超像線上教學中文書籍, 超推薦的): &lt;a href=&quot;http://www.cg.com.tw/Unity&quot;&gt;http://www.cg.com.tw/Unity&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;div class=&quot;hiddenCopyRight&quot;&gt;&lt;a href=&quot;https://tomkuo139.blogspot.com&quot;&gt;昭佑.天翔&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/5307490744360961753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/5307490744360961753'/><link rel='alternate' type='text/html' href='http://tomkuo139.blogspot.com/2017/06/unity3d.html' title='Unity3d 簡介'/><author><name>昭佑天翔</name><uri>http://www.blogger.com/profile/11034567866105362217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7065255949366990244.post-3485736908291858989</id><published>2017-06-22T17:32:00.000+08:00</published><updated>2017-06-22T17:46:34.136+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Game Engine"/><title type='text'>Cocos2d 簡介</title><content type='html'>&lt;br&gt;
&lt;big&gt;&lt;big&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;起因&lt;/span&gt;&lt;/big&gt;&lt;/big&gt;&lt;br&gt;
&lt;br&gt;
之前開發 Android 遊戲, 因為都是用 Android 原生物件處理,&lt;br&gt;
&lt;br&gt;
所以, 開發益智遊戲（如：知識達人、撲克牌系列、數獨）還可以應付,&lt;br&gt;
&lt;br&gt;
但對於遊戲有更複雜需求（&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;粒子特效、碰撞處理、物理引擎、3D、跨平台&lt;/span&gt;）, 可能就必須仰賴 Game Engine (遊戲引擎) 了,&lt;br&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;hr style=&quot;width: 100%; height: 2px;&quot;&gt;&lt;br&gt;
&lt;big&gt;&lt;big&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;比較&lt;/span&gt;&lt;/big&gt;&lt;/big&gt;&lt;br&gt;
&lt;br&gt;
選擇的遊戲引擎方案有幾種: &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Unreal Engine(UE)&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;&lt;/span&gt;、&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Unity&lt;/span&gt;、&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Cocos&lt;/span&gt;、&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;libGDX&lt;/span&gt;、&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;AndEngine&lt;/span&gt;,&lt;br&gt;
&lt;br&gt;
在使用 Game Engine 之前,&lt;br&gt;
&lt;br&gt;
必須先比較與粗略了解自己想要用的 Game Engine,&lt;br&gt;
&lt;br&gt;
上述符合我複雜需求的 Game Engine, 就是 Unreal / Unity / Cocos 之間做選擇, 而且都有免費版本可供下載 &lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;(不是試用版喔)&lt;/span&gt;,&lt;br&gt;
&lt;br&gt;
網路上也有 Unity / Cocos 相關的比較文章: &lt;a href=&quot;https://www.google.com.tw/search?q=unity3d+%3F+cocos2d+%3F%3F&quot;&gt;點選此處&lt;/a&gt;,&lt;br&gt;
&lt;br&gt;
也有 Unity / Unreal Engine 相關的比較文章: &lt;a href=&quot;https://www.google.com.tw/search?q=unreal+unity&quot;&gt;點選此處&lt;/a&gt;,&lt;br&gt;
&lt;br&gt;
雖然 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Unreal 是世界搜尋 Game Engine 第一位, 也一直是大型團隊與大型遊戲開發的首選 &lt;/span&gt; &lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;我是獨立開發者, 沒有足夠人力與 $$, 難以駕馭&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;)&lt;/span&gt;, &lt;br&gt;
&lt;br&gt;
所以, 就比較 Unity 與 Cocos,&lt;br&gt;
&lt;br&gt;
以前結論是: 做 2d game 就用 Cocos2d, 3d game 就用 Unity3d,&lt;br&gt;
&lt;br&gt;
但自從 Unity 跨入 2d game 領域, 而 Cocos 也跨入 3d game 領域 (Cocos3d),&lt;br&gt;
&lt;br&gt;
而 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Unity 在 3d 領域無可取代, 而 2d 領域愈漸成熟&lt;/span&gt;,&lt;br&gt;
&lt;br&gt;
反觀, Cocos3d 與 Unity 有著一段不小差距 &lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;(當然 Cocos3d 也會愈來愈好, 就看您有沒有時間等待囉)&lt;/span&gt;,&lt;br&gt;
&lt;br&gt;
而在&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;網路中文教學 / &lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Youtube 中文影片 / &lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;中文書籍上, Unity 也比較多&lt;span
style=&quot;color: red;&quot;&gt; (因為我英文不是很好, 需要中文手冊快速入門)&lt;/span&gt;&lt;/span&gt;,&lt;br&gt;
&lt;br&gt;
不過, &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Cocos 官方也有完整&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;且是最新&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;的中文教學&lt;span style=&quot;color: red;&quot;&gt; (對一般新手而言, 我是覺得夠用了)&lt;/span&gt;&lt;/span&gt;,&lt;br&gt;
&lt;br&gt;
至於新手建構一個 Hello World 專案, 且可運行在手機, 或打包成 Android APK 檔案, 比 Unity 麻煩一些, 但還可以接受.&lt;br&gt;
&lt;br&gt;
&lt;span style=&quot;font-weight: bold; color: red; background-color: transparent;&quot;&gt;總之, 若您 1) 喜歡開源, 2) 只想做 2d 手遊, 3) 想用 JavaScript / C++ / Lua 開發, 4) 不想付費也不想破解, 5) 不想免費但打開 App 會出現 Unity Logo,&lt;br&gt;
&lt;br&gt;
那用 Cocos 就對了.&lt;/span&gt;&lt;br&gt;
&lt;hr style=&quot;width: 100%; height: 2px;&quot;&gt;&lt;br&gt;
&lt;big&gt;&lt;big&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Cocos2s 資訊&lt;/span&gt;&lt;/big&gt;&lt;/big&gt;&lt;br&gt;
&lt;br&gt;
Cocos2d 維基百科: &lt;a href=&quot;https://zh.wikipedia.org/wiki/Cocos2d&quot;&gt;https://zh.wikipedia.org/wiki/Cocos2d&lt;br&gt;
&lt;/a&gt;&lt;br&gt;
Cocos2d 英文官網: &lt;a href=&quot;http://cocos2d.org/&quot;&gt;http://cocos2d.org/&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
Cocos2d 中文官網: &lt;a href=&quot;http://www.cocos.com/?v=CN&quot;&gt;http://www.cocos.com/?v=CN&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;big&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Cocos SDK 相關名稱 :&lt;/span&gt;&lt;/big&gt;&lt;br&gt;
&lt;br&gt;
&lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;Cocos2d&lt;/span&gt;: Cocos SDK, 程式語言 Python.&lt;br&gt;
&lt;br&gt;
&lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;Cocos2d-x&lt;/span&gt;: Cocos SDK, 程式語言很多, C++ / JavaScript / Lua.&lt;br&gt;
&lt;br&gt;
&lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;Cocos2d-Java&lt;/span&gt;: Cocos SDK, 程式語言 Java (似乎沒有後續進展).&lt;br&gt;
&lt;br&gt;
&lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;Cocos2d-xna&lt;/span&gt;: Cocos SDK, 程式語言 C#&lt;br&gt;
&lt;br&gt;
&lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;Cocos2d-ObjC&lt;/span&gt;: Cocos SDK, 程式語言 Object-C, 用來開發 iOS App.&lt;br&gt;
&lt;br&gt;
&lt;big&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br&gt;
Cocos IDE 相關名稱 :&lt;/span&gt;&lt;br style=&quot;font-weight: bold;&quot;&gt;
&lt;/big&gt;
&lt;br&gt;
&lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;Cocos Code IDE&lt;/span&gt;: Cocos2d-x 純腳本代碼編輯器, 程式語言 Lua, 現建議改用 Cocos Creator.&lt;br&gt;
&lt;br&gt;
&lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;Cocos Studio&lt;/span&gt;: Cocos2d-x 早期 IDE, 程式語言 C++, 現建議改用 Cocos Creator.&lt;br&gt;
&lt;br&gt;
&lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;Cocos Creator&lt;/span&gt;: Cocos2d-x 最新 IDE, 程式語言 JavaScript / C++ / Lua.&lt;br&gt;
&lt;br&gt;
&lt;div style=&quot;margin-left: 40px;&quot;&gt;下載網址: &lt;a href=&quot;http://www.cocos2d-x.org/download&quot;&gt;http://www.cocos2d-x.org/download&lt;/a&gt;&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;div style=&quot;margin-left: 40px;&quot;&gt;官方手冊: &lt;a href=&quot;http://www.cocos.com/docs/creator/getting-started/index.html&quot;&gt;http://www.cocos.com/docs/creator/getting-started/index.html&lt;/a&gt;&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;div style=&quot;margin-left: 40px;&quot;&gt;Creator Roadmap 開發歷程軸: &lt;a href=&quot;https://trello.com/b/JWVRRxMG/cocos-creator-roadmap&quot;&gt;https://trello.com/b/JWVRRxMG/cocos-creator-roadmap&lt;/a&gt;&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;Cocos Editor&lt;/span&gt;: Cocos2d-Java IDE (似乎找不到下載網址).&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;big&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;更多 Cocos 疑難雜症 :&lt;br&gt;
&lt;br&gt;
&lt;/span&gt;&lt;/big&gt;可以參考這個網站: &lt;a href=&quot;http://cocos2dx.logdown.com&quot;&gt;http://cocos2dx.logdown.com&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;div class=&quot;hiddenCopyRight&quot;&gt;&lt;a href=&quot;https://tomkuo139.blogspot.com&quot;&gt;昭佑.天翔&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/3485736908291858989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/3485736908291858989'/><link rel='alternate' type='text/html' href='http://tomkuo139.blogspot.com/2017/06/cocos2d.html' title='Cocos2d 簡介'/><author><name>昭佑天翔</name><uri>http://www.blogger.com/profile/11034567866105362217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7065255949366990244.post-215213905577104642</id><published>2017-06-22T17:29:00.001+08:00</published><updated>2017-06-22T17:42:13.996+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Game Engine"/><title type='text'>Unreal Engine 簡介</title><content type='html'>&lt;br&gt;
&lt;big&gt;&lt;big&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;起因&lt;/span&gt;&lt;/big&gt;&lt;/big&gt;&lt;br&gt;
&lt;br&gt;
之前開發 Android 遊戲, 因為都是用 Android 原生物件處理,&lt;br&gt;
&lt;br&gt;
所以, 開發益智遊戲（如：知識達人、撲克牌系列、數獨）還可以應付,&lt;br&gt;
&lt;br&gt;
但對於遊戲有更複雜需求（&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;粒子特效、碰撞處理、物理引擎、3D、跨平台&lt;/span&gt;）, 可能就必須仰賴 Game Engine (遊戲引擎) 了,&lt;br&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;hr style=&quot;width: 100%; height: 2px;&quot;&gt;&lt;br&gt;
&lt;big&gt;&lt;big&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;比較&lt;/span&gt;&lt;/big&gt;&lt;/big&gt;&lt;br&gt;
&lt;br&gt;
選擇的遊戲引擎方案有幾種: &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Unreal Engine(UE)&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;&lt;/span&gt;、&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Unity&lt;/span&gt;、&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Cocos&lt;/span&gt;、&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;libGDX&lt;/span&gt;、&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;AndEngine&lt;/span&gt;,&lt;br&gt;
&lt;br&gt;
在使用 Game Engine 之前,&lt;br&gt;
&lt;br&gt;
必須先比較與粗略了解自己想要用的 Game Engine,&lt;br&gt;
&lt;br&gt;
上述符合我複雜需求的 Game Engine, 就是 Unreal / Unity / Cocos 之間做選擇, 而且都有免費版本可供下載 &lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;(不是試用版喔)&lt;/span&gt;,&lt;br&gt;
&lt;br&gt;
網路上也有 Unity / Cocos 相關的比較文章: &lt;a href=&quot;https://www.google.com.tw/search?q=unity3d+%3F+cocos2d+%3F%3F&quot;&gt;點選此處&lt;/a&gt;,&lt;br&gt;
&lt;br&gt;
也有 Unity / Unreal Engine 相關的比較文章: &lt;a href=&quot;https://www.google.com.tw/search?q=unreal+unity&quot;&gt;點選此處&lt;/a&gt;,&lt;br&gt;
&lt;br&gt;
雖然 &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;Unreal Engine&amp;nbsp; 是世界搜尋 Game Engine 第一位, 也一直是大型團隊與大型遊戲開發的首選 &lt;/span&gt; &lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;(我是獨立開發者, 沒有足夠人力與 $$, 難以駕馭)&lt;/span&gt;,
&lt;br&gt;
&lt;br&gt;
不過, 還是會大致分享一下 Unreal Engine 相關資訊.&lt;br&gt;
&lt;hr style=&quot;width: 100%; height: 2px;&quot;&gt;&lt;br&gt;
&lt;big&gt;&lt;big&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Unreal Engine 資訊&lt;/span&gt;&lt;/big&gt;&lt;/big&gt;&lt;br&gt;
&lt;br&gt;
Unreal Engine 維基百科: &lt;a href=&quot;https://zh.wikipedia.org/wiki/%E8%99%9A%E5%B9%BB%E5%BC%95%E6%93%8E&quot;&gt;https://zh.wikipedia.org/wiki/虚幻引擎&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
Unreal Engine 中文官網: &lt;a href=&quot;https://www.unrealengine.com&quot;&gt;https://www.unrealengine.com&lt;/a&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://unity3d.com/cn/&quot;&gt;&lt;br&gt;
&lt;/a&gt;&lt;br&gt;
Unreal Engine Download 網址: &lt;a href=&quot;https://www.unrealengine.com/register&quot;&gt;https://www.unrealengine.com/register&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
Unreal Engine 官方中文教學網址: &lt;a href=&quot;https://docs.unrealengine.com/latest/CHN/index.html&quot;&gt;https://docs.unrealengine.com/latest/CHN/index.html&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
Unreal 網路中文教學 (CG 數位學習網, 超像線上教學中文書籍, 可惜某些章節有亂碼): &lt;a href=&quot;http://www.cg.com.tw/Unreal&quot;&gt;http://www.cg.com.tw/Unreal&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
某玩家操作 Unreal Engine 心得 1: &lt;a href=&quot;https://www.ptt.cc/bbs/GameDesign/M.1451553810.A.B1E.html&quot;&gt;https://www.ptt.cc/bbs/GameDesign/M.1451553810.A.B1E.html&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
某玩家操作 Unreal Engine 心得 2: &lt;a href=&quot;https://www.ptt.cc/bbs/GameDesign/M.1451559210.A.739.html&quot;&gt;https://www.ptt.cc/bbs/GameDesign/M.1451559210.A.739.html&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;div class=&quot;hiddenCopyRight&quot;&gt;&lt;a href=&quot;https://tomkuo139.blogspot.com&quot;&gt;昭佑.天翔&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/215213905577104642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/215213905577104642'/><link rel='alternate' type='text/html' href='http://tomkuo139.blogspot.com/2017/06/unreal-engine.html' title='Unreal Engine 簡介'/><author><name>昭佑天翔</name><uri>http://www.blogger.com/profile/11034567866105362217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7065255949366990244.post-5731541886233635147</id><published>2017-05-09T20:08:00.000+08:00</published><updated>2017-05-09T20:08:19.589+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><title type='text'>Android Voume Control 音量控制</title><content type='html'>&lt;br&gt;
對於 Android 相關的 Volume 音量的控制, 參考如下 :&lt;br&gt;
&lt;br&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;//【音量鈕】改為控制【某種音量】大小&lt;/span&gt;&lt;br&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;setVolumeControlStream( AudioManager.&lt;span style=&quot;color: rgb(153, 51, 153);&quot;&gt;STREAM_TYPE&lt;/span&gt; );&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
如: setVolumeControlStream( AudioManager.STREAM_MUSIC ); &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;// 音量鈕控制媒體音量大小&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;// 取得【音量控制管理員】&lt;/span&gt;&lt;br&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;AudioManager &lt;span style=&quot;color: rgb(153, 51, 153);&quot;&gt;am&lt;/span&gt; = (AudioManager)&lt;span style=&quot;color: rgb(153, 51, 153);&quot;&gt;context&lt;/span&gt;.getSystemService( Context.AUDIO_SERVICE );&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;// 取得【最大音量】&lt;/span&gt;&lt;br&gt;
int vVolumnMax = &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;&lt;span style=&quot;color: rgb(153, 51, 153);&quot;&gt;am&lt;/span&gt;.getStreamMaxVolume( AudioManager.&lt;span style=&quot;color: rgb(153, 51, 153);&quot;&gt;STREAM_TYPE&lt;/span&gt; );&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;// 取得【目前音量】&lt;/span&gt;&lt;br&gt;
int vVolumnCur = &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;&lt;span style=&quot;color: rgb(153, 51, 153);&quot;&gt;am&lt;/span&gt;.getStreamVolume( AudioManager.&lt;span style=&quot;color: rgb(153, 51, 153);&quot;&gt;STREAM_TYPE&lt;/span&gt; );&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;// 設定【音量】&lt;/span&gt;&lt;br&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;&lt;span style=&quot;color: rgb(153, 51, 153);&quot;&gt;am&lt;/span&gt;.setStreamVolume( int &lt;span style=&quot;color: rgb(153, 51, 153);&quot;&gt;streamType&lt;/span&gt;, int &lt;span style=&quot;color: rgb(153, 51, 153);&quot;&gt;volumeSize&lt;/span&gt;, int &lt;span style=&quot;color: rgb(153, 51, 153);&quot;&gt;flags&lt;/span&gt; )&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
其中, &lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;STREAM_TYPE&lt;/span&gt; 有以下幾種 :&lt;br&gt;
系統音量: &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;STREAM_SYSTEM&lt;/span&gt;&lt;br&gt;
媒體音量: &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;STREAM_MUSIC&lt;/span&gt;&lt;br&gt;
鈴聲音量: &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;STREAM_RING&lt;/span&gt;&lt;br&gt;
通話音量: &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;STREAM_VOICE_CALL&lt;/span&gt;&lt;br&gt;
通知音量: &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;STREAM_NOTIFICATION&lt;/span&gt;&lt;br&gt;
提示音量: &lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;STREAM_ALARM&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(153, 51, 153);&quot;&gt;flags&lt;/span&gt; 有以下幾種 :&lt;br&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;FLAG_PLAY_SOUND&lt;/span&gt;: 調整音量時, 同時也撥放範例音效.&lt;br&gt;
&lt;span style=&quot;font-weight: bold; color: rgb(51, 51, 255);&quot;&gt;FLAG_SHOW_UI&lt;/span&gt;: 調整音量時, 同時也顯示音量調整列.&lt;br&gt;
&lt;br&gt;
以上, 參考看看囉 ^ ^.&lt;br&gt;
&lt;br&gt;
&lt;div class=&quot;hiddenCopyRight&quot;&gt;&lt;a href=&quot;https://tomkuo139.blogspot.com&quot;&gt;昭佑.天翔&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/5731541886233635147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7065255949366990244/posts/default/5731541886233635147'/><link rel='alternate' type='text/html' href='http://tomkuo139.blogspot.com/2017/05/android-voume-control.html' title='Android Voume Control 音量控制'/><author><name>昭佑天翔</name><uri>http://www.blogger.com/profile/11034567866105362217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry></feed>