預先訓練的模型
先建立卷積神經網路模型,將圖片輸入模型進行訓練,達成不錯效果後,公布模型參數讓全世界使用者下載使用,稱作預先訓練的模型(pre-trained models),例如:VGG16、VGG19與ResNet50。以下介紹VGG16,VGG16使用總共16層的卷積神經網路,其中13層卷積層與3層全連接層,從ImageNet取得1百萬張以上圖片進行模型訓練,分成1000個類別,每張圖片寬224像素高224像素,經過一個星期的計算才完成模型訓練。
在keras函式庫可以載入VGG16模型,程式碼如下。
from keras.applications.vgg16 import VGG16
model = VGG16(weights='imagenet', include_top=True)
【說明】
weights='imagenet',表示使用ImageNet參數初始化模型參數。
include_top=True,表示包含全連結層。
Step1)匯入VGG16模型
程式說明
第1到6行:匯入函式庫。
第7行:建立VGG16模型,使用ImageNet參數初始化模型參數。設定include_top為True,表示包含全連結層。
Step2)輸入圖片進行預測分類
程式說明
第1行:使用函式load_img載入圖片pic.jpg,設定大小為寬度224像素高度224像素。
第2到3行:使用函式imshow與show顯示圖片到螢幕上。
第4行:使用函式img_to_array 讀取圖片,轉換成三維陣列。
第5行:使用函式array([]),轉換成四維陣列。
第6行:使用函式preprocess_input將輸入VGG16資料進行預處理,可以提高卷積神經網路的運算效果。預處理將輸入值減去平均值,如果需要還可以除以標準差。
第7行:使用函式predict預估所屬類別,使用變數pred參考到此結果。
第8行:使用函式decode_predictions取出前五高的類別。
13-2 顯示VGG16模型的組成
顯示模型的卷積層、池化層、全連接層結構、卷積核的數值與卷積核的輸出影像。
Step1)印出模組的摘要
程式說明
第1行:建立VGG16模型,使用變數model參考到此模型。。
第2行:使用函式summary輸出整個模組的摘要。
Step2)印出模組各卷積層的詳細設定
程式說明
第1到7行: 使用for迴圈找出卷積神經網路的每一層。
第2行: 印出分隔線。
第3到6行:若該層的名字有出現「conv」,則顯示該層名稱與卷積核個數,否則只顯示名稱。
第7行:顯示該層的設定。
Step3)找出模組的卷積核
程式說明
第1到4行:定義函式show_filters,顯示卷積核的數值。
第2行:呼叫函式get_weights會回傳模組的卷積核參數與位移量,卷積核參數回傳給filters,位移量回傳給biases。
第3到4行:顯示卷積核的維度與數值。
第5行:顯示第二層的卷積核數值到螢幕上。
Step4)顯示某一層經由卷積核(filter)所辨別出來的影像
程式說明
第1行:建立VGG16模型,使用變數model參考到此模型。
第2行:設定outputs為model.layers[2].output,輸出卷積神經網路的第三層。
第3行:使用函式summary顯示模組的摘要。
第4行:使用函式load_img載入圖片pic.jpg,設定大小為寬度224像素高度224像素。
第5行:使用函式imshow顯示圖片到螢幕上。
第6行:使用函式img_to_array 讀取圖片,轉換成三維陣列。
第7行:使用函式array([]),轉換成四維陣列。
第8行:使用函式preprocess_input將輸入VGG16資料進行預處理,可以提高卷積神經網路的運算效果,預處理將輸入值減去平均值,如果需要還可以除以標準差。
第9行:使用函式predict計算特徵值。
第10行:設定變數c為1。
第11行:設定圖片大小為寬10英寸高8英寸。
第12到18行:使用巢狀迴圈顯示64個卷積核運算結果,使用函式subplot分割圖片為8列8欄,將圖片放在第c個位置(第14行)。不顯示X軸刻度與Y軸刻度(第15到16行)。顯示變數pred_img第c-1個元素(第17行)。變數c遞增1(第18行)。
第19行:使用函式show顯示圖片到螢幕上。