如何解决南损失?

新手上路,请多包涵

问题

我在 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 还是不是?

我还能如何解决这个问题?

原文由 Swind D.C. Xu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 405
1 个回答

我在这里发现了类似的问题 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_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)))

解决了 nan 问题。

原文由 ForrestZhang 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题