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



>我在 Tensorflow 中实现了一个神经网络,其中最后一层是卷积层,我将这个卷积层的输出馈送到 softmax 激活函数中,然后将其馈送到交叉熵损失函数,该函数与标签一起定义如下,但问题是我得到了 NAN 作为我的损失函数的输出,我发现这是因为我的输出中有 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

请注意,log(0)是未定义的,因此如果prediction==0prediction==1,您将拥有一个NaN。

为了解决这个问题,在任何损失函数中传递给tf.log的值中添加一个非常小的值epsilon是很常见的(我们在除法时也会做类似的事情以避免除以零(。这使得我们的损失函数在数值上稳定,并且 epsilon 值足够小,以至于它给我们的损失带来的任何不准确性都可以忽略不计。

也许尝试这样的事情:

#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在他的评论中指出的那样 - "开箱即用"的损失函数已经很好地处理了数值稳定性问题

最新更新