2016-02-05 23 views
30

我後來的功能是能夠告訴給定變量的梯度與給定某些數據的錯誤函數有關。如何獲得TensorFlow變量的損失梯度?

這樣做的一種方法是查看變量在調用訓練後變化了多少,但顯然可以基於學習算法大規模地變化(例如,幾乎不可能用類似RProp ),只是不是很乾淨。

在此先感謝。

+0

確實也是,如果我想看到的解決你的問題的工作/檢查梯度隨着培訓的進展? – Pinocchio

回答

42

tf.gradients()函數允許您計算一個張量相對於一個或多個其他張量(包括變量)的符號梯度。考慮下面這個簡單的例子:

data = tf.placeholder(tf.float32) 
var = tf.Variable(...)    # Must be a tf.float32 or tf.float64 variable. 
loss = some_function_of(var, data) # some_function_of() returns a `Tensor`. 

var_grad = tf.gradients(loss, [var])[0] 

然後你可以使用這個符號梯度來計算數值梯度對於一些特定的數據:

sess = tf.Session() 

var_grad_val = sess.run(var_grad, feed_dict={data: ...}) 
+3

如果您想將漸變與「GradientDescentOptimizer」或「AdagradOptimizer」等內置訓練算法結合使用,該怎麼辦?我想避免必須兩次計算網絡的梯度。 – gideonite

+5

'tf.train.GradientDescentOptimizer'類(和相關的'Optimizer'類)在內部調用'tf.gradients()'。如果要訪問爲優化程序計算的梯度,可以手動調用'optimizer.compute_gradients()'和'optimizer.apply_gradients()',而不是調用'optimizer.minimize()'。 – mrry

+2

@mrry:這裏只是澄清一下,這裏的符號梯度只是一個未評估的張量,而不是實際的符號梯度,即symgrad(x^2)= 2 * x。有沒有辦法在不考慮張量板的情況下得到這個結果? – bge0