我想在TensorFlow中構建分類器時使用帶有動量的梯度下降(記錄以前的梯度)。在TensorFlow中實現梯度下降而不是使用隨其提供的梯度下降
所以我不想使用tensorflow.train.GradientDescentOptimizer
,但我想用tensorflow.gradients
來計算漸變並跟蹤以前的漸變並根據它們全部更新權重。
如何在TensorFlow中執行此操作?
我想在TensorFlow中構建分類器時使用帶有動量的梯度下降(記錄以前的梯度)。在TensorFlow中實現梯度下降而不是使用隨其提供的梯度下降
所以我不想使用tensorflow.train.GradientDescentOptimizer
,但我想用tensorflow.gradients
來計算漸變並跟蹤以前的漸變並根據它們全部更新權重。
如何在TensorFlow中執行此操作?
TensorFlow有一個implementation的梯度下降與動量。
要回答關於實現您自己的優化算法的一般問題,TensorFlow會爲您提供計算梯度的基元,並使用計算的梯度更新變量。在模型中,假設loss
指定損失函數,並var_list
是在你的模型TensorFlow變量(您可以通過調用tf.all_variables
或tf.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),以瞭解如何實現自己的優化算法。
您是否考慮過使用'AdamOptimizer'或'RMSPropOptimizer' – titus