张量流2.0的GradientTape()计算梯度的问题

时间:2019-09-05 07:11:54

标签: tensorflow

使用tensorflow 2.0和GradientTape()函数,第一个tape.gradient()提供正确的梯度张量,但是第二个tape.gradient()提供“ None”。 为什么第二个值是“无”?我希望分别计算出梯度。

import tensorflow as tf
import numpy as np

x = tf.constant([ [1.0, 2.0], [3.0, 4.0], [5.0, 6.0] ])
y0 = tf.constant([ [4.0], [8.0], [12.0] ])

w = tf.Variable( [[1.0], [1.0]] ) 

with tf.GradientTape() as tape:
    y = tf.matmul(x, w)
    print("y : ", y.numpy())
    loss = tf.reduce_sum(y-y0)
    print("loss : ", loss.numpy())

grad = tape.gradient(loss, w)    # gradient calculation is correct
print("gradient : ", grad.numpy())

mu = 0.01
w = w - mu*grad

with tf.GradientTape() as tape:
    y = tf.matmul(x, w)
    print("y : ", y.numpy())
    loss = tf.reduce_sum(y-y0)
    print("loss : ", loss.numpy())

grad = tape.gradient(loss, w)    # gradient value go to 'None'
print("gradient : ", grad)

1 个答案:

答案 0 :(得分:2)

您通过分配wTensor(不是Variable的{​​em>不是)覆盖w = w - mu*grad。默认情况下,GradientTape仅跟踪变量。您有两种选择。

  1. 推荐:将w = w - mu*grad替换为w.assign(w - mu*grad)。这将w保留为Variable,这是更新变量值的方式。
  2. 您可以在GradientTape中显式跟踪非变量。在第二个磁带上下文中,一开始(在tape.watch(w)之前)添加matmul