我在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
?
我还能怎样解决这个问题?
答案 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。哪个会引导你:
实施您自己的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])
更新您的数据,使其确实具有有效的概率分布