預先訓練的模型

先建立卷積神經網路模型,將圖片輸入模型進行訓練,達成不錯效果後,公布模型參數讓全世界使用者下載使用,稱作預先訓練的模型(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,表示包含全連結層。

13-1 使用VGG16辨識圖片

(13使用模型VGG16.ipynb)

使用VGG16卷積神經網路辨識圖片,步驟如下。

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顯示圖片到螢幕上。