繁体   English   中英

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

[英]Tensorflow MNIST tutorial - Test Accuracy very low

我一直在使用tensorflow并且一直遵循这个标准的MNIST教程

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

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

这是我对Tensorflow MNIST教程的实现 如果有人可以查看我的实现,我会要求。

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

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将为零,而backprop实际上根本不起作用。

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

不确定这是否仍然在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)

这会将你的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页面表明该函数已被弃用。

在Github上的示例代码中,他们用tf.losses.sparse_softmax_cross_entropy(labels=y_, logits=y)替换它。

但是,您不能只是将函数交换掉 - 示例代码也会更改许多其他行的维度。

我对第一次这样做的人的建议是从Github下载当前的工作示例代码,并尝试将其与教程概念相匹配,而不是按字面意思理解。 希望他们能够更新它!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM