交叉熵损失突然增加到无穷大

时间:2018-02-03 18:04:27

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

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

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))

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

3 个答案:

答案 0 :(得分:3)

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

我希望你专注于几点:

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

  • 请参阅下面的softmax公式:

enter image description here

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

答案 1 :(得分:3)

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

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

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

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

3)张量流的数值不稳定性存在并且难以克服。是的,有tf.nn.softmax_with_cross_entropy,但这太具体了(如果您不想要softmax,该怎么办?)。请参阅Vahid Kazemi的“有效Tensorflow”以获取深入的解释:https://github.com/vahidk/EffectiveTensorflow#entropy

答案 2 :(得分:1)

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

  

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