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