[英]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.