使用更複雜的卷積神經網路辨識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顯示圖片到螢幕上。