2016-08-26 73 views
4

我想在TensorFlow中構建分類器時使用帶有動量的梯度下降(記錄以前的梯度)。在TensorFlow中實現梯度下降而不是使用隨其提供的梯度下降

所以我不想使用tensorflow.train.GradientDescentOptimizer,但我想用tensorflow.gradients來計算漸變並跟蹤以前的漸變並根據它們全部更新權重。

如何在TensorFlow中執行此操作?

+0

您是否考慮過使用'AdamOptimizer'或'RMSPropOptimizer' – titus

回答

5

TensorFlow有一個implementation的梯度下降與動量。

要回答關於實現您自己的優化算法的一般問題,TensorFlow會爲您提供計算梯度的基元,並使用計算的梯度更新變量。在模型中,假設loss指定損失函數,並var_list是在你的模型TensorFlow變量(您可以通過調用tf.all_variablestf.trainable_variables得到的Python列表,那麼你就可以計算出梯度WRT的變量如下:

grads = tf.gradients(loss, var_list) 

對於簡單的梯度下降,則只需減去梯度的產品,並從可變學習率,該代碼將如下所示:

var_updates = [] 
for grad, var in zip(grads, var_list): 
    var_updates.append(var.assign_sub(learning_rate * grad)) 
train_op = tf.group(*var_updates) 

你可以通過調用訓練模型。現在,在實際更新變量之前,您可以做各種事情。例如,您可以跟蹤不同變量集中的梯度,並將其用於動量算法。或者,您可以在更新變量之前剪切漸變。所有這些都是簡單的TensorFlow操作,因爲梯度張量與您在TensorFlow中計算的其他張量沒有區別。請查看一些發燒友優化算法的實現(Momentum,RMSProp,Adam),以瞭解如何實現自己的優化算法。

+0

非常感謝! – prepmath

+0

它可以工作,但與某事有點混淆。我正在對mnist數據進行softmax迴歸。所以我期望tf.all_variables產生一個兩張張的列表,1×10的偏差和78×10的權重。但它產生了一個120列表(這個數字每次運行腳本時都會增加)張量,其中60張是1乘10張張量,60張是10張張數784張。你能幫我理解tf.all_variables發生了什麼嗎? – prepmath