我使用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


这是什么意思?

最佳答案

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,没有S型,没有relu,只有logits,也就是没有在其上应用任何内容的输出层)。

关于python - 神经学习的准确性变为NaN( tensorflow ),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49499029/

10-12 21:52