gpt4 book ai didi

python - Keras 自定义二元交叉熵损失函数。获取 NaN 作为损失的输出

转载 作者:太空宇宙 更新时间:2023-11-04 09:48:20 26 4
gpt4 key购买 nike

我尝试编写自定义二元交叉熵损失函数。这是我的脚本:

def my_custom_loss(y_true,y_pred):
t_loss = (-1)*(y_true * K.log(y_pred) + (1 - y_true) * K.log(1 - y_pred))
return K.mean(t_loss)

当我使用这个损失函数运行我的脚本时,经过几次迭代,我得到 NaN 作为损失函数的输出。

然后我看了TensorFlow文档,我把损失函数修改成如下:

 t_loss = K.max(y_pred,0)-y_pred * y_true + K.log(1+K.exp((-1)*K.abs(y_pred)))

代码运行没有任何问题。我想知道是否有人可以解释为什么我的第一个损失函数给出 NaN 输出。

二元交叉熵:y * log(p) + (1-y) * log(1-p)

我有 sigmoid 函数作为我最后一层的激活函数。所以“p”的值应该在 0 到 1 之间。这个范围内应该存在对数。

谢谢。

最佳答案

二元交叉熵的简单实现将在 0 输出或大于 1 输出时遇到数值问题,例如 log(0) -> NaN。您发布的公式已重新制定,以确保稳定性并避免下溢。以下推导来自tf.nn.sigmoid_cross_entropy_with_logits .

z * -log(sigmoid(x)) + (1 - z) * -log(1 - sigmoid(x))
= z * -log(1 / (1 + exp(-x))) + (1 - z) * -log(exp(-x) / (1 + exp(-x)))
= z * log(1 + exp(-x)) + (1 - z) * (-log(exp(-x)) + log(1 + exp(-x)))
= z * log(1 + exp(-x)) + (1 - z) * (x + log(1 + exp(-x))
= (1 - z) * x + log(1 + exp(-x))
= x - x * z + log(1 + exp(-x))

对于 x < 0,为了避免 exp(-x) 溢出,我们重新表述上述

x - x * z + log(1 + exp(-x))
= log(exp(x)) - x * z + log(1 + exp(-x))
= - x * z + log(1 + exp(x))

并且实现使用等价形式:

max(x, 0) - x * z + log(1 + exp(-abs(x)))

关于python - Keras 自定义二元交叉熵损失函数。获取 NaN 作为损失的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48951109/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com