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上讨论的人很多。

Logo

NVIDIA官方入驻,分享最新的官方资源以及活动/会议信息,精选收录AI相关技术内容,欢迎大家加入社区并参与讨论。

更多推荐