softmax的输出使二进制交叉熵的输出NAN,该怎么办?

时间:2019-06-21 06:43:26

标签: python tensorflow conv-neural-network softmax cross-entropy

我已经在Tensorflow中实现了一个神经网络,其中最后一层是卷积层,我将该卷积层的输出输入到softmax激活函数中,然后将其输入到交叉熵损失函数中,该函数的定义如下与标签,但问题是我得到NAN作为损失函数的输出,我发现这是因为softmax的输出中有1。那么,我的问题是在这种情况下该怎么办? 我的输入是一个16 x 16的图像,其中每个像素的值分别为0和1(二进制分类)

我的损失函数:

#Loss function
def loss(prediction, label):
    #with tf.variable_scope("Loss") as Loss_scope:
    log_pred = tf.log(prediction, name='Prediction_Log')
    log_pred_2 = tf.log(1-prediction, name='1-Prediction_Log')
    cross_entropy = -tf.multiply(label, log_pred) - tf.multiply((1-label), log_pred_2) 

    return cross_entropy

1 个答案:

答案 0 :(得分:2)

请注意,log(0)是未定义的,因此,如果prediction==0prediction==1出现NaN。

为了解决这个问题,通常在任何损失函数中将很小的值epsilon添加到传递给tf.log的值中(除法时我们也做类似的事情以避免除以零)。这使我们的损失函数在数值上稳定,并且ε值足够小,以至于我们引入损失的任何误差都可以忽略不计。

也许尝试类似的事情:

#Loss function
def loss(prediction, label):
    #with tf.variable_scope("Loss") as Loss_scope:

    epsilon = tf.constant(0.000001)
    log_pred = tf.log(prediction + epsilon, name='Prediction_Log')
    log_pred_2 = tf.log(1-prediction + epsilon, name='1-Prediction_Log')

    cross_entropy = -tf.multiply(label, log_pred) - tf.multiply((1-label), log_pred_2) 
    return cross_entropy

更新:

尽管jdehesa在他的评论中指出-“开箱即用”的损失函数已经很好地解决了数值稳定性问题