【问题标题】:tensorflow MDA custom loss and ValueError: No gradients provided for any variabletensorflow MDA 自定义损失和 ValueError:没有为任何变量提供梯度
【发布时间】:2022-12-04 07:28:19
【问题描述】:

我想使用 MDA(平均方向精度)作为张量流神经网络的自定义损失函数。

我正在尝试按照此处所述来实现: Custom Mean Directional Accuracy loss function in Keras

def mda(y_true, y_pred):
    s = K.equal(K.sign(y_true[1:] - y_true[:-1]),
                 K.sign(y_pred[1:] - y_pred[:-1]))
    return K.mean(K.cast(s, K.floatx())) 

网络工作正常,但当我尝试拟合数据时出现此错误:

 ValueError: No gradients provided for any variable

我认为这是因为我正在从我的 pred 张量中丢失梯度信息,但我不知道如何实现这个......或者这是否有意义......最后我想预测是否有一些数字系列上升或下降,这就是为什么这个功能对我有意义。

【问题讨论】:

    标签: python tensorflow keras loss-function


    【解决方案1】:

    看起来您看到的错误是因为您定义的 mda() 函数没有任何可微分操作。因此,TensorFlow 不知道如何计算函数的梯度,也无法使用反向传播优化神经网络的权重。

    要解决此问题,您需要确保您的 mda() 函数仅使用可微分操作。这将允许 TensorFlow 计算函数的梯度并使用它们来优化网络的权重。

    一种方法是在 mda() 函数中使用 tf.math.sign() 函数而不是 K.sign(),并使用 tf.math.reduce_mean() 函数而不是 K.mean()。这两个函数都是可微分的,因此 TensorFlow 将能够计算 mda() 函数的梯度并使用它们来优化网络的权重。

    下面是一个示例,说明如何修改 mda() 函数以使用可微分操作:

    import tensorflow as tf
    
    def mda(y_true, y_pred):
        s = tf.equal(tf.math.sign(y_true[1:] - y_true[:-1]),
                     tf.math.sign(y_pred[1:] - y_pred[:-1]))
        return tf.math.reduce_mean(tf.cast(s, tf.float32))
    
    

    这应该允许您将 mda() 函数用作 TensorFlow 神经网络的自定义损失函数。

    【讨论】:

      猜你喜欢
      • 2021-05-08
      • 1970-01-01
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      • 2020-04-05
      • 1970-01-01
      • 2020-10-31
      • 2020-09-30
      相关资源
      最近更新 更多