在tensorflow 2.0中,不支持tf.gradients,并且GradientTape仅将梯度计算为可训练的权重,那么如何像TF1.0一样将梯度输入? 谢谢,如果我错了,请纠正我。
答案 0 :(得分:0)
由于您已经提到了答案,请在下面为社区提供说明和代码详细信息。
对于TensorFlow 2,您需要使用GradientTape计算输入的损耗梯度。
以下是GradientTape如何工作的说明。
让我们创建一些示例玩具功能。
def f(w1, w2):
return 3 * w1 ** 2 + 2 * w1 * w2
定义w1,w2并计算渐变。
w1, w2 = tf.Variable(5.), tf.Variable(3.)
with tf.GradientTape() as tape:
z = f(w1, w2)
gradients = tape.gradient(z, [w1, w2])
输出渐变:
[<tf.Tensor: shape=(), dtype=float32, numpy=36.0>,
<tf.Tensor: shape=(), dtype=float32, numpy=10.0>]
现在,让我们看看GradientTape如何以tf.constant
作为输入而不是tf.Variable
作为输入。
c1, c2 = tf.constant(5.), tf.constant(3.)
with tf.GradientTape() as tape:
z = f(c1, c2)
gradients = tape.gradient(z, [c1, c2])
将显示渐变的输出。
[None, None]
默认情况下,磁带仅跟踪涉及变量的操作,因此如果 您尝试针对除a以外的任何其他值计算z的梯度 变量,结果将为“无”。
对于输入也是如此,因为输入不是变量,所以您需要告诉磁带监视。
您可以强制磁带观看您喜欢的任何张量,进行记录 涉及他们的每项操作。然后,您可以使用 将这些张量视为变量。
带手表的渐变磁带:
with tf.GradientTape() as tape:
tape.watch(c1)
tape.watch(c2)
z = f(c1, c2)
gradients = tape.gradient(z, [c1, c2])
您现在可以看到输出渐变:
[<tf.Tensor: shape=(), dtype=float32, numpy=36.0>,
<tf.Tensor: shape=(), dtype=float32, numpy=10.0>]