Tensorflow NaN错误?
我使用TensorFlow,并修改了教程示例以获取RGB图像。
该算法在新图像集合中完美无缺地工作,直到突然(仍然收敛,通常约为92%的准确度),它会因ReluGrad接收到非有限值的错误而崩溃。 调试表明,数字之前没有任何不寻常的事情发生,直到非常突然,由于不明原因,错误被抛出。 添加
print "max W vales: %g %g %g %g"%(tf.reduce_max(tf.abs(W_conv1)).eval(),tf.reduce_max(tf.abs(W_conv2)).eval(),tf.reduce_max(tf.abs(W_fc1)).eval(),tf.reduce_max(tf.abs(W_fc2)).eval())
print "max b vales: %g %g %g %g"%(tf.reduce_max(tf.abs(b_conv1)).eval(),tf.reduce_max(tf.abs(b_conv2)).eval(),tf.reduce_max(tf.abs(b_fc1)).eval(),tf.reduce_max(tf.abs(b_fc2)).eval())
作为每个循环的调试代码,产生以下输出:
Step 8600
max W vales: 0.759422 0.295087 0.344725 0.583884
max b vales: 0.110509 0.111748 0.115327 0.124324
Step 8601
max W vales: 0.75947 0.295084 0.344723 0.583893
max b vales: 0.110516 0.111753 0.115322 0.124332
Step 8602
max W vales: 0.759521 0.295101 0.34472 0.5839
max b vales: 0.110521 0.111747 0.115312 0.124365
Step 8603
max W vales: -3.40282e+38 -3.40282e+38 -3.40282e+38 -3.40282e+38
max b vales: -3.40282e+38 -3.40282e+38 -3.40282e+38 -3.40282e+38
由于我的任何值都不是很高,NaN可能发生的唯一方法是由0/0处理得不好,但由于本教程代码不执行任何分割或类似操作,所以除了源自此之外,我没有看到任何其他解释内部TF代码。
我对如何处理这件事毫无头绪。 有什么建议么? 该算法的收敛性很好,它在我的验证集上的准确性稳步攀升,在8600次迭代时达到了92.5%。
事实上,结果是愚蠢的。 我发布这个以防其他人会遇到类似的错误。
cross_entropy = -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(tf.clip_by_value(y_conv,1e-10,1.0)))
解决了我所有的问题。
实际上,剪切不是一个好主意,因为它会阻止梯度在达到阈值时向后传播。 相反,我们可以为softmax输出添加一点常量。
cross_entropy = -tf.reduce_sum(y_*tf.log(y_conv + 1e-10))
如果y_conv
是softmax的结果,比如说y_conv = tf.nn.softmax(x)
,那么更好的解决方案是用log_softmax
替换它:
y = tf.nn.log_softmax(x)
cross_entropy = -tf.reduce_sum(y_*y)
链接地址: http://www.djcxy.com/p/32039.html
上一篇: Tensorflow NaN bug?
下一篇: How to turn NaN from parseInt into 0 for an empty string?