keras中VGG19預訓練模型的使用

-牧野-發表於2018-07-24

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中定義的名稱如下,可以根據名稱輕鬆獲取該層特徵:

相關文章