【问题标题】:Cross entropy loss suddenly increases to infinity交叉熵损失突然增加到无穷大
【发布时间】:2018-07-13 23:58:35
【问题描述】:

我正在尝试从一篇研究论文中复制一个深度卷积神经网络。我已经实现了架构,但是在 10 个 epoch 之后,我的交叉熵损失突然增加到无穷大。这可以在下面的图表中看到。您可以忽略问题发生后准确性的变化。

Here 是带有架构图的 github 存储库

在做了一些研究之后,我认为使用 AdamOptimizer 或 relu 可能会有问题。

x = tf.placeholder(tf.float32, shape=[None, 7168])
y_ = tf.placeholder(tf.float32, shape=[None, 7168, 3])

#Many Convolutions and Relus omitted

final = tf.reshape(final, [-1, 7168])
keep_prob = tf.placeholder(tf.float32)
W_final = weight_variable([7168,7168,3])
b_final = bias_variable([7168,3])
final_conv = tf.tensordot(final, W_final, axes=[[1], [1]]) + b_final

cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=final_conv))
train_step = tf.train.AdamOptimizer(1e-5).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(final_conv, 2), tf.argmax(y_, 2))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

编辑 如果有人感兴趣,解决方案是我基本上输入了不正确的数据。

【问题讨论】:

  • 事件发生后,损失低很多,准确率高很多?您能否在每个时期后使用其他随机洗牌数据集设置重现该问题?我怀疑这是一个偶然的对抗性案例。
  • 问题中提到的问题出现后忽略准确性
  • @Jai 是的,但为什么忽略它?这更有趣。
  • 是的...我认为这不是正确的图表...
  • 损失为 0,因为图表无法显示 nan(infinity) 的值。准确率提高是因为问题发生后,模型将每个类别标记为“0”。恰好将所有内容标记为“0”是非常准确的

标签: python tensorflow machine-learning deep-learning conv-neural-network


【解决方案1】:

解决方案:控制解决方案空间。这可能意味着在训练时使用更小的数据集,这可能意味着使用更少的隐藏节点,这可能意味着以不同的方式初始化你的 wb。您的模型达到了损失未定义的点,这可能是由于未定义梯度或 final_conv 信号。

为什么:有时无论如何,都会达到数值不稳定性。最终添加一个机器 epsilon 以防止除以零(此处为交叉熵损失)将无济于事,因为即使那样,数字也无法用您使用的精度准确表示。 (参考:https://en.wikipedia.org/wiki/Round-off_errorhttps://floating-point-gui.de/basic/

注意事项:
1) 调整 epsilon 时,请确保与您的数据类型保持一致(使用您正在使用的精度的机器 epsilon,在您的情况下 float32 是 1e-6 ref:https://en.wikipedia.org/wiki/Machine_epsilonpython numpy machine epsilon

2) 以防万一其他人阅读本文感到困惑:Adamoptimizer 的构造函数中的值是学习率,但您可以设置 epsilon 值(参考:How does paramater epsilon affects AdamOptimizer?https://www.tensorflow.org/api_docs/python/tf/train/AdamOptimizer

3)张量流的数值不稳定是存在的,而且很难解决。是的,有 tf.nn.softmax_with_cross_entropy 但这太具体了(如果你不想要 softmax 怎么办?)。请参阅 Vahid Kazemi 的“Effective Tensorflow”以获得深刻的解释:https://github.com/vahidk/EffectiveTensorflow#entropy

【讨论】:

    【解决方案2】:

    你的损失图中的跳跃非常奇怪......

    我希望你关注几点:

    • 如果您的图像未在 0 和 1 之间进行归一化,则对其进行归一化
    • 如果您已将 -1 和 1 之间的值标准化,则使用 sigmoid 层而不是 softmax,因为 softmax 会压缩 0 和 1 之间的值
    • 在使用 softmax 之前添加一个 sigmoid 层来压缩你的值(强烈推荐)
    • 您可以做的其他事情是为每一层添加 dropout
    • 另外我建议你使用tf.clip,这样你的渐变就不会爆炸和内爆
    • 你也可以使用 L2 正则化
    • 并试验 AdamOptimizer 的学习率和 epsilon
    • 我还建议您使用张量板来跟踪权重,这样您就可以知道权重在哪里爆炸
    • 您还可以使用张量板来跟踪损失和准确性

    • 参见下面的 softmax 公式:

    • 可能是 e 的 x 次方,x 是一个非常大的数字,因为 softmax 给出无穷大,因此损失是无穷大
    • 大量使用 tensorboard 来调试和打印 softmax 的值,以便找出哪里出错了
    • 还有一件事我注意到您在卷积层之后没有使用任何类型的激活函数...我建议您在每个卷积层之后leaky relu
    • 您的网络是一个庞大的网络,使用leaky relu 作为激活函数很重要,这样它可以增加非线性,从而提高性能

    【讨论】:

    • 我的图像在 0 和 1 之间进行了归一化。我玩过 adam 优化器的学习率和 epsilon,你会推荐一个不同的吗?原论文没有在每次卷积后都使用leaky relu,所以我很犹豫。感谢tensorboard的推荐,我不太熟悉。
    • 你使用了相同的数据吗?...尝试在softmax之前使用sigmoid层...使用tf.clip ...使用dropouts
    • 我是 tesnorflow/tensorboard 的新手。鉴于我提供的代码,我将如何打印出我的 softmax 值?我相信目前softmax是与交叉熵同时计算的。如果我想打印交叉熵,目前我只是在训练期间使用 cross_entropy.eval()。
    • 你是对的,softmax 是与交叉熵同时计算的……但是你可以显式使用tf.nn.softmax() 如下:print(sess.run(tf.nn.softmax(logits)))
    • logits = tf.nn.sigmoid(output_layer) 然后softmax_with_cross_entropy(logits, targets).... 如果您发现此答案有助于解决您的问题,请不要忘记将其标记为正确,以便其他人了解它
    【解决方案3】:

    您可能希望在 Adam 优化器中为 epsilon 使用不同的值(例如 0.1 -- 1.0)。documentation 中提到了这一点:

    epsilon 的默认值 1e-8 通常可能不是一个好的默认值。例如,在 ImageNet 上训练 Inception 网络时,当前较好的选择是 1.0 或 0.1。

    【讨论】:

    • 这不是一个初始网络。我非常有信心提高训练率不是答案。
    • Epsilon 不是训练率,而是正则化因子。并且注释以 inception 作为示例,而不是具体要求。
    • 对不起,我误会了。你能解释一下为什么 epsilon 会导致这个问题吗?
    • 如果更改有帮助,我可以解释一下 :-)。我不知道这是问题所在,但在平均平方梯度接近零的情况下,更大的 epsilon 可能有助于稳定自适应学习率。请参阅 TF 文档中链接的原始论文。也许只是尝试看看它是否有所作为。
    • RobR 可能是正确的。为了清楚起见... AdamOptimizer 有一些输入参数... learning_rate、beta1、beta2、EPSILON 等。他的意思是你应该弄乱第四个参数。在您的代码中,您为 learning_rate 指定了 1e-5 的值,但您使用的是默认的 epsilon。尝试更改该 epsilon。
    猜你喜欢
    • 2021-08-25
    • 2018-08-07
    • 2018-09-03
    • 2016-08-01
    • 2018-05-31
    • 2019-06-19
    • 2021-02-03
    • 2017-03-14
    • 2020-10-09
    相关资源
    最近更新 更多