如何解决南方损失?

时间:2016-10-20 15:28:06

标签: python tensorflow nan

问题

我在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

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

我还能怎样解决这个问题?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

我没有您的代码或数据。但tf.nn.softmax_cross_entropy_with_logits应该是稳定的,并且有效的概率分布(更多信息here)。我假设您的数据不符合此要求。还讨论了一个类似的问题here。哪个会引导你:

  1. 实施您自己的softmax_cross_entropy_with_logits功能,例如尝试(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])
    
  2. 更新您的数据,使其确实具有有效的概率分布