使用Cifar-10圖庫訓練卷積神經網路

使用Cifar-10圖庫訓練卷積神經網路,Cifar-10圖庫擁有60000張圖片,分成10個類別,每個類別6000張圖片,每張圖片寬32像素高32像素。將60000張圖片分成訓練集為50000張圖片與測試集10000張圖片。訓練集每個類別挑選5000張圖片,共50000張圖片,測試集每個類別挑選1000張圖片,共10000張圖片。圖片分成「飛機」、「汽車」、「鳥」、「貓」、「鹿」、「狗」、「青蛙」、「馬」、「船」、「卡車」等10個類別。在keras函式庫可以載入Cifar-10圖庫,程式碼如下。

from tensorflow.keras.datasets import cifar10

(train_X, train_y), (test_X, test_y) = cifar10.load_data()

【說明】

train_X為訓練集的圖檔,train_y為訓練集的類別。

test_X為測試集的圖檔,test_y為測試集的類別。

12-1 使用卷積神經網路辨識Cifar-10圖庫

(12-1使用卷積神經網路辨識Cifar10圖庫.ipynb)

本範例使用Cifar-10圖庫,每張圖片由長寬各32個像素組成,總共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行:使用MaxPooling2D新增二維的MaxPooling,設定感應範圍為2x2,每次向右或向下移動2格。

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

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

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

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

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

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

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

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

第12到13行:使用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行:繪製模組損失值圖到螢幕上。

可以發現訓練集的正確率與測試集的正確率大約75%左右,屬於Underfit(乏適),表示訓練不足,需要使用更多層的卷積神經網路。