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.
我不知道我错过了哪一点.似乎提出错误是因为我使用了更多功能.我不知道这个错误是什么意思,以及如何纠正我的问题.
谢谢.
你希望你的损失函数检查是否sign(f_(t,1))*sign(Y_(t+1))大于 0。由于sign在 0 处不可微分,我建议使用它softsign。
由于大于函数也是不可微的,因此可以使用以下近似值(请参见此处):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。(注意,您只需插入上面的计算即可)
查看损失函数的定义,您必须将总和除以预测数 ( K.get_variable_shape(y_pred)[0])(并添加一个减号)。P对应于时间序列预测论文中的损失函数的预测数量。
总而言之,您的损失函数应该如下所示:
\n\ndef 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 )\nRun Code Online (Sandbox Code Playgroud)\n\n最后一句话:要在 Keras 中使用自定义损失函数,请查看此问题
\n| 归档时间: |
|
| 查看次数: |
7864 次 |
| 最近记录: |