我已经在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
答案 0 :(得分:2)
请注意,log(0)
是未定义的,因此,如果prediction==0
或prediction==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在他的评论中指出-“开箱即用”的损失函数已经很好地解决了数值稳定性问题