2017-06-16 29 views
1

如何更新優化器的變量列表以在tensorflow中進行訓練?換句話說,如果我們有以下優化器:如何更新優化程序需要在tensorflow中更新的變量列表?

optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost_scalar, var_list=my_var_list) 

我需要更新my_var_list例如,同時微調網絡。也就是說,我將刪除不再需要訓練的變量,並保留其他變量。例如,微調卷積神經網絡中的密集層。

任何幫助非常感謝!

回答

1

當您在會話sess中運行optimizer(相關feed_dict)時,可變權重和偏差將會更新。

for e in range(epoch): 
    for i in range(data_size/batch_size): 
     sess.run(optimizer, feed_dict={your_feed_dict}) 

編輯

您可能需要細分變量和var_list而是用一個訓練整個網絡,和一個只訓練緻密層。您可以通過在卷積層引入範圍變量這樣做,並分別緻密層

with tf.variable_scope("Conv"): #All the convolution layers 
    DW0 = tf.Variable(tf.random_normal([1,1], stddev=0.01)) 
    Db0 = tf.Variable(tf.constant(0.1, shape=[1])) 

with tf.variable_scope("Dense"): #All the dense layers 
    DW0 = tf.Variable(tf.random_normal([1,1], stddev=0.01)) 
    Db0 = tf.Variable(tf.constant(0.1, shape=[1])) 

vars = tf.trainable_variables() 
dense = [v for v in vars if v.name.startswith("Dense")] 
whole = [v for v in vars if v.name.startswith("Conv")] + dense 

WholeOptim = tf.train.AdamOptimizer(learning_rate).minimize(cost_scalar, var_list=whole) 
DenseOptim = tf.train.AdamOptimizer(learning_rate).minimize(cost_scalar, var_list=dense) 

所以訓練整個網絡時,運行WholeOptim和培訓只是緻密層時,運行DenseOptim

+0

這不是我正在尋找@Joshua。例如,如果你有一個3卷積層的網絡,然後是1個密集層,那麼在訓練整個網絡之後,我將使用第三個conv層的激活作爲我的輸入幀的特徵。此外,我只需要訓練經常性神經網絡,因爲它們已經被訓練過了。因此,在這種情況下,我想通知優化器來訓練RNN的權重而不是整個網絡。所以這就是我期望用tensorflow中的優化器實現的。 –