如何解决南方损失?

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是给了我这个错误.这很奇怪,因为代码只包含muladd操作.

可能解决方案

也许我可以用:

if cost == "nan":
  optimizer = an empty optimizer 
else:
  ...
  optimizer = real optimizer
Run Code Online (Sandbox Code Playgroud)

但我找不到那种类型nan.我该如何检查变量nan

我怎么能解决这个问题?

小智 9

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


小智 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
Run Code Online (Sandbox Code Playgroud)


For*_*ang 6

我在这里找到类似的问题TensorFlow cross_entropy NaN问题

感谢作者user1111929

tf.nn.softmax_cross_entropy_with_logits => -tf.reduce_sum(y_*tf.log(y_conv))
Run Code Online (Sandbox Code Playgroud)

实际上是一种计算交叉熵的可怕方法.在一些样本中,某些类可以在一段时间后确定地排除,导致该样本的y_conv = 0.这通常不是问题,因为你对那些不感兴趣,但是在那里写入cross_entropy的方式,它为该特定样本/类产生0*log(0).因此NaN.

用它替换它

cross_entropy = -tf.reduce_sum(y_*tf.log(y_conv + 1e-10))
Run Code Online (Sandbox Code Playgroud)

要么

cross_entropy = -tf.reduce_sum(y_*tf.log(tf.clip_by_value(y_conv,1e-10,1.0)))
Run Code Online (Sandbox Code Playgroud)

解决了纳问题.


Fem*_*ich 2

我没有你的代码或数据。但tf.nn.softmax_cross_entropy_with_logits应该在有效的概率分布下保持稳定(更多信息请参见此处)。我认为您的数据不符合此要求。这里也讨论了类似的问题。这会导致你:

  1. 实现你自己的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])
    
    Run Code Online (Sandbox Code Playgroud)
  2. 更新您的数据,使其具有有效的概率分布