【问题标题】:No gradients provided for any variable for custom loss function没有为自定义损失函数的任何变量提供梯度
【发布时间】:2021-01-07 20:36:44
【问题描述】:

我在 Keras 中创建了一个自定义损失函数,如下所示:

import tensorflow as tf
import numpy as np
def custom_loss(y_true, y_pred):
   cce = tf.keras.losses.CategoricalCrossentropy()
   loss = cce(y_true, y_pred).numpy()

   epsilon = np.finfo(np.float32).eps
   confidence = np.clip(y_true.numpy(), epsilon, 1.-epsilon)
   sample_entropy = -1. * np.sum(np.multiply(confidence, np.log(confidence) / np.log(np.e)), axis=-1)
   entropy = np.mean(sample_entropy)
   penalty = 0.1 * -entropy
   
   return loss + penalty

当我使用这个自定义损失函数时,我收到了错误消息

ValueError: 没有为任何变量提供渐变

现在可以通过某种方式计算梯度。需要如何改变损失函数才能计算梯度?

【问题讨论】:

    标签: python machine-learning keras tensorflow2.0 tf.keras


    【解决方案1】:

    Tensorflow 需要 tensor 来存储依赖信息以让梯度 flow 向后,如果你在损失函数中将张量转换为 numpy 数组,那么你打破了这种依赖,因此没有为任何变量提供梯度,所以你需要更改每个 @损失函数中的987654323@操作对应tfbackend操作,例如:

    import tensorflow as tf
    import numpy as np
    
    cce = tf.keras.losses.CategoricalCrossentropy()
    epsilon = np.finfo(np.float32).eps
    
    def custom_loss(y_true, y_pred):
        loss = cce(y_true, y_pred)
        confidence = tf.clip_by_value(y_true, epsilon, 1.-epsilon)
        sample_entropy = -1. * tf.reduce_sum(tf.math.multiply(confidence, tf.math.log(confidence) / tf.math.log(np.e)), axis=-1)
        entropy = tf.reduce_mean(sample_entropy)
        penalty = 0.1 * -entropy
        return loss + penalty
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-09
      • 1970-01-01
      • 2021-05-08
      • 1970-01-01
      • 2020-04-05
      • 2021-01-08
      • 2022-12-04
      • 1970-01-01
      相关资源
      最近更新 更多