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

我试图从一篇研究论文中复制一个深度卷积神经网络.我已经实现了这个架构,但是在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))

《python – 交叉熵损失突然增加到无穷大》

《python – 交叉熵损失突然增加到无穷大》

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

最佳答案 解决方案:控制解决方案空间.这可能意味着在训练时使用较小的数据集,这可能意味着使用较少的隐藏节点,这可能意味着以不同方式初始化您的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.

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的“有效张量流”,以获得深刻的解释:https://github.com/vahidk/EffectiveTensorflow#entropy

点赞