Python TensorFlow MNIST数据集

Python TensorFlow MNIST数据集,python,tensorflow,Python,Tensorflow,我通过阅读一本书开始学习TensorFlow,这本书是从对数字进行分类开始的 这是执行会话的代码块。我的问题是-for循环迭代步骤次,批处理是大小为50的小批处理 我们不应该在整个训练集中重复几步吗?此代码在一个历元中只训练50个图像 我错过了什么?下一个批处理()方法如何工作 在一个训练集上应该进行多少次迭代 答复 答案通常是“尽可能多”。好吧,我承认一开始这并没有什么帮助,所以让我们把一些行话放一边。有一个术语Epoch,表示对数据进行一次完整的传递。这有点像最低限度的IMHO。如果你不检

我通过阅读一本书开始学习TensorFlow,这本书是从对数字进行分类开始的

这是执行会话的代码块。我的问题是-for循环迭代步骤次,批处理是大小为50的小批处理

我们不应该在整个训练集中重复几步吗?此代码在一个历元中只训练50个图像

我错过了什么?下一个批处理()方法如何工作 在一个训练集上应该进行多少次迭代

答复 答案通常是“尽可能多”。好吧,我承认一开始这并没有什么帮助,所以让我们把一些行话放一边。有一个术语Epoch,表示对数据进行一次完整的传递。这有点像最低限度的IMHO。如果你不检查整个数据集至少一次,那有什么意义呢?MNIST数据集有大约50000个训练图像(如果不分割我们的验证,则为60000个)。因此,为了完成1个历元,您的tensorflow图必须处理50000张图像。如果批量大小为50,则为1000批。在上面的代码中,批大小为50,处理了5000批,实际上,处理了5个时期,或者在整个数据集上进行了5次传递

问题: 下一个_batch()方法是如何工作的

答复 下一批从训练集中返回指定数量的图像和标签。它会环绕,这样当您在数据集的末尾时,它会从头开始。它可以轻松获取更多数据,而不必自己编写数据的循环、包装和切片代码。

批量大小 Tensorflow使用的是梯度下降法:在
for
循环中的每一步,您都会评估预测和实际数字之间的误差,以找到一个梯度来调整神经网络中的权重

您确实可以每次检查整个测试集,但您需要处理整个测试集以轻推权重,然后再次检查所有测试集以再次轻推权重,依此类推。这会起作用,但对于大型数据集来说速度较慢

在另一个极端,您可以在循环中选择一个示例。这称为随机梯度下降。因为每一步只处理一个示例,所以速度非常快,但不能保证收敛,而且进度会相当“急促”

这里的代码正在执行批处理梯度下降
,这是这两种方法之间的中间环节。通过每次调整权重时处理50个示例,您可以获得比完全梯度下降更快的训练速度和比随机梯度下降更高的稳定性

下一批
next\u batch
方法仅从测试集中获取下一个N条记录。默认情况下,与这里一样,记录被洗牌。你想叫多少次就叫多少次;一旦记录耗尽,它将从另一个洗牌集重新开始。如果您感兴趣,可以查看代码

实验 MNIST数据集中有60000个训练图像。您可以运行此代码三次,将
MINIBATCH\u SIZE
分别设置为1、50和60000,以查看它在每种情况下的性能

MINIBATCH_SIZE = 50
STEPS = 5000

with tf.Session() as sess:
sess.run(tf.global_variables_initializer())

for i in range(STEPS):
    batch = mnist.train.next_batch(MINIBATCH_SIZE)

    if i % 100 == 0:
        train_accuracy = sess.run(accuracy, feed_dict={x: batch[0], y_: batch[1],
                                                       keep_prob: 1.0})
        print("step {}, training accuracy {}".format(i, train_accuracy))

    sess.run(train_step, feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})

X = mnist.test.images.reshape(10, 1000, 784)
Y = mnist.test.labels.reshape(10, 1000, 10)
test_accuracy = np.mean(
    [sess.run(accuracy, feed_dict={x: X[i], y_: Y[i], keep_prob: 1.0}) for i in range(10)])

print("test accuracy: {}".format(test_accuracy))