VGG16迁移学习实现
VGG16遷移學習實現
本文討論遷移學習,它是一個非常強大的深度學習技術,在不同領域有很多應用。動機很簡單,可以打個比方來解釋。假設想學習一種新的語言,比如西班牙語,那么從已經掌握的另一種語言(比如英語)學起,可能是有用的。
按照這種思路,計算機視覺研究人員通常使用預訓練 CNN 來生成新任務的表示,其中數據集可能不夠大,無法從頭開始訓練整個 CNN。另一個常見的策略是采用在 ImageNet 上預訓練好的網絡,然后通過微調整個網絡來適應新任務。
這里提出的例子受啟于 Francois Chollet 寫的關于 Keras 的一個非常有名的博客(https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html)。
這個想法是使用在像 ImageNet 這樣的大型數據集上預先訓練的 VGG16 網絡。注意,訓練的計算量可能相當大,因此使用已經預訓練的網絡是有意義的:
圖 1. 一個 VGG16 網絡
如何使用 VGG16 呢?Keras 使其變得容易,因為有一個標準的 VGG16 模型可以作為一個庫來使用,預先計算好的權重會自動下載。注意,這里省略了最后一層,并將其替換為自定義層,該層將在預定義的 VGG16 的頂部進行微調。
例如,下面將學習如何分類 Kaggle 提供的狗和貓的圖片:
-
從 Kaggle(https://www.kaggle.com/c/dogs-vs-cats/data)下載狗和貓的數據,并創建一個包含兩個子目錄(train 和 validation)的數據目錄,每個子目錄有兩個額外的子目錄,分別是 dogs 和 cats。
-
導入稍后將用于計算的 Keras 模塊,并保存一些有用的常量:
-
加載 ImageNet 上預訓練的 VGG16 網絡,省略最后一層,因為這里將在預建的 VGG16 網絡的頂部添加自定義分類網絡,并替換原來 VGG16 的分類層:
上述代碼的輸出如下:
-
凍結預訓練的 VGG16 網絡的一定數量的較低層。在這里決定凍結最前面的 15 層:
-
為了分類,添加一組自定義的頂層:
-
自定義網絡應該單獨進行預訓練,為了簡單起見,這里省略了這部分,將此任務交給讀者:
-
創建一個新的網絡,這是預訓練的 VGG16 網絡和預訓練的定制網絡的組合體:
- 重新訓練組合的新模型,仍然保持 VGG16 的 15 個最低層處于凍結狀態。在這個特定的例子中,也使用 Image Augumentator 來增強訓練集:
- 在組合網絡上評估結果:
解讀分析
一個標準的 VGG16 網絡已經在整個 ImageNet 上進行了預訓練,并且使用了預先計算好的從網上下載的權值。這個網絡和一個已經被單獨訓練的定制網絡并置在一起。然后,并置的網絡作為一個整體被重新訓練,同時保持 VGG16 的 15 個低層的參數不變。
這個組合非常有效。它可以節省大量的計算能力,重新利用已經工作的 VGG16 網絡進行遷移學習,該網絡已經在 ImageNet 上完成了學習,可以將此學習應用到新的特定領域,通過微調去完成分類任務。
根據具體的分類任務,有幾條經驗法則需要考慮:
? 如果新的數據集很小,并且與ImageNet數據集相似,那么可以凍結所有的VGG16網絡,并僅重新訓練定制網絡。這樣,也可以最小化組合網絡過度擬合的風險。
可運行代碼 base_model.layers:layer.trainable=False 凍結所有低層參數。
? 如果新數據集很大,并且與ImageNet數據集相似,那么可以重新訓練整個并置網絡。仍然保持預先計算的權重作為訓練起點,并通過幾次迭代進行微調:
可運行代碼 model.layers:layer.trainable=True 取消凍結所有低層的參數。
? 如果新數據集與ImageNet數據集有很大的不同,實際上仍然可以使用預訓練模型的權值進行初始化。在這種情況下,將有足夠的數據和信心通過整個網絡進行微調。更多信息請訪問http://cs231n.github.io/transfer-learning/。
總結
以上是生活随笔為你收集整理的VGG16迁移学习实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PyTorch数据加载处理
- 下一篇: TensorFlow创建DeepDrea