如何解决南输?

2024-05-16 10:37:22 发布

您现在位置:Python中文网/ 问答频道 /正文

问题

我在MNIST上运行一个深度神经网络,其中损失定义如下:

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, label))

这个程序似乎运行正常,直到我在10000多个小批量中得到一个nan损失。有时,程序会正确运行直到完成。我认为tf.nn.softmax_cross_entropy_with_logits给了我这个错误。 这很奇怪,因为代码只包含muladd操作。

可能的解决方案

也许我可以用:

if cost == "nan":
  optimizer = an empty optimizer 
else:
  ...
  optimizer = real optimizer

但我找不到nan的类型。如何检查变量是否为nan

我还能怎么解决这个问题呢?


Tags: 程序定义tfwith神经网络nnnanoptimizer
3条回答

我在这里发现了一个类似的问题TensorFlow cross_entropy NaN problem

感谢作者user1111929

tf.nn.softmax_cross_entropy_with_logits => -tf.reduce_sum(y_*tf.log(y_conv))

实际上是一种计算交叉熵的可怕方法。在某些示例中,某些类可能在一段时间后被确定地排除在外,从而导致该示例的y_conv=0。这通常不是问题,因为您对这些不感兴趣,但是在这里编写cross_熵的方式中,它为特定的样本/类生成0*log(0)。因此,南。

替换为

cross_entropy = -tf.reduce_sum(y_*tf.log(y_conv + 1e-10))

或者

cross_entropy = -tf.reduce_sum(y_*tf.log(tf.clip_by_value(y_conv,1e-10,1.0)))

解决了南问题。

检查你的学习率。网络越大,需要学习的参数就越多。这意味着你还需要降低学习率。

你得到NaN的原因很可能是在你的成本函数或softmax的某个地方,你试图记录一个0,这不是一个数字。但是为了回答您关于检测NaN的特定问题,Python具有在数学模块中测试NaN的内置功能。例如:

import math
val = float('nan')
val
if math.isnan(val):
    print('Detected NaN')
    import pdb; pdb.set_trace() # Break into debugger to look around

相关问题 更多 >