我尝试编写一个自定义的二元交叉熵损失函数。
这是我的脚本:
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
。您发布的公式已重新表述为ensure stability and avoid underflow
。以下推导来自tf.nn.sigmoid_cross_entropy_with_logits https://www.tensorflow.org/api_docs/python/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
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)))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)