小型數據集卷積神經網絡CNN訓練策略

在很多場景下,我們都只有幾千甚至幾百個樣本,而要使用這樣的小樣本來訓練一個cnn網絡又避免過擬合,需要採用一些策略,目前主要採用的策略主要有以下三種:

  • 訓練一個小型的模型
  • 使用預訓練的網絡做特徵提取
  • 對預訓練的網絡進行微調

訓練一個小型的模型

這種方案主要適用的場景是用於比較簡單的任務場景情況,可以設計一個比較小的模型,並做相應的正則化避免過擬合,也可做些數據增強增加樣本量,這樣即使在較小的樣本數量,也能得到較爲不錯的結果。

這些小型化策略包括不限於:

  • 降低網絡的深度
  • 降低網絡每層參數的數量

也可使用數據增強來增加樣本集

datagen = ImageDataGenerator(
    rotation_range, # rotation_range是角度值(在 0~180 範圍內),表示圖像隨機旋轉的角度範圍
    width_shift_range, 
    height_shift_range, # width_shift 和 height_shift 是圖像在水平或垂直方向上平移的範圍(相對於總寬度或總高度的比例)
    shear_range, # shear_range是隨機錯切變換的角度
    zoom_range, # zoom_range是圖像隨機縮放的範圍
    horizontal_flip, # horizontal_flip 是隨機將一半圖像水平翻轉
    fill_mode ) # fill_mode是用於填充新創建像素的方法,這些新像素可能來自於旋轉或寬度/高度平移

使用預訓練的網絡做特徵提取

這種方案是將一些已經經過大數據樣本訓練過的網絡結構遷移到新的樣本中進行訓練。由於預訓練的網絡中保存了很多有用的特徵提取信息,可以在小樣本上有效的提取到有價值的特徵信息,當然由於網絡最終任務類型的區別,例如預訓練的網絡是1000種類型的分類,而我們只需要用於二分類,因此一般的做法是保留網絡的CNN結構也就是卷積池化層,但後續的全連接層(分類層)需要重新設計和訓練。

在keras中導入模型後,只需要設置include_top 即可指定是否包含全連接分類層

from keras.applications import VGG16
conv_base = VGG16(weights='imagenet',
include_top=False,
input_shape=(150, 150, 3))

使用下面類似的代碼即可完成新的全連接分類層

model.add(layers.Dense(256, activation='relu', input_dim=4 * 4 * 512))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(1, activation='sigmoid'))

需要注意的是:由於預訓練卷積層存儲了相關的特徵提取參數信息,而新的全連接層則被隨機初始化,所以不能全網絡進行訓練,一般的做法是“凍結”網絡卷積層,也就是預訓練的網絡參數不會被反向傳播調整,只調整新加入的全連接及分類層的參數,這樣參數數量也較小,可以使用小樣本獲得不錯的訓練結果

對預訓練的網絡進行微調

類似於上面的做法,再進行延伸,當然我們也可以只凍結一部分的卷積層,例如只留下最後一層卷積層可以被訓練,而凍結之前的所有層,如圖所示。

使用下面的代碼表示凍結指定名稱層之前的所有層

conv_base.trainable = True
set_trainable = False
for layer in conv_base.layers:
    if layer.name == 'block5_conv1':
        set_trainable = True
    if set_trainable:
        layer.trainable = True
    else:
        layer.trainable = False

以下結論摘自《Python深度學習》,本文的內容也出自於對書中內容的理解。

  • 卷積神經網絡是用於計算機視覺任務的最佳機器學習模型。即使在非常小的數據集上也可以從頭開始訓練一個卷積神經網絡,而且得到的結果還不錯。

  • 在小型數據集上的主要問題是過擬合。在處理圖像數據時,數據增強是一種降低過擬合的強大方法。

  • 利用特徵提取,可以很容易將現有的卷積神經網絡複用於新的數據集。對於小型圖像數據集,這是一種很有價值的方法。

  • 作爲特徵提取的補充,你還可以使用微調,將現有模型之前學到的一些數據表示應用於新問題。這種方法可以進一步提高模型性能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章