我正在尝试TensorFlow而且我遇到了一个奇怪的错误。我编辑了深度MNIST示例以使用另一组图像,并且算法再次很好地收敛,直到迭代8000(当时的准确度为91%),当它崩溃时出现以下错误。
tensorflow.python.framework.errors.InvalidArgumentError: ReluGrad input is not finite
起初我认为可能有些系数达到了浮点数的限制,但是在所有权重和数据上增加了l2正则化。偏见没有解决问题。它总是第一个来自堆栈跟踪的relu应用程序:
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
我现在只在CPU上工作。知道是什么原因造成的,以及如何解决这个问题?
编辑:我追溯到这个问题Tensorflow NaN bug?,解决方案有效。
答案 0 :(得分:9)
错误是由0log(0)
引起的这可以通过以下方式避免:
cross_entropy = -tf.reduce_sum(y*tf.log(yconv+ 1e-9))
答案 1 :(得分:3)
由于我在这个问题上有另一个主题[Tensorflow NaN bug?],我没有更新这个问题,但是解决方案已经存在了一段时间,并且此后已经被海报所回应。问题确实是0 * log(0)导致NaN。
一种选择是使用Muaaz在此建议的行或我在链接主题中写的那行。但最终TensorFlow嵌入了这个例程tf.nn.softmax_cross_entropy_with_logits
,这样更有效,因此应尽可能优先考虑。这应该在可能的情况下使用,而不是像我和Muaaz先前所建议的那样,正如评论员在上述链接中指出的那样。
答案 2 :(得分:1)
我之前遇到过此错误:input is not finite
(不是tf.nn.relu
)。在我的例子中,问题是我的张量变量中的元素达到了非常大的数字(这标志着它们是无限的,因此消息input is not finite
)。
我建议在每第n次迭代时向tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
添加一堆调试输出,以跟踪它到达无限远的时间。
这与您的评论一致:
我将值修改为1e-3,崩溃发生得更早。 但是,将其更改为1e-5会阻止算法收敛
答案 3 :(得分:1)
由于声誉无法评论,但Muaaz有答案。可以通过训练具有0错误的系统来复制错误 - 导致log(0)。他的解决方案可以防止这种情或者抓住错误继续前进。
...your other code...
try :
for i in range(10000):
train_accuracy = accuracy.eval(feed_dict={
x:batch_xs, y_: batch_ys, keep_prob: 1.0})
except : print("training interupted. Hopefully deliberately")