keras中VGG19預訓練模型的使用


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)
  1. include_top: 是否包含最后的3個全連接層

  2. 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)


加了全連接層,所以base_model.get_layer('fc2') 里參數也可以是 flatten、fc1、fc2和predictions 。

VGG19各個模塊在keras中定義的名稱如下,可以根據名稱輕松獲取該層特征:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM