tensorflow凍結層的方法


其實常說的fine tune就是凍結網絡前面的層,然后訓練最后一層。那么在tensorflow里如何實現finetune功能呢?或者說是如何實現凍結部分層,只訓練某幾個層呢?可以通過只選擇優化特定層的參數來實現該功能。

 

示例代碼如下:

 

#定義優化算子
optimizer = tf.train.AdamOptimizer(1e-3)
#選擇待優化的參數
output_vars = tf.get_collection(tf.GraphKyes.TRAINABLE_VARIABLES, scope='outpt')
train_step = optimizer.minimize(loss_score,var_list = output_vars)

#但是在這里,我卻碰到了一個問題,關於adam的問題,如下:

Failed precondition: Attempting to use uninitialized value beta1_power

#查了一下,這個參數應該是Adam優化算子里的參數。問題出在定義優化算子的時間,晚於參數初始化的時間,導致beta1_power沒有初始化,修改一下代碼(調整代碼順序即可)


#即如下的順序:
sess.run(init)
train_step = optimizer.minimize(loss_score,var_list=output_vars)

#改變成如下順序即可
train_step = optimizer.minimize(loss_score,var_list=output_vars)
sess.run(init)

 

參考鏈接:
https://stackoverflow.com/questions/38749120/fine-tuning-a-deep-neural-network-in-tensorflow
https://stackoverflow.com/questions/45093499/how-to-fine-tune-weights-in-specific-layers-in-tensorflow


        另外一個問題是,在用finetune的時候,發現速度並沒有比retrain的速度快太多。分析原因在於finetune的時候,凍結了其它層,那么反向傳播不會進入到這些層中,但是前向計算是會有的。如果想進一步加速finetune的速度,可以考慮先把所有數據執行一次前向操作,保存最后一層的中間的結果,然后以此中間結果為輸入,訓練整個網絡。可以節省前向計算的一些時間。但如果finetune的epoch較少,那么感覺讀寫消耗的時間可能就已經很多了,不划算,加速效果也不明顯。


免責聲明!

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



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