2016-02-03 76 views
3

我想訓練一個網絡,其中包含我需要在訓練期間保持修復的子網絡。其基本思路是前面加上並追加一些層的預訓練的網絡(inceptionV3)如何在張量流中使用預訓練模型作爲不可訓練的子網絡?

new_layers -> pre-trained and fixed sub-net (inceptionv3) -> new_layers 

,並在不改變預先訓練的一個運行我有任務的訓練過程。 我還需要直接在預先訓練的網絡的某個層上分支。例如,在初始V3中,我喜歡從conv 299x299到最後一個池層或從conv 79x79到最後一個池層使用它。

回答

5

是否訓練「圖層」取決於該圖層中使用的變量是否使用漸變更新。如果您使用的是Optimizer界面來優化您的網絡,那麼你根本無法如果您使用tf.gradients函數傳入要保持固定的minimize功能,即該層中使用的變量,

opt.minimize(loss, <subset of variables you want to train>) 

直接,然後從第二個參數中刪除想要保持固定的變量爲tf.gradients

現在,您如何「直接分支」到預先訓練好的網絡層取決於該網絡的實施方式。我只需簡單地調用到您正在討論的299x299圖層的tf.Conv2D,並將新圖層的輸出作爲其輸入,並在輸出側傳遞79x79圖層,並將其輸出用作新圖層的輸入。

+2

請注意,人們獲取要訓練的一組變量的方法是使用tf.trainable_variables()函數https://www.tensorflow.org/versions/0.6.0/api_docs/python/state_ops.html#trainable_variables獲取使用trainable = True(默認值)創建的變量集合。您可以通過在構造變量時傳遞trainable = False來從該集合中排除變量:https://www.tensorflow.org/versions/0.6.0/api_docs/python/state_ops.html#Variable.__init__ – Josh11b

+0

這裏是另一個相關的問題更新變量只爲一些圖層:http://stackoverflow.com/questions/34945554/how-to-set-layer-wise-learning-rate-in-tensorflow – mathetes

+0

而我該如何設置每個圖層的輸入?我是否需要使用sess.run函數,例如在classify_image示例中? – jrabary