Swi*_* Xu 9 python nan tensorflow
我在MNIST上运行深度神经网络,其中损失定义如下:
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, label))
该程序似乎运行正常,直到我在10000多个小批量中获得纳米损失.有时,程序正常运行直到完成.我想tf.nn.softmax_cross_entropy_with_logits是给了我这个错误.这很奇怪,因为代码只包含mul和add操作.
也许我可以用:
if cost == "nan":
  optimizer = an empty optimizer 
else:
  ...
  optimizer = real optimizer
但我找不到那种类型nan.我该如何检查变量nan?
我怎么能解决这个问题?
小智 7
您获得NaN的原因很可能是在您的成本函数或softmax中的某个位置,您尝试记录零,这不是一个数字.但是为了回答有关检测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
我在这里找到类似的问题TensorFlow cross_entropy NaN问题
感谢作者user1111929
tf.nn.softmax_cross_entropy_with_logits => -tf.reduce_sum(y_*tf.log(y_conv))
实际上是一种计算交叉熵的可怕方法.在一些样本中,某些类可以在一段时间后确定地排除,导致该样本的y_conv = 0.这通常不是问题,因为你对那些不感兴趣,但是在那里写入cross_entropy的方式,它为该特定样本/类产生0*log(0).因此NaN.
用它替换它
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)))
解决了纳问题.
我没有你的代码或数据。但tf.nn.softmax_cross_entropy_with_logits应该在有效的概率分布下保持稳定(更多信息请参见此处)。我认为您的数据不符合此要求。这里也讨论了类似的问题。这会导致你:
实现你自己的softmax_cross_entropy_with_logits函数,例如 try ( source ):
epsilon = tf.constant(value=0.00001, shape=shape)
logits = logits + epsilon
softmax = tf.nn.softmax(logits)
cross_entropy = -tf.reduce_sum(labels * tf.log(softmax), reduction_indices=[1])
更新您的数据,使其具有有效的概率分布
| 归档时间: | 
 | 
| 查看次数: | 26767 次 | 
| 最近记录: |