使用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(乏適),表示訓練不足,需要使用更多層的卷積神經網路。