JaeWoo So
JaeWoo So

Reputation: 576

How excute custom gradient with tf.multiply?

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

Answers (1)

javidcf
javidcf

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

Related Questions