使用更複雜的卷積神經網路辨識Cifar-10圖庫

(12-2使用更複雜的卷積神經網路辨識Cifar10圖庫.ipynb)

接續使用Cifar-10圖庫訓練卷積神經網路,使用更複雜的卷積神經網路,表示增加卷積層與卷積核個數,是否能提升識別Cifar-10圖庫的正確率。

Step1)匯入資料與修改資料

匯入cifar10圖庫,對輸入的訓練資料與測試資料進行處理。

程式說明

第1到11行:匯入函式庫。

第12行:設定繪圖模組plt的中文字型。

第13行:使用函式load_data下載資料集cifar10的訓練資料到train_X與train_y,測試資料到test_X與test_y。

第14到15行:讓每個值除以255,使圖片每個byte的數值介於0到1之間。

第16行:使用函式to_categorical轉換train_y為one-hot編碼,使用變數train_y2參考到此轉換結果。

第17行:使用函式to_categorical轉換test_y為one-hot編碼,使用變數test_y2參考到此轉換結果。


Step2)建立模型、訓練模型與評估模型

使用Sequential建立模型、訓練模型與評估模型。

程式說明

第1行:使用Sequential建立卷積神經網路模組。

第2行:使用Conv2D新增二維的卷積層,使用3x3的卷積核(Kernel),使用64個卷積核,設定padding為same,設定激勵函式為relu,輸入圖片維度為(32,32,3),3表示頻道(channel)個數,因為彩色相片的每個像素由3個byte組成。

第3行:使用Conv2D新增二維的卷積層,使用3x3的卷積核(Kernel),使用64個卷積核,設定padding為same,設定激勵函式為relu。

第4行:使用MaxPooling2D新增二維的MaxPooling,設定感應範圍為2x2,每次向右或向下移動2格。

第5行:使用Conv2D新增二維的卷積層,使用3x3的卷積核(Kernel) ,使用128個卷積核,設定padding為same,設定激勵函式為relu。

第6行:使用Conv2D新增二維的卷積層,使用3x3的卷積核(Kernel) ,使用128個卷積核,設定padding為same,設定激勵函式為relu。

第7行:使用MaxPooling2D新增二維的MaxPooling,設定感應範圍為2x2,每次向右或向下移動2格。

第8到10行:重複第5到7行程式碼。

第11行:使用Flatten新增攤平層。

第12行:使用Dense新增全連接層,有512個神經元,使用relu為激勵函式。

第13行:使用Dense新增全連接層,有10個神經元,使用softmax為激勵函式。

第14行:設定優化器為adam,設定損失函式為categorical_crossentropy,表示此模型為多類別分類。設定metrics為accuracy,表示訓練過程要紀錄每次訓練的正確率。

第15行:使用函式summary輸出整個模組的摘要。

第16行:使用train_X為訓練資料集,train_y為訓練目標集,設定validation_data為(test_X, test_y),表示使用test_X為測試資料集,test_y為測試目標集。所有輸入資料需要跑10次,每200筆輸入資料更新一次參數。設定verbose為2,表示每個epochs輸出一個訓練紀錄。使用變數history接收訓練過程。

第17到18行:使用evaluate輸入測試資料test_X與test_y2評估模型的正確率,將評估結果指定給變數score,顯示變數score的第二個元素,表示顯示正確率。

Step3)繪製模組正確率與損失值圖

繪製訓練過程的模組正確率圖與損失值圖。

程式說明

第1行:取出訓練過程中訓練資料的正確率,使用plot繪製到圖表上。

第2行:取出訓練過程中測試資料的正確率,使用plot繪製到圖表上。

第3到4行: Y軸標籤為「Accuracy」,X軸標籤為「Epoch」。

第5行:在左上角設定圖說。

第6行:繪製模組正確率圖到螢幕上。

第7行:取出訓練過程中訓練資料的損失值,使用plot繪製到圖表上。

第8行:取出訓練過程中測試資料的損失值,使用plot繪製到圖表上。

第9到10行: Y軸標籤為「Loss」,X軸標籤為「Epoch」。

第11行:在左上角設定圖說。

第12行:繪製模組損失值圖到螢幕上。

Step4) 儲存模組與載入模組

將模組的參數儲存起來,就不需要重新訓練,下一次可以直接載入使用。

程式說明

第1行:使用函式save儲存模型到資料夾cifar_model。

第2行:使用函式load_model載入資料夾cifar_model到模型。


Step5) 建立混淆矩陣

使用混淆矩陣找出辨識錯誤的類別與個數。

程式說明

第1行:使用函式predict進行模型預測,以test_X為輸入,變數結果儲存到變數pred_y

第2行:此時變數pred_y為one-hot編碼,使用函式argmax輸入變數pred_y還原回數字。

第3行:使用函式flatten將二維陣列test_y轉換成一維陣列test_y2。

第4行:使用函式crosstab比較目標結果test_y2與預測結果pred_y,產生混淆矩陣。

Step6) 顯示圖片與模型預測結果

將圖片顯示在螢幕上,並顯示原本類別與模型預測的類別。

程式說明

第1行:使用load_model載入本節範例模型cifar_model。

第2行:字典dic儲存Cifar-10圖庫的分類編號與名稱。

第3到14行:自訂函式draw_pic用於顯示圖片,每列5張圖片,並標示原始分類與辨識後分類。

第4到13行:使用for迴圈執行跑5次,每次顯示一張圖片,迴圈變數i由0到4,每次遞增1。

第5行:使用函式gcf新增一個圖片。

第6行:設定圖片大小為寬12英寸高1英寸。

第7行:使用subplot劃分成1列5欄,每張圖片放在編號i+1的位置,表示由左到右依序擺放。

第8行:使用imshow顯示圖片,將輸入手寫數字陣列pics第index+i個元素,轉換維度為32x32x3,設定cmap為binary。

第9到10行:設定標題為原始分類名稱與辨識後的分類名稱

第11行:設定標題字體大小為10。

第12到13行:不顯示X軸刻度與Y軸刻度。

第14行:使用迴圈新增一列五張圖片後,使用函式show顯示在螢幕上。

第15行:使用函式flatten將二維陣列test_y轉換成一維陣列test_y2。

第16行:使用函式predict進行模型預測,以test_X為輸入,變數結果儲存到變數pred_y。

第17行:此時變數pred_y為one-hot編碼,使用函式argmax輸入變數pred_y還原回數值。

第18到19行:使用for迴圈呼叫函式draw_pic顯示前25個圖片到螢幕上。

Step7)顯示辨識錯誤的圖片

找出辨識錯誤的前10個圖片,並顯示在螢幕上。

程式說明

第1行:使用load_model載入本節範例模型cifar_model。

第2行:字典dic儲存Cifar-10圖庫的分類編號與名稱。

第3到13行:自訂函式draw_one_pic用於顯示一張圖片,並標示原始分類與辨識後分類。

第4行:使用函式gcf新增一個圖片。

第5行:設定圖片大小為寬1英寸高1英寸。

第6行:使用subplot劃分成1列1欄,每張圖片放在編號1的位置。

第7行:使用imshow顯示圖片,將圖片陣列pics第index個元素,維度為32x32x3,設定cmap為binary。

第8到9行:設定標題為原始分類名稱與辨識後的分類名稱

第10行:設定標題字體大小為10。

第11到12行:不顯示X軸刻度與Y軸刻度。

第13行:使用函式show顯示圖片到螢幕上。

第14行:使用函式flatten將二維陣列test_y轉換成一維陣列test_y2。

第15行:使用函式predict進行模型預測,以test_X為輸入,變數結果儲存到變數pred_y。

第16行:此時變數pred_y為one-hot編碼,使用函式argmax輸入變數pred_y還原回數值。

第17行:建立一個資料集df,欄位label對應變數test_y2,欄位pred對應變數pred_y。

第18行:比較欄位label與欄位pred的不同之處,資料集df_diff參考到欄位label與欄位pred不相同的元素。

第19行:從資料集df_diff取前10個到資料集df_diff10。

第20到21行:使用for迴圈取出陣列df_diff10所有元素,使用函式draw_one_pic顯示該索引值的圖片。

Step8)顯示每一層的設定

顯示模組的每一層名稱與卷積核個數,與每一層的詳細設定。

程式說明

第1行:使用函式load_model載入模型cifar_model。

第2到8行:使用for迴圈找出卷積神經網路的每一層。

第3行:印出分隔線。

第4到7行:若該層的名字有出現「conv」,則顯示該層名稱與卷積核個數,否則只顯示名稱。

第8行:顯示該層的設定。

Step9)印出卷積核

印出卷積神經網路的卷積核。

程式說明

第1行:使用函式load_model載入模型cifar_model。

第2到5行:定義函式show_filters,顯示卷積核的數值。

第3行:呼叫函式get_weights會回傳模組的卷積核參數與位移量,卷積核參數回傳給filters,位移量回傳給biases。

第4到5行:顯示卷積核的維度與數值。

第6行:顯示第一層的卷積核數值到螢幕上。

Step10)顯示卷積核所辨別出來的影像

顯示卷積核所辨別出來的影像到螢幕上。

程式說明

第1行:使用函式load_model載入模型cifar_model。

第2到11行:自訂函式show_pic。

第3行:使用函式gcf新增一個圖片。

第4行:設定圖片大小為寬0.8英寸高0.8英寸。

第5行:使用subplot劃分成1列1欄,圖片放在編號1的位置。

第6行:使用imshow顯示圖片,輸入圖片陣列x,將圖片陣列x重新調整為寬度32個點高度32個點的彩色照片,設定cmap為binary。

第7行:設定圖片標題為「pic」。

第8行:設定標題字體大小為10。

第9到10行:不顯示X軸刻度與Y軸刻度。

第11行:使用函式show顯示圖片到螢幕上。

第12行:設定outputs為model.layers[4].output,輸出卷積神經網路的第五層。

第13行:使用函式summary顯示模組的摘要。

第14行:使用函式show_pic顯示圖片train_X[1]到螢幕上。

第15行:將train_X[1]的維度轉換成(1, 32, 32, 3),變數img參考到此結果。

第16行:使用函式predict輸入變數img進行預測,變數pred_img參考到此結果。

第17行:設定變數c為1。

第18行:設定圖片大小為寬10英寸高8英寸。

第19到25行:使用巢狀迴圈顯示64個卷積核運算結果,使用函式subplot分割圖片為8列8欄,將圖片放在第c個位置(第21行),不顯示X軸刻度與Y軸刻度(第22到23行),顯示變數pred_img第c-1個元素(第24行),變數c遞增1(第25行)。

第26行:使用函式show顯示圖片到螢幕上。