我有一系列标准的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()
答案 0 :(得分:0)
据我所知,定义自定义渐变的最佳方法(即对普通渐变进行一些修改)是在this之后的张量流中添加新的自定义ops。如您所见,对于输出输入的自定义操作,您可以使用@ops.RegisterGradient("MyOp")
在python中定义它的渐变。