我在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
?
我还能怎么解决这个问题呢?
我在这里发现了一个类似的问题TensorFlow cross_entropy NaN problem
感谢作者user1111929
实际上是一种计算交叉熵的可怕方法。在某些示例中,某些类可能在一段时间后被确定地排除在外,从而导致该示例的y_conv=0。这通常不是问题,因为您对这些不感兴趣,但是在这里编写cross_熵的方式中,它为特定的样本/类生成0*log(0)。因此,南。
替换为
或者
解决了南问题。
检查你的学习率。网络越大,需要学习的参数就越多。这意味着你还需要降低学习率。
你得到NaN的原因很可能是在你的成本函数或softmax的某个地方,你试图记录一个0,这不是一个数字。但是为了回答您关于检测NaN的特定问题,Python具有在数学模块中测试NaN的内置功能。例如:
相关问题 更多 >
编程相关推荐