tensorflow MDA自定义损失和ValueError:没有为任何变量提供梯度



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

我正试图实现这个描述在这里: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张量中丢失了梯度信息,但我不知道如何实现这个....如果这有意义的话....最后我想预测的是,如果一些数值级数是上升还是下降,这就是为什么这个函数对我来说是有意义的。

问题是,对于K.equalK.cast,您将数字更改为bool。因此,无法计算梯度。

你可以用计算代替它们;当两个数相等时,它们的差值为零,并且由于sign只返回[- 1,0,1],因此绝对差值只能为0,1或2:

def mda(y_true, y_pred):
d = K.abs(K.sign(y_true[1:] - y_true[:-1]) - (K.sign(y_pred[1:] - y_pred[:-1])))
s = (1. - d) * (d - 1.) * (d - 2.) / 2.
return K.mean(s)

K.equal为真时,s等于1,否则0为真

感谢Reda和AndrzeO回答我的问题。正如AndrzejO所提到的,equals将数据转换为布尔值,因此那里没有梯度。

我实现了另一个解决方案,作为androzejo解决方案的替代方案:

def mda_custom_loss(y_true, y_pred):
res = tf.math.sign(y_true[1:] - y_true[:-1]) - tf.math.sign(y_pred[1:] - y_pred[:-1])
s = tf.math.abs(tf.math.sign(res))
return 1 - tf.math.reduce_mean(tf.math.sign(s))

相关内容

最新更新