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