我尝试使用CIFAR-10数据集进行相同的操作,但准确率太低,只有约10%,与随机分配类别相等。这使我怀疑我的TensorFlow安装是否正确,但我不确定。
这是我对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})
如果您无法弄清如何修改我的伪代码,请参考教程,因为根据我的记忆,它们很好地涵盖了这个问题。
不确定这个在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下载当前工作的示例代码,并尝试将其与教程概念匹配,而不是字面上按照说明操作。希望他们能更新它!
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了解更多信息。