【问题标题】: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 神经网络的自定义损失函数。