Reputation: 576
I define custom gradient mapper with tensorflow package.
When i use tf.multiply with custom gradient, it did not work .
whole code is here
import tensorflow as tf
@tf.RegisterGradient("MyopGrad")
def frop_grad(op, grad):
x = op.inputs[0]
return 1000.0 * x
input = tf.Variable([4.0], dtype=tf.float32)
x = tf.constant(5.0)
g = tf.get_default_graph()
with g.gradient_override_map({"Multiply": "MyopGrad"}):
output1 = tf.multiply(input, x , name = 'multiply')
grad1 = tf.gradients(output1, input)
# output without gradient clipping in the backwards pass for comparison:
output1_ori = tf.multiply(input , x)
grad1_ori = tf.gradients(output1_ori, input)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print("with custom:", sess.run(grad1)[0])
print("without custom:", sess.run(grad1_ori)[0])
Upvotes: 1
Views: 367
Reputation: 59731
The TensorFlow op name for tf.multiply
is just Mul
, not Multiply
. Also, tf.multiply
has two inputs, so its gradients should have two outputs. So your code could look something like this:
import tensorflow as tf
@tf.RegisterGradient("MyopGrad")
def frop_grad(op, grad):
x = op.inputs[0]
y = op.inputs[1]
return 1000.0 * x, 1000.0 * y
input = tf.Variable([4.0], dtype=tf.float32)
x = tf.constant(5.0)
g = tf.get_default_graph()
with g.gradient_override_map({"Mul": "MyopGrad"}):
output1 = tf.multiply(input, x , name = 'multiply')
grad1 = tf.gradients(output1, input)
# output without gradient clipping in the backwards pass for comparison:
output1_ori = tf.multiply(input , x)
grad1_ori = tf.gradients(output1_ori, input)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print("with custom:", sess.run(grad1)[0])
print("without custom:", sess.run(grad1_ori)[0])
Output:
with custom: [4000.]
without custom: [5.]
Upvotes: 1