Tensorflow MNIST 教程 - 测试精度非常低
Tensorflow MNIST tutorial - Test Accuracy very low
我从tensorflow入手,一直遵循这个标准MNIST tutorial。
然而,与预期的 92% 准确率相比,在训练集和测试集上获得的准确率不会超过 67%。
我熟悉 softmax 和多项式回归,并且使用 scratch python 实现以及使用 sklearn.linear_model.LogisticRegression 获得了超过 94%。
我曾使用 CIFAR-10 数据集尝试过相同的方法,但在那种情况下,准确率太低,只有 10% 左右,相当于随机分配 类。这让我怀疑我是否安装了 tensorflow,但我对此不确定。
这里是my implementation of Tensorflow MNIST tutorial。我会请求是否有人可以看看我的实现。
您构建了图表,指定了损失函数,并创建了优化器(这是正确的)。问题是您只使用了一次优化器:
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 将为零并且反向传播实际上根本不起作用。
您最好使用 tf.Variable(tf.truncated_normal([784, 10], mean=0.0, stddev=0.01))
初始化 W
更多信息,请参阅 https://www.tensorflow.org/api_docs/python/tf/truncated_normal。
不确定这在 2018 年 6 月是否仍然相关,但 MNIST beginner tutorial no longer matches the 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)
这会通过 softmax 发送你的 logits (tf.matmul(x, W) + b
) 两次,这导致我卡在了 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 下载当前可用的示例代码,并尝试将其与教程概念相匹配,而不是从字面上理解说明。希望他们能抽出时间更新它!
我从tensorflow入手,一直遵循这个标准MNIST tutorial。
然而,与预期的 92% 准确率相比,在训练集和测试集上获得的准确率不会超过 67%。 我熟悉 softmax 和多项式回归,并且使用 scratch python 实现以及使用 sklearn.linear_model.LogisticRegression 获得了超过 94%。
我曾使用 CIFAR-10 数据集尝试过相同的方法,但在那种情况下,准确率太低,只有 10% 左右,相当于随机分配 类。这让我怀疑我是否安装了 tensorflow,但我对此不确定。
这里是my implementation of Tensorflow MNIST tutorial。我会请求是否有人可以看看我的实现。
您构建了图表,指定了损失函数,并创建了优化器(这是正确的)。问题是您只使用了一次优化器:
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 将为零并且反向传播实际上根本不起作用。
您最好使用 tf.Variable(tf.truncated_normal([784, 10], mean=0.0, stddev=0.01))
初始化 W
更多信息,请参阅 https://www.tensorflow.org/api_docs/python/tf/truncated_normal。
不确定这在 2018 年 6 月是否仍然相关,但 MNIST beginner tutorial no longer matches the 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)
这会通过 softmax 发送你的 logits (tf.matmul(x, W) + b
) 两次,这导致我卡在了 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 下载当前可用的示例代码,并尝试将其与教程概念相匹配,而不是从字面上理解说明。希望他们能抽出时间更新它!