什麽是微調預先訓練神經網路法?
簡單來說就是「使用已經訓練好的模型進行調整與重新訓練」,微調預先訓練神經網路法 (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 程式碼。