我使用tensorflow为灰度图像着色。因此,我使用sigmoid_cross_entropy_with_logits()
并使用tf.train.AdadeltaOptimizer()
将其最小化。我训练并打印
correct_prediction = tf.norm(y_ - y_conv)
但经过几次迭代,它给了我nan
:
step 0, acc 2068538.88
step 1, acc 287121.97
step 2, acc 82377.69
step 3, acc 31250.95
step 4, acc 16694.72
step 5, acc 10168.58
step 6, acc 6993.02
step 7, acc nan
step 8, acc nan
step 9, acc nan
这是什么意思?
答案 0 :(得分:2)
Softmax&交叉熵损失不是输出层的正确选择。
首先,交叉熵使熵最小化并且需要[0,1]的域。尽管您的像素值可能会被标准化为[0,1]范围,但是交叉熵的工作方式将不会像您期望的那样。交叉熵是分类的最佳选择。你应该使用平方误差之和来弥补损失。
更大的问题是您正在将softmax应用于图像。看看softmax如何在这里工作,你会对它有一个直观的感觉,可能会看到出了什么问题:
http://neuralnetworksanddeeplearning.com/chap3.html#softmax
Softmax要求所有输出的总和(图像的像素)等于1,这意味着许多像素将被强制为0.这与您的损失功能完全不一致。
我打赌发生的事情是你的标签中的一些像素接近1.0而softmax正在推动接近0.0的这么多像素,至少应该是1.0的这些像素中的一些最终得到接近0.0的预测。
当1.0的边距错误时,交叉熵有一个无限的损失,这是你通过选择softmax强迫它的条件,因此由于极端的梯度而导致NaN的支付。
正确的解决方案是使用未缩放的输出并将平方误差丢失应用于未缩放的输出(没有softmax,没有sigmoid,没有relu,只有logits,也就是你的输出层没有任何应用在它上面)。