问题描述
我想知道为什么这种非常简单的梯度计算无法正常工作。 它实际上是在生成[None,None]向量。 显然,这不是所需的输出。
import tensorflow as tf
tf.enable_eager_execution()
a = tf.constant(0.)
with tf.GradientTape() as tape:
b = 2 * a
da, db = tape.gradient(a + b, [a, b])
print(da)
print(db)
1楼
您发布的代码段存在两个小问题:
a + b
计算是在磁带上下文之外进行的,因此不会被记录。 请注意,GradientTape
只能区分记录的计算。 在磁带上下文中计算a + b
将解决此问题。源张量需要“监视”。 有两种向磁带发出信号的信号:应该监视张量:(a)显式调用 ,或(b)使用
tf.Variable
(监视所有变量),请参阅
长话短说,对片段进行两个简单的修改就可以解决问题:
import tensorflow as tf
tf.enable_eager_execution()
a = tf.constant(0.)
with tf.GradientTape() as tape:
tape.watch(a)
b = 2 * a
c = a + b
da, db = tape.gradient(c, [a, b])
print(da)
print(db)
希望能有所帮助。