【问题标题】:accuracy in neural learning becomes NaN (tensorflow)神经学习的准确率变成了 NaN(张量流)
【发布时间】:2018-03-27 03:51:09
【问题描述】:

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

什么意思?

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    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,也就是没有在其上应用任何东西的输出层)。

    【讨论】:

    • 非常感谢 March,我的损失函数真的错了。
    • 实际上,我误读了您的问题,您使用的是 sigmoid 交叉熵,而不是 softmax 交叉熵。我怀疑同样的问题正在发生,因为交叉熵仍然会遇到同样的问题,但至少 sigmoid 的错误比 softmax 的错误要少。 :)
    • 现在我正在用规范损失测试我的网络,它看起来好多了。我想我对这篇文章的理解有误:“模型的输入是灰度图像,而目标输出是 CIE La的 ab 分量>b* 颜色空间。ab 分量是全局归一化的,因此它们位于 Sigmoid 传递函数的 [0;1] 范围内。然后我们将目标输出缩放到输出的大小着色网络并计算输出和目标输出之间的 MSE 作为损失"
    • “计算输出和目标输出之间的 MSE 作为损失,”宾果游戏,MSE = 均方误差。听起来你现在走上了正轨。 :)
    猜你喜欢
    • 1970-01-01
    • 2021-01-02
    • 2018-03-17
    • 2018-09-07
    • 2019-01-12
    • 2012-07-09
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多