我想知道为什么这个非常简单的梯度计算无法正常工作。它实际上是生成一个[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)
预期输出: da = 3 且 db = 1
最佳答案
您发布的代码片段有两个小问题:
a + b
计算发生在磁带上下文之外,因此不会被记录。请注意,GradientTape 只能区分记录的计算。在磁带上下文中计算a + b
将解决这个问题。需要“监视”源张量。有两种方法可以向磁带发出应该监视张量的信号: (a) 显式调用
tape.watch
,或 (b) 使用tf.Variable
(监视所有变量),请参阅 documentation
长话短说,对代码片段进行两个简单的修改就可以解决问题:
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)
希望有帮助。
关于python - 急切执行: gradient computation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52340645/