KERAS自定义二进制跨熵损失函数.让NAN作为损失的产出



我尝试编写自定义的二进制跨透明损失函数。这是我的脚本:

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(

i具有Sigmoid函数作为我上一层的激活。因此" P"的值应在0到1之间。该范围应存在日志。

谢谢。

二进制交叉熵的幼稚实现将在0输出或大于一个输出(例如log(0) -> NaN(上遇到数值问题。您发布的公式已重新注册为ensure stability and avoid underflow。以下扣除来自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)))

最新更新