6

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

4

4 回答 4

10

Error is due to 0log(0)

This can be avoided by:

cross_entropy = -tf.reduce_sum(y*tf.log(yconv+ 1e-9))
于 2015-12-18T18:44:54.047 回答
3

因为我有关于这个问题的另一个话题 [ Tensorflow NaN 错误?] 我没有更新这个,但解决方案已经存在了一段时间,并且已经被这里的海报所呼应。问题确实是 0*log(0) 导致 NaN。

一种选择是使用 Muaaz 在此处建议的行或我在链接主题中所写的行。但最终TensorFlow嵌入了这个例程:tf.nn.softmax_cross_entropy_with_logits这更有效,因此应该尽可能首选。正如上述链接上的评论员所指出的那样,应该尽可能使用它,而不是我和 Muaaz 之前建议的东西。

于 2016-01-18T15:31:32.280 回答
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")
于 2016-01-16T16:48:19.807 回答
1

我遇到过这个错误:input is not finite较早(不是tf.nn.relu)。在我的情况下,问题是我的张量变量中的元素达到了非常大的数字(这将它们标记为无限,因此标记为 message input is not finite)。

我建议在每次第 n 次迭代时添加一堆调试输出,tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)以跟踪它何时达到无穷大。

这看起来与您的评论一致:

我将值修改为 1e-3,崩溃发生得更早。但是,将其更改为 1e-5 会阻止算法收敛

于 2015-11-13T21:46:13.850 回答