Tensorflow MNIST教程 - 测试准确率非常低

3
我一直在学习TensorFlow,并遵循这个标准MNIST教程。然而,与预期的92%准确率相比,训练集和测试集的准确率都没有超过67%。 我熟悉softmax和多项式回归,并且使用从头开始编写的Python实现以及sklearn.linear_model.LogisticRegression获得了超过94%的准确率。
我尝试使用CIFAR-10数据集进行相同的操作,但准确率太低,只有约10%,与随机分配类别相等。这使我怀疑我的TensorFlow安装是否正确,但我不确定。
这是我对Tensorflow MNIST教程的实现。我希望有人能看看我的实现。
3个回答

4
你已经构建了你的图表,指定了损失函数,并创建了优化器(这是正确的)。问题在于你只使用了你的优化器一次:
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})

如果您无法弄清如何修改我的伪代码,请参考教程,因为根据我的记忆,它们很好地涵盖了这个问题。


谢谢指出。在教程中使用批量梯度下降时,不知怎么地,我认为不需要迭代,完全跳过了收敛概念。已经进行了更改,结果如预期。 - codeahead

0

不确定这个在2018年6月是否仍然相关,但MNIST 初学者教程不再与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)

这将使您的逻辑 (tf.matmul(x, W) + b) 通过softmax两次,导致我卡在了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下载当前工作的示例代码,并尝试将其与教程概念匹配,而不是字面上按照说明操作。希望他们能更新它!


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

W的初始化可能会导致您的网络仅进行随机猜测而无法学习。因为梯度将为零,反向传播实际上根本不起作用。

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


我曾尝试过这种方法,但效果不佳,原因已被@Salvador Dali识别出来。 - codeahead

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接