我用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什么意思?
发布于 2018-03-26 19:42:48
软件最大和交叉熵损失不是您的输出层的正确选择。
首先,交叉熵最小化了熵,并且需要一个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,这是一个条件,你是强迫它由你选择的软件,因此支付它与NaN的发生,因为极端的梯度。
正确的解决方案是使用非缩放输出,并将平方错误损失应用于您的非缩放输出(没有softmax、无sigmoid、没有relu、只有逻辑,也就是您的输出层,而没有在输出层之上应用任何内容)。
https://stackoverflow.com/questions/49499029
复制相似问题