2017-05-31 74 views
0

我有一個使用苗條創建的完全連接圖層的深層網絡。我想逐漸對網絡進行培訓 - 首先允許優化第一層,然後再優化第二層。在閱讀中,我發現這可能是使用tf.stop_gradient完成的,儘管這怎麼做還不清楚。 也許更好的方法是在苗條的調用中使用可訓練標誌 - 只需設置第一層以外的所有層都是假的。不幸的是,隨着培訓的進展,這將需要逐漸將後續圖層設置爲真,從而改變圖形。不知道這是否合法。凍結張量流中的神經網絡部分

我的問題: - 這些是我想要做的合理方法嗎? - 任何人都可以建議如何實現這兩種方法嗎?

+0

我有一個[更一般的版本](https://stackoverflow.com/questions/43681295/enable-and-di這個問題的變化 - 培訓期間的變化),但沒有答案。希望將您的問題限制在漸進式,分層式學習的事實使解決方案變得更加簡單。 – user1735003

回答

0

常見的用法是這樣的:現在

optimizer = tf.train.GradientDescentOptimizer(learning_rate) 
train_op = optimizer.minimize(loss_function) 

,你可以提供給minimize另一個參數是var_list,那就是你想,以儘量減少你的loss_fuction改變的變量列表。

因此,您只能優化所有變量的子集,即凍結其餘所有變量。

因此,假設你有一個圖,你想先優化一個圖層,然後再優化另一個圖層。然後,你可以使用這樣的事情:

optimizer = tf.train.GradientDescentOptimizer(learning_rate) 
train_op1 = optimizer.minimize(loss_function, var_list=<list of first layer variables>) 
train_op2 = optimizer.minimize(loss_function, var_list=<list of second layer variables>) 

,然後在你的跑步階段,將根據您的優化調度運行train_op1train_op2(例如,第一層上的循環,然後循環第二層)

(PS無防止你只,然後使用兩個不同的損失函數用於第一層爲兩個層。在這種情況下,優化器將僅相對於那些loss_function取決於變量最小化。)

+0

這看起來很有趣...我會盡快嘗試。 –