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.
上所指出的那样
我正在试用 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")
因为我有关于这个问题的另一个话题 [
一种选择是使用 Muaaz 在此处建议的行或我在 linked 主题中写的行。但最终 TensorFlow 嵌入了这个例程:tf.nn.softmax_cross_entropy_with_logits
并且效率更高,因此应该尽可能优先使用。应该尽可能使用它,而不是我和 Muaaz 之前建议的东西,正如一位评论员在 link.