在使用 TF2 的 GradientTape() 时报此类错误基本是因为 loss 和所给的变量没有联系,因此也就无法传递梯度。我的代码具体报错是因为(例子):
# 先定义一个神经网络:model
with tf.GradientTape() as tape:
x = tf.constant([[1., 2., 3.]])
y = model(x).numpy()
...
# 问题就出在上面这一步,
# 因为我需要对'y'的取值做一些操作,所以用了.numpy()操作。
# 继续看下一步
loss = tf.keras.losses.mean_squared_error(y_true=xxx, y_pred=y)
grads = tape.gradient(loss, model.variables)
# 就是在上面这一步计算梯度时,和'loss'相关的是'model(x).numpy()',
# 记住这里是.numpy()而不是model输出的tensor本身,因此无法得到梯度,
# 如果print(grads)会得到None。
optimizer.apply_gradients(grads_and_vars=zip(grads, model.variables))
# 解决方案就是再另外设一个变量,y_ = y.numpy()
# 对'y_'做操作,然后在计算梯度时使用'y'。