fbpx

Keras 教學 - 透過微調預先訓練神經網路法訓練高準確度 CNN 模型

什麽是微調預先訓練神經網路法?

簡單來說就是「使用已經訓練好的模型進行調整與重新訓練」,微調預先訓練神經網路法 (Fine-tuning a pretrained network) 是指在 CNN 訓練的時候,使用已經預先訓練好的神經網路模型的權重作為初始權重,然後再進行微調的過程。這種方法的目的是利用已經訓練好的模型所學習到的知識,來加快 CNN 的訓練速度並提高準確度。

常見的預先訓練神經網路有 Google 的 Inception 和 ImageNet,以及 Microsoft 的 ResNet。這些預先訓練的模型已經在大量圖像數據上進行過訓練,因此能夠提供豐富的圖像特徵。

在使用微調預先訓練神經網路法的時候,通常會將預先訓練的模型的某些層的權重固定,而只對其他層進行微調。這樣可以避免預先訓練模型所學習到的知識被破壞,同時又能夠利用這些知識來加快 CNN 的訓練。

如何進行微調預先訓練神經網路?

首先我們要先取得一個已經訓練完整的 CNN 網路模型,然後解凍 (Freeze) 一些卷積基底「頂部」的某些層用於特徵擷取,並對新加入的 Full Connection Layer 進行聯合訓練。由於稍稍調整了原本 CNN 基底的表示法,所以這個過程叫做「微調」。圖解如下:

微調預先訓練神經網路

採用上一篇文章的「預先訓練神經網路特徵萃取法」大約可以獲得 0.95 的正確率,接下來我們測試現在介紹的「微調預先訓練神經網路法」看看能不能再提昇識別準確率。

Keras 如何透過微調預先訓練神經網路法強化模型訓練

首先我們先選定要強化的模型,然後解凍部份 CNN 基底重新進行訓練。Keras 程式碼如下:

conv_base.trainable = True

for layer in conv_base.layers:
    if layer.name == 'block5_conv1':
        layer.trainable = True         # 解凍 CNN 基底
    else:
        layer.trainable = False

model.compile(loss='binary_crossentropy',
              optimizer=optimizers.RMSprop(lr=1e-5), # 低學習率
              metrics=['acc'])

history = model.fit_generator(
      train_generator,
      steps_per_epoch=100,
      epochs=100,
      validation_data=validation_generator,
      validation_steps=50)

由於我們要訓練的資料不多,只希望將原本 VGG 16 的基底做些微的調整,因此設定比較低的 RMSP 學習率,才不會破壞太多的參數。解凍的基底如下:

進行重新驗證,獲得的結果如下:

將 VGG16 CNN Base 部份 Layer 進行解凍,重新進行聯合學習,在這個案例可以提昇約 2% 左右的正確率,讓整體正確率到達 97%
其實如果不解凍 CNN 也是會有不錯的效果,大約正確率是 96%,以上同樣附上完整的 CoLab 程式碼GitHub 程式碼