keras提供了VGG19在ImageNet上的預訓練權重模型文件,其他可用的模型還有VGG16、Xception、ResNet50、InceptionV3 4個。
VGG19在keras中的定義:
def VGG19(include_top=True, weights='imagenet',
input_tensor=None, input_shape=None,
pooling=None,
classes=1000)
-
include_top: 是否包含最后的3個全連接層
-
weights: 定義為‘imagenet’,表示加載在imagenet數據庫上訓練的預訓練權重,定義為None則不加載權重,參數隨機初始化
包含最后3個全連接層的VGG19模型下載地址: https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg19_weights_tf_dim_ordering_tf_kernels.h5
不包含最后3個全連接層的VGG19模型下載地址: https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg19_weights_tf_dim_ordering_tf_kernels_notop.h5
不包含全連接層的VGG19模型文件名稱是" vgg19_weights_tf_dim_ordering_tf_kernels_notop.h5 " ,文件大小約80MB;
包含全連接層的VGG19模型文件名稱是 " vgg19_weights_tf_dim_ordering_tf_kernels.h5 " ,文件大小約575MB
ubuntu中,下載的VGG19模型文件的本地路徑是 ~/.keras/models/ , .keras是一個隱藏文件夾。可以預先下載模型文件放到對應目錄下,程序執行時檢測到存在模型文件就不會再下載了。
使用VGG19預訓練模型分類圖片的例子
# coding: utf-8
from keras.applications.vgg19 import VGG19
from keras.preprocessing import image
from keras.applications.vgg19 import preprocess_input
from keras.models import Model
import numpy as np
base_model = VGG19(weights='imagenet', include_top=True)
img_path = 'cat.jpg'
img = image.load_img(img_path, target_size=(224, 224)) # 加載圖像,歸一化大小
x = image.img_to_array(img) # 序列化
x = np.expand_dims(x, axis=0) # 展開
x = preprocess_input(x) # 預處理到0~1
out = base_model.predict(x) # 預測結果,1000維的向量
print(out.shape) # (1,1000)
程序首先加載帶3個全連接層的VGG19模型,然后讀入圖片並做格式轉換和歸一化等處理后執行VGG模型預測,預測結果out是一個1000維的向量,代表了預測結果分別屬於10000個分類的概率,形狀是(1,1000),out內容如下:
使用VGG19預訓練模型提取VGG19網絡中任意層的輸出特征的例子
上個例子可以看到keras對VGG網絡的封裝異常好,簡單幾行代碼就可以分類圖片。keras中VGG預訓練參數模型另一個更常用的應用是可以提取VGG網絡中任意一層的特征。
以下例子提取的是VGG19網絡中第5個卷積層的輸出特征(也是第1個全連接層的輸入特征)
# coding: utf-8
from keras.applications.vgg19 import VGG19
from keras.preprocessing import image
from keras.applications.vgg19 import preprocess_input
from keras.models import Model
import numpy as np
base_model = VGG19(weights='imagenet', include_top=False)
model = Model(inputs=base_model.input, outputs=base_model.get_layer('block5_pool').output)
img_path = 'cat.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
block5_pool_features = model.predict(x)
print(block5_pool_features.shape) #(1, 7, 7, 512)
base_model.get_layer('block5_pool')中的block5_pool參數定義了獲取的是第5個卷積層的輸出。第5層的輸出是一個 1×7×7×512的向量,如下:
也可以設置為加載最后3個全連接層的VGG19網絡,就可以獲取最后3個全連接層的輸出了:
# coding: utf-8
from keras.applications.vgg19 import VGG19
from keras.preprocessing import image
from keras.applications.vgg19 import preprocess_input
from keras.models import Model
import numpy as np
base_model = VGG19(weights='imagenet', include_top=True)
model = Model(inputs=base_model.input, outputs=base_model.get_layer('fc2').output)
img_path = 'cat.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
fc2 = model.predict(x)
print(fc2.shape) #(1, 4096)