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

TensorFlow's ReluGrad claims input is not finite

我正在试用 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 上工作。知道什么可能导致此问题以及如何解决它吗?

编辑:我将其追溯到这个问题 ,那里的解决方案有效。

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

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

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

I modify the value to 1e-3, the crash occurs significantly earlier. However, changing it to 1e-5 prevents the algorithm from converging

错误是由于 0log(0)

这可以通过以下方式避免:

cross_entropy = -tf.reduce_sum(y*tf.log(yconv+ 1e-9))

由于声誉原因无法发表评论,但 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")

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

一种选择是使用 Muaaz 在此处建议的行或我在 linked 主题中写的行。但最终 TensorFlow 嵌入了这个例程:tf.nn.softmax_cross_entropy_with_logits 并且效率更高,因此应该尽可能优先使用。应该尽可能使用它,而不是我和 Muaaz 之前建议的东西,正如一位评论员在 link.

上所指出的那样