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

bas*_*ert 12 python backend algebraic-number keras tensorflow

我正在尝试实现这个损失函数: 本文档中的MCFD_loss_function(P6):损失函数

所以我创建了一个这样的新函数:

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))
           , 0)
        , 'float32')
    )
Run Code Online (Sandbox Code Playgroud)

但是当我开始训练时,会出现此错误:

ValueError:具有None渐变的操作.请确保所有操作都定义了渐变(即可区分).没有渐变的常见操作:K.argmax,K.round,K.eval.

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

谢谢.

Sim*_*mdi 4

你希望你的损失函数检查是否sign(f_(t,1))*sign(Y_(t+1))大于 0。由于sign在 0 处不可微分,我建议使用它softsign

\n\n

由于大于函数也是不可微的,因此可以使用以下近似值(请参见此处):max\xcf\xb5(x,y):= 0.5(x + y + abs\xcf\xb5(x \xe2\x88\x92 y)),其中abs\xcf\xb5(x):=sqrt(x^2 + \xcf\xb5)\xcf\xb5 > 0。为简单起见,我将在下面的代码示例中将此近似值称为greater_approx。(注意,您只需插入上面的计算即可)

\n\n

查看损失函数的定义,您必须将总和除以预测数 ( K.get_variable_shape(y_pred)[0])(并添加一个减号)。P对应于时间序列预测论文中的损失函数的预测数量。

\n\n

总而言之,您的损失函数应该如下所示:

\n\n
def mcfd_loss(y_true, y_pred):\n   return - (1/K.get_variable_shape(y_pred)[0]) * K.sum( # \xe2\x88\x91\n      K.cast(\n         greater_approx( # only values greater than 0 (+ float32 cast)\n            K.dot(K.softsign(y_pred),  # \xcf\x80\n                    K.softsign(y_true))\n         , 0)\n      , \'float32\')\n   )\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后一句话:要在 Keras 中使用自定义损失函数,请查看此问题

\n