【问题标题】:Tensorflow: 'Error: No gradients provided for any variable' with custom lossTensorflow:“错误:没有为任何变量提供梯度”和自定义损失
【发布时间】:2021-01-08 16:45:28
【问题描述】:

我在尝试运行代码时遇到错误

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'>

我误会了什么?

【问题讨论】:

    标签: python tensorflow gradient-descent backpropagation


    【解决方案1】:

    假设您正在使用 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
    

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

    【讨论】:

    • 啊,谢谢!如果我想使用第二个模型,我是将它包装在同一个 GradientTape 块中还是需要在第二个块中?
    猜你喜欢
    • 2020-04-05
    • 2021-05-08
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 2021-07-11
    相关资源
    最近更新 更多