FineTuning機制的分析
為什么用FineTuning
使用別人訓練好的網絡模型進行訓練,前提是必須和別人用同一個網絡,因為參數是根據網絡而來的。當然最后一層是可以修改的,因為我們的數據可能並沒有1000類,而只有幾類。把最后一層的輸出類別和層的名稱改一下。用別人的參數、修改后的網絡和自己的數據進行訓練,使得參數適應自己的數據,這樣一個過程,通常稱之為微調(fine tuning). 也就是說,我們所擁有的數據很小,不足以訓練一個網絡,這是用別人訓練過的參數以及網絡訓練我們自己的數據的過程就是微調(fine tuning)。
怎么FineTunning
Fine tuning 之所以有效的原因是,用到的網絡是同一個網絡,用到的參數是別人已經訓練好的數據,所以在准確率上會有保證,這時候再稍微調整別人訓練好的參數,往往會能達到我們想要的效果。
調整net文件
因為我們自己的數據集變化了,所以要修改net網絡文件,大部分的內容都不變,變的只有data層、output層、batch的大小、前幾層的學習率。data層需要改成我們自己的數據,output層的修改主要包括層的名字(使用不同的名字,預訓練網絡中該層的參數會重新初始化)和輸出類別數目,並且要減小batch的大小,但是要和GPU的大小成比例。
對於學習率的調整是很重要的,如果有的層的參數不需要更新,可以把學習率設置為0.比如有4個全連接層,希望C層的參數不會改變,C前面的AB層的參數也不會改變,這種情況也就是D層的梯度不往前反向傳播到D層的輸入blob(也就是C層的輸出blob 沒有得到梯度),你可以通過設置D層的學習率為0,layer的梯度就不會反向傳播了,前面的所有layer的參數也就不會改變了。對於有參數的更新的層,學習率可以減小10倍或100倍(最后一層除外),對於最后一層的學習率可以提高10倍,加快學習速率,因為該層需要重新學習。
調整solver文件
solver.prototxt文件中的參數一般只需要修改net訓練網絡的名稱、學習率、最大迭代次數和snapshot。首先將net從預訓練使用的net換為現在使用的net,然后降低學習率(一般降低10倍或者100倍),同時,將最大迭代次數和snapshot的數目相對減少。
Fine Tuning的原理
Fine tuning的原理就是利用已知的網絡結構和已知的網絡參數,修改output層為我們自己的層,微調最后一層前的所有層的參數,加大最后一層的學習率,因為最后一層我們需要重新學習,所以與其它層相比要有相對較大的學習率,這樣就有效利用了深度神經網絡強大的泛化能力,又免去了設計復雜的模型以及耗時良久的訓練,所以fine tuning是當數據量不足時的一個比較合適的選擇。