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

时间:2017-04-24 04:52:44

标签: python tensorflow scikit-learn mnist

我一直在使用tensorflow并且一直遵循此标准MNIST tutorial

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

我曾尝试使用CIFAR-10数据集进行相同操作,在这种情况下,准确度太低,只有10%左右,等于随机分配类。这让我怀疑我的张量流的安装,但我不确定这一点。

这是my implementation of Tensorflow MNIST tutorial。如果有人可以查看我的实现,我会要求。

3 个答案:

答案 0 :(得分: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})

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

答案 1 :(得分:0)

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

W的初始化可能会导致您的网络除了随机猜测之外什么都不学习。因为grad将为零,而backprop实际上根本不起作用。

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

答案 2 :(得分:0)

不确定这是否仍然与2018年6月相关,但MNIST beginner tutorial不再与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)

这会将您的logits(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下载当前的工作示例代码,并尝试将其与教程概念相匹配,而不是按字面意思理解。希望他们能够更新它!