问题
我在 MNIST 上运行深度神经网络,其中损失定义如下:
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, label))
该程序似乎可以正常运行,直到我在第 10000 多个小批量中出现 nan 损失。有时,程序会正确运行直到完成。我认为 tf.nn.softmax_cross_entropy_with_logits
给我这个错误。这很奇怪,因为代码只包含 mul
和 add
操作。
可能的解决方案
也许我可以使用:
if cost == "nan":
optimizer = an empty optimizer
else:
...
optimizer = real optimizer
但是我找不到 nan
的类型。我如何检查变量是 nan
还是不是?
我还能如何解决这个问题?
原文由 Swind D.C. Xu 发布,翻译遵循 CC BY-SA 4.0 许可协议
我在这里发现了类似的问题 TensorFlow cross_entropy NaN problem
感谢作者user1111929
实际上是一种计算交叉熵的可怕方法。在一些样本中,某些类别可以在一段时间后被排除在外,导致该样本的 y_conv=0。这通常不是问题,因为您对这些不感兴趣,但在 cross_entropy 的编写方式中,它会为该特定样本/类产生 0*log(0) 。因此是 NaN。
替换为
或者
解决了 nan 问题。