Kalia
Kalia

Reputation: 29

Error when working with GradientTape() and jacobian() in Tensorflow 2.0

I am working with GradientTape() and jacobian() in Tensorflow 2.0 in Python.

This code executes fine:

x = tf.Variable(2.0, dtype=tf.float32)
with tf.GradientTape() as gT:
    gT.watch(x)
    g = tf.convert_to_tensor([x, 0.0], dtype=tf.float32)
dg = gT.jacobian(g, x)

But this code breaks:

x = tf.Variable(2.0, dtype=tf.float32)
with tf.GradientTape() as gT:
    gT.watch(x)
    gv = tf.Variable([x, 0.0], dtype=tf.float32)
    g = tf.convert_to_tensor(gv , dtype=tf.float32)
dg = gT.jacobian(g, x)

and throws the error:

InvalidArgumentError: You must feed a value for placeholder tensor 'loop_body/Placeholder' with dtype int32 [[node loop_body/Placeholder (defined at ...Anaconda3\lib\site-packages\tensorflow_core\python\framework\ops.py:1751) ]] [Op:__inference_f_995]

Traceback (most recent call last) ipython-input-32-686c8a0d6e95 in module
4       gv = tf.Variable([x, 0.0], dtype=tf.float32)
5       g = tf.convert_to_tensor(gv , dtype=tf.float32)
----> 6      dg = gT.jacobian(g, x)

Why does the first code work, but the second code doesn't?

Upvotes: 0

Views: 271

Answers (1)

thushv89
thushv89

Reputation: 11333

The reason is pretty simple,

In the first example, you got

g = tf.convert_to_tensor([x, 0.0], dtype=tf.float32)

and compute dg/dx and g has a direct relationship with x and works fine.

But in the second example,

gv = tf.Variable([x, 0.0], dtype=tf.float32)
g = tf.convert_to_tensor(gv , dtype=tf.float32)

There's no connection between g and x any more, because when you call,

gv = tf.Variable([x, 0.0], dtype=tf.float32)

it just copies the values from x and doesn't carry a reference to x, so you cannot get derivative dg/dx. But if you try dg/d(gv) it'll work.

PS: I didn't get an error though (for your second example). I just got None.

Upvotes: 1

Related Questions