nan - tensorflow NaN 错误?

标签 nan tensorflow

我正在使用 TensorFlow,并且修改了 tutorial拍摄 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)))

解决了我所有的问题。

关于nan - tensorflow NaN 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33712178/

相关文章:

floating-point - 对于IEEE754 NaN值,所有比较返回false的理由是什么?

c++ - 为什么 (0+0i)^{0} == (nan, nan) 在 C++ 中

python - 从 Keras 中的输出层创建一个 "unpooling"掩码

python - Keras,级联多个 RNN 模型用于 N 维输出

Python Pandas Dataframe 填充 NaN 值

string - Pandas .min() skipna 选项不适用于混合字符串和 NaN 系列

javascript - getElementById 返回 NaN

tensorflow - CNN 模型在添加一个/两个以上卷积层时不会学习

python - Tensorflow 不使用 GPU

python - 如何从数据帧在 keras flow 中提供一个热编码矢量数据帧