我试图实现这种损失功能:MCFD_loss_function 来自本文件(P6):Loss functions
所以我创建了一个像这样的新函数:
def mcfd_loss(y_true, y_pred):
return K.sum( # ∑
K.cast(
K.greater( # only values greater than 0 (+ float32 cast)
K.dot(K.sign(y_pred), # π
K.sign(y_true))
, 1)
, 'float32')
)
但是当我开始训练时,会出现这个错误:
ValueError:对于渐变,操作具有
None
。请确保您的所有操作都定义了渐变(即可区分)。没有渐变的常见操作:K.argmax,K.round,K.eval。
我不知道错过了哪一点。似乎提出错误是因为我使用了更多功能。我不知道这个错误是什么意思以及如何纠正我的问题。
感谢。
答案 0 :(得分:1)
您希望损失函数检查sign(f_(t,1))*sign(Y_(t+1))
是否大于0。由于sign
不可微分为0,因此建议改用softsign
。
由于greate函数也不可微,因此可以使用以下近似值(请参见here):maxϵ(x,y):= 0.5(x + y + absϵ(x − y))
,其中absϵ(x):=sqrt(x^2 + ϵ)
和ϵ > 0
。为简单起见,在下面的代码示例中,我将这种近似称为greater_approx
。 (请注意,您只需要在上面插入计算即可)
查看损失函数的定义,您必须将总和除以预测数(K.get_variable_shape(y_pred)[0]
)(并加上一个负数)。 P
对应于根据Loss Functions in Time Series Forecasting paper的预测数。
所有损失函数应该看起来像这样:
def mcfd_loss(y_true, y_pred):
return - (1/K.get_variable_shape(y_pred)[0]) * K.sum( # ∑
K.cast(
greater_approx( # only values greater than 0 (+ float32 cast)
K.dot(K.softsign(y_pred), # π
K.softsign(y_true))
, 0)
, 'float32')
)
最后备注:用于在Keras中使用自定义损失函数来检出此SO question