我有一個標準的TensorFlow操作鏈,我需要爲整個鏈指定一個自定義漸變。自定義漸變鏈操作
假設在下面的例子中,這些操作被分組到一個Python函數中:'my_op'。我想要做的是爲'my_op'指定一個自定義漸變。我看了一下RegisterGradient,gradient_override_map和tf.Graph.create_op,但我找不到任何關於如何使用它們爲一組操作定義自定義漸變的簡單示例,而無需在C++中重寫完整的操作鏈。
import numpy as np
import tensorflow as tf
n = 2
m = 3
x = np.random.normal(size=(1, n))
A = tf.Variable(tf.truncated_normal(shape=(n, m), dtype=tf.float32))
b = tf.Variable(tf.zeros(shape=(1, m), dtype=tf.float32))
def my_op(a):
return tf.add(tf.matmul(a, A), b)
x_placeholder = tf.placeholder(tf.float32,shape=[1, n])
t = my_op(tf.stop_gradient(x_placeholder))
grad = tf.gradients(t, [A])
sess = tf.Session()
sess.run(tf.initialize_all_variables())
result = sess.run(grad, feed_dict={x_placeholder: x})
print(result)
sess.close()
也許例如[testFunctionGradientsWithGradFunc(https://github.com/tensorflow/tensorflow/blob/73ced9d797056c7e67a06ed2098dd809d85ec44a/tensorflow/python/ops/gradients_test.py#L351)是有幫助的 –
感謝@Yaroslav,但我不確定我完全理解。我應該使用function.Defunc以某種方式裝飾my_op嗎?你會如此友善地添加答案並編輯我構建的簡單例子嗎? – njk