首页 > 解决方案 > Tensorflow:“错误:没有为任何变量提供梯度”,带有自定义损失

问题描述

当我尝试运行我的代码时出现错误

ValueError: No gradients provided for any variable

这是我的代码的样子

optimizer = tf.keras.optimizers.Adam(learning_rate=1e-2)

while True:
    #...other stuff

    if(isTimeToBackprop()):
         vStates = model.predict(modelInput)
         tdTargets = tf.ones(vStates.shape)

         loss = tf.math.reduce_mean(tf.math.squared_difference(vStates, tdTargets))

         callable = lambda : criticLoss
         optimizer.minimize(callable, var_list=model.trainable_variables)
   

所有涉及的变量都是类型

<class 'tensorflow.python.framework.ops.EagerTensor'>

我有什么误解?

标签: pythontensorflowgradient-descentbackpropagation

解决方案


假设您正在使用 Tensorflow 2.x,如果您尝试创建自定义训练步骤以跟踪模型梯度,则必须在tf.GradientTape上下文管理器下调用模型。

在这里,您已更新代码以正确使用GradientTape

optimizer = tf.keras.optimizers.Adam(learning_rate=1e-2)

while True:
    #...other stuff

    if isTimeToBackprop():
        with tf.GradientTape() as tape:
            vStates = model(modelInput)
            tdTargets = tf.ones(vStates.shape)
            loss = tf.math.squared_difference(vStates, tdTargets)
            loss = tf.reduce_mean(loss)
        
        gradients = tape.gradient(loss, model.trainable_variables)
        optimizer.apply_gradients(zip(gradients, model.trainable_weights))
        # At this point the model is updated

另请注意,我没有使用 model.predict,而是使用call方法,这是您在训练时应该使用的方法


推荐阅读