我有一個使用苗條創建的完全連接圖層的深層網絡。我想逐漸對網絡進行培訓 - 首先允許優化第一層,然後再優化第二層。在閱讀中,我發現這可能是使用tf.stop_gradient完成的,儘管這怎麼做還不清楚。 也許更好的方法是在苗條的調用中使用可訓練標誌 - 只需設置第一層以外的所有層都是假的。不幸的是,隨着培訓的進展,這將需要逐漸將後續圖層設置爲真,從而改變圖形。不知道這是否合法。凍結張量流中的神經網絡部分
我的問題: - 這些是我想要做的合理方法嗎? - 任何人都可以建議如何實現這兩種方法嗎?
我有一個使用苗條創建的完全連接圖層的深層網絡。我想逐漸對網絡進行培訓 - 首先允許優化第一層,然後再優化第二層。在閱讀中,我發現這可能是使用tf.stop_gradient完成的,儘管這怎麼做還不清楚。 也許更好的方法是在苗條的調用中使用可訓練標誌 - 只需設置第一層以外的所有層都是假的。不幸的是,隨着培訓的進展,這將需要逐漸將後續圖層設置爲真,從而改變圖形。不知道這是否合法。凍結張量流中的神經網絡部分
我的問題: - 這些是我想要做的合理方法嗎? - 任何人都可以建議如何實現這兩種方法嗎?
常見的用法是這樣的:現在
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_op1
和train_op2
(例如,第一層上的循環,然後循環第二層)
(PS無防止你只,然後使用兩個不同的損失函數用於第一層爲兩個層。在這種情況下,優化器將僅相對於那些loss_function取決於變量最小化。)
這看起來很有趣...我會盡快嘗試。 –
我有一個[更一般的版本](https://stackoverflow.com/questions/43681295/enable-and-di這個問題的變化 - 培訓期間的變化),但沒有答案。希望將您的問題限制在漸進式,分層式學習的事實使解決方案變得更加簡單。 – user1735003