我一直在使用tensorflow并且一直遵循此标准MNIST tutorial。
然而,与预期的92%准确度相比,在训练集和测试集上获得的准确度不超过67%。 我熟悉softmax和多项式回归,并且使用scratch python实现以及使用sklearn.linear_model.LogisticRegression已经获得了超过94%的回归率。
我曾尝试使用CIFAR-10数据集进行相同操作,在这种情况下,准确度太低,只有10%左右,等于随机分配类。这让我怀疑我的张量流的安装,但我不确定这一点。
这是my implementation of Tensorflow MNIST tutorial。如果有人可以查看我的实现,我会要求。
答案 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下载当前的工作示例代码,并尝试将其与教程概念相匹配,而不是按字面意思理解。希望他们能够更新它!