fine-tuning


fine-tuning是微調的意思,是用別人訓練好的模型(即pre-trained model),加上我們自己的數據,來訓練新的模型。fine tune相當於使用別人的模型的前幾層,來提取淺層特征,然后在最后再落入我們自己的分類中。

一般來說我們自己需要做的方向,比如在一些特定的領域的識別分類中,我們很難拿到大量的數據。因為像在ImageNet上畢竟是一個千萬級的圖像數據庫,通常我們可能只能拿到幾千張或者幾萬張某一特定領域的圖像,比如識別衣服啊、標志啊、生物種類等等。在這種情況下重新訓練一個新的網絡是比較復雜的,而且參數不好調整,數據量也不夠,因此fine-tuning微調就是一個比較理想的選擇。

 

如果想網絡中某幾層參數不變,可以設置對應learning rate為0讓這些層的參數不學習

 

關於fine-tuning兩個比較好的博客:

http://www.cnblogs.com/louyihang-loves-baiyan/p/5038758.html

http://www.cnblogs.com/alexcai/p/5469478.html

知乎上的一個問題:

https://www.zhihu.com/question/35754716

 

實踐中總結:對於fine-tuning,網絡中層的名字一模一樣的會復用參數,名字不一樣的會去做初始化。

對於相同的名字的層,如果輸入輸出與fine-tuning的不一樣,就會報如下錯誤:

很明顯,報錯是shape不一樣。名字相同,會認為是同一個層,但實際的輸入輸出又不同,即參數個數都不相同,就會報錯。

 

對於一個網絡,fine-tuning的類是21類,你的類是2類,但你的網絡結構與fine-tuning的幾乎一模一樣,只是輸出的類別數目不同,這個時候你可以保持前面幾層不變,改變最后一兩層的輸入輸出,但這時也必須同時改已經修改了輸入輸出個數的層的名字。名字不相同了,就不會賦值而去初始化。如果不改,相同名字的層的shape不同了,又要報錯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM