在Tensorflow 2.0中,如何计算输入变量的损耗梯度?

时间:2020-01-14 08:03:46

标签: tensorflow

在tensorflow 2.0中,不支持tf.gradients,并且GradientTape仅将梯度计算为可训练的权重,那么如何像TF1.0一样将梯度输入? 谢谢,如果我错了,请纠正我。

1 个答案:

答案 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>]