ValueError: No gradients provided for any variable(TensorFlow2!绝对详细!)

今天的代码一直遇见下列错误, 烦不胜烦。其实就是因为在进行优化求损失函数最小值的时候,找不到需要梯度下降的变量,提示的是要检查损失函数。

  ([str(v) for _, v in grads_and_vars], loss))
ValueError: No gradients provided for any variable, check your graph for ops that do not support gradients, between variables [] and loss <function loss at 0x000001ABF60B2488>.

我的出错代码如下。

train_logits = inference(train_batch, BATCH_SIZE, N_CLASSES)
 def loss():
           return tf.nn.sparse_softmax_cross_entropy_with_logits(labels=train_label_batch,logits=train_logits ) )
optimizer.minimize(loss=loss)

按我的理解,优化过程的第一步其实就是求梯度。这个过程就是根据输入的损失函数,提取其中的变量,进行梯度下降,使整个损失函数达到最小值。首先想的是怎么提取损失函数中的变量呢?
查看官网,我们可以看到 optimizer.minimize函数的变量列表,其实就是variables类型的元组或者列表。那理想中的梯度下降过程,其实就是利用标签和预测值求损失函数,再对从预测模型引入的variables变量进行梯度下降,以减小损失函数。

ValueError: No gradients provided for any variable(TensorFlow2!绝对详细!)
那其实,损失函数作为预测模型和优化模型的桥梁,肯定要做到传递变量的作用。我们使用下面这个关于初次使用tensorflow遇到的坑的代码,直观看一下错误处在了哪里,再对症下药。源代码肯定是可以运行成功的,但我们稍微做一些修改。其实就是把 return tf.keras.losses.MSE(y_data, Weights*x_data+biases)修改成 w=Weights*x_data+biases def loss(): return tf.keras.losses.MSE(y_data, w)
不再直接传预测模型,而是传入一个变量,虽然这个变量就是原来的预测模型,我们想看根据一个变量,是否梯度下降的时候可以找到对应的变量。

import tensorflow as tf
import numpy as np

x_data = np.random.rand(100).astype(np.float32)
y_data = x_data*0.1+0.3
print(y_data)

Weights = tf.Variable(tf.random.uniform((1,), -1.0, 1.0))

print(Weights)
biases = tf.Variable(tf.zeros((1,)))
print(biases)

w=Weights*x_data+biases
def loss():
    print(tf.keras.losses.MSE(y_data, w))
    return tf.keras.losses.MSE(y_data, w)

optimizer = tf.keras.optimizers.SGD(learning_rate=0.5)

for step in range(201):
    optimizer.minimize(loss,var_list=[Weights,biases])
    if step % 20 == 0:
        print("{} step, Weights = {}, biases = {}"
              .format(step, Weights.read_value(), biases.read_value()))

运行结果如下:

    ([v.name for _, v in grads_and_vars],))
ValueError: No gradients provided for any variable: ['Variable:0', 'Variable:0'].

发现发现了需要梯度下降的两个变量[‘Variable:0’, ‘Variable:0’],并不是我们希望的权重和偏置。那这两个值是在哪里产生的呢?
我们打印初始化的权重和偏置

Weights = tf.Variable(tf.random.uniform((1,), -1.0, 1.0))

print(Weights)
biases = tf.Variable(tf.zeros((1,)))
print(biases)

结果如下,发现正是我们的初始权重和偏置啊。所以还是直接传模型吧,而不是传递一个已经计算好的数值

<tf.Variable 'Variable:0' shape=(1,) dtype=float32, numpy=array([-0.16910172], dtype=float32)>
<tf.Variable 'Variable:0' shape=(1,) dtype=float32, numpy=array([0.], dtype=float32)>

除了直接输入模型,还可以使用下述方法

def loss():

    w = Weights * x_data + biases
    return tf.keras.losses.MSE(y_data, w)

结果:
哎,就是一直试,慢慢找套路

20 step, Weights = [-0.06692801], biases = [0.39274]
40 step, Weights = [0.05562253], biases = [0.32465476]
60 step, Weights = [0.08820234], biases = [0.30655444]
80 step, Weights = [0.09686362], biases = [0.3017425]
100 step, Weights = [0.09916621], biases = [0.30046323]
120 step, Weights = [0.09977833], biases = [0.30012316]
140 step, Weights = [0.09994107], biases = [0.30003276]
160 step, Weights = [0.09998435], biases = [0.3000087]
180 step, Weights = [0.09999582], biases = [0.30000234]
200 step, Weights = [0.09999889], biases = [0.30000064]

我原来的代码也应该修改成 return tf.nn.sparse_softmax_cross_entropy_with_logits(labels=train_label_batch,logits=inference(train_batch, BATCH_SIZE, N_CLASSES) )#inference(train_batch, BATCH_SIZE, N_CLASSES)

Original: https://blog.csdn.net/qq_43521665/article/details/115148349
Author: LuckyFucky
Title: ValueError: No gradients provided for any variable(TensorFlow2!绝对详细!)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/521575/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球