Tensorflow MNIST 教程 - 测试精度非常低

Tensorflow MNIST tutorial - Test Accuracy very low

我从tensorflow入手,一直遵循这个标准MNIST tutorial

然而,与预期的 92% 准确率相比,在训练集和测试集上获得的准确率不会超过 67%。 我熟悉 softmax 和多项式回归,并且使用 scratch python 实现以及使用 sklearn.linear_model.LogisticRegression 获得了超过 94%。

我曾使用 CIFAR-10 数据集尝试过相同的方法,但在那种情况下,准确率太低,只有 10% 左右,相当于随机分配 类。这让我怀疑我是否安装了 tensorflow,但我对此不确定。

这里是my implementation of Tensorflow MNIST tutorial。我会请求是否有人可以看看我的实现。

您构建了图表,指定了损失函数,并创建了优化器(这是正确的)。问题是您只使用了一次优化器:

sess_tf.run(train_step, feed_dict={x: train_images_reshaped[0:1000], y_: train_labels[0:1000]})

所以基本上你 运行 你的梯度下降只有一次。显然,在正确的方向上只迈出一小步之后,您无法快速收敛。你需要做一些事情:

for _ in xrange(many_steps):
  X, Y = get_a_new_batch_from(mnist_data)
  sess_tf.run(train_step, feed_dict={x: X, y_: Y})

如果您无法弄清楚如何修改我的伪代码,请参阅教程,因为根据我的记忆,他们很好地涵盖了这一点。

W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))

W 的初始化可能会导致您的网络只学习随机猜测。因为 grad 将为零并且反向传播实际上根本不起作用。

您最好使用 tf.Variable(tf.truncated_normal([784, 10], mean=0.0, stddev=0.01)) 初始化 W 更多信息,请参阅 https://www.tensorflow.org/api_docs/python/tf/truncated_normal

不确定这在 2018 年 6 月是否仍然相关,但 MNIST beginner tutorial no longer matches the example code on Github。如果您下载并 运行 示例代码,它确实会为您提供建议的 92% 准确率。

我注意到在学习教程时出现了两处错误:

1) 不小心调用了两次softmax

教程首先告诉你定义y如下:

y = tf.nn.softmax(tf.matmul(x, W) + b)

但稍后建议您使用 tf.nn.softmax_cross_entropy_with_logits 定义交叉熵,这样很容易不小心执行以下操作:

cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)

这会通过 softmax 发送你的 logits (tf.matmul(x, W) + b) 两次,这导致我卡在了 67% 的准确率。

但是我注意到,即使解决这个问题仍然只能使我达到非常不稳定的 80-90% 准确率,这导致我进入下一个问题:

2) tf.nn.softmax_cross_entropy_with_logits() 已弃用

他们还没有更新教程,但 tf.nn.softmax_cross_entropy_with_logits page 表示此功能已被弃用。

在 Github 的示例代码中,他们将其替换为 tf.losses.sparse_softmax_cross_entropy(labels=y_, logits=y)

但是您不能只是将函数换出 - 示例代码还会更改许多其他行的维数。

我对第一次这样做的人的建议是从 Github 下载当前可用的示例代码,并尝试将其与教程概念相匹配,而不是从字面上理解说明。希望他们能抽出时间更新它!