Python 在Tensorflow 2.0中使用GradientTape()和jacobian()时出错

Python 在Tensorflow 2.0中使用GradientTape()和jacobian()时出错,python,tensorflow,deep-learning,tensorflow2.0,gradienttape,Python,Tensorflow,Deep Learning,Tensorflow2.0,Gradienttape,我正在使用Python中Tensorflow 2.0中的GradientTape()和jacobian() 此代码执行良好: 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) 但这一准则打破了: x = tf.Vari

我正在使用Python中Tensorflow 2.0中的GradientTape()和jacobian()

此代码执行良好:

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)
但这一准则打破了:

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)
并抛出错误:

InvalidArgumentError:必须为数据类型为int32的占位符张量“loop\u body/placeholder”提供一个值 [[node loop_body/Placeholder(定义于…Anaconda3\lib\site packages\tensorflow_core\python\framework\ops.py:1751)]][Op:[u推断\u f_995]

模块中的回溯(最近一次调用)ipython-input-32-686c8a0d6e95
4 gv=tf.Variable([x,0.0],dtype=tf.float32)
5g=tf.convert_to_tensor(gv,dtype=tf.float32)
---->6dg=gT.雅可比矩阵(g,x)


为什么第一个代码有效,而第二个代码无效?

原因很简单

在第一个例子中,您得到

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

而compute
dg/dx
g
x
有直接关系,工作正常

但在第二个例子中

gv = tf.Variable([x, 0.0], dtype=tf.float32)
g = tf.convert_to_tensor(gv , dtype=tf.float32)
g
x
之间不再有任何联系,因为当你打电话时

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

它只是复制
x
中的值,并且不带对
x
的引用,因此无法获得导数
dg/dx
。但是如果你尝试一下dg/d(gv)它会奏效的

PS:但是我没有收到错误(对于您的第二个示例)。我只得到了