tf2: Gradients do not exist for variables when minimizing the loss.
WARNING:tensorflow:Gradients do not exist for variables when minimizing the loss.情况一错误写法:模型forward中计算出 loss1 和 loss2 返回,然后再计算 losswith tf.GradientTape() as tape:loss1,loss2 = model(user_list, item_lis
·
WARNING:tensorflow:Gradients do not exist for variables when minimizing the loss.
-
情况一
该变量没有参与最后loss的计算(1)如果直接没有参与计算,其实很好就能找出来,删掉无用变量即可;
(2)有时直接参与计算了,但是由于程序中的 if 等条件语句,在某个batch的数据恰巧不适用某个变量,而其他batch可能就是使用了该变量,这种情况下,忽略该警告即可。 -
情况二
该变量在 model 的call
之前就进行了运算,或者在tf.GradientTape()
之外进行了运算,比如:concat,dense之类的都不行。 -
情况三
错误写法:
创建一个变量或者常量,将计算出的结果一行一行assign
进去
修改后的写法:
创建一个空 list,每次将计算出的结果 append 加入,最后使用tf.stack()
操作
import tensorflow as tf
optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)
w1 = tf.Variable([[1.0]])
w2 = tf.Variable([[3.0]])
w = tf.concat([w1, w2], 0) # 变量在tf.GradientTape()范围之外就进行了计算
x = tf.random.normal((1,2))
y = tf.reduce_sum(x,1)
with tf.GradientTape() as tape:
# w = tf.concat([w1, w2], 0) # 这里使用就不会报错了
r = tf.matmul(w,x)
loss = tf.metrics.mse(y, r)
gradients = tape.gradient(loss, [w1,w2])
print(gradients) # [None, None]
optimizer.apply_gradients(zip(gradients, [w1,w2])) # 没有梯度,这行就会报错
最后:这类型问题百度没什么解答,github上讨论的人很多。
更多推荐
已为社区贡献1条内容
所有评论(0)