1. 程式人生 > >tensorflow凍結部分層,只訓練某一層

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)

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