TensorFlow的ReluGrad声称输入不是有限的

时间:2015-11-13 18:07:11

标签: gradient-descent tensorflow

我正在尝试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?,解决方案有效。

4 个答案:

答案 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")