Keras自定义丢失实现:ValueError:对于渐变,操作具有“无”

时间:2018-03-11 21:19:05

标签: python tensorflow keras backend algebraic-number

我试图实现这种损失功能: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。

我不知道错过了哪一点。似乎提出错误是因为我使用了更多功能。我不知道这个错误是什么意思以及如何纠正我的问题。

感谢。

1 个答案:

答案 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