我是从读一本书开始学习TensorFlow的,这本书是从对MNIST数字进行分类开始的。
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))
这是执行会话的代码块。我的问题是- for循环迭代步骤次数,而batch是大小为50的最小批量。
难道我们不应该在整个训练集上迭代步骤次数吗?这段代码在一个时期内只训练50个图像。
这里我漏掉了什么?next_batch()方法是如何工作的
发布于 2018-04-16 01:40:45
问题
在一个训练集上应该进行多少次迭代?
回答
答案通常是“需要多少就有多少”。好吧,我承认这在一开始并没有真正的帮助,所以让我们把一些行话去掉。有一个术语Epoch,意思是整个数据的传递。这是最小的IMHO。如果你连整个数据集都不看一遍,那还有什么意义呢?MNIST数据集有大约50,000个训练图像(如果不分割我们的验证,则为60,000个)。因此,为了完成1Epoch,您的tensorflow图必须处理50,000张图像。如果您的批处理大小是50,那么就是1,000批。在上面的代码中,您的批处理大小为50,并且执行了5,000个批处理,实际上,您正在进行相当于5个时期的处理,或者对整个数据集进行5次遍历。
问题
next_batch()方法是如何工作的?
回答
next_batch从训练集中返回指定数量的图像和标签。它会回绕,所以当您在数据集的末尾时,它会从开头开始。它使得获取更多数据变得很容易,而不必自己编写数据的循环、包装和切片。
发布于 2018-04-16 02:03:33
批量大小
Tensorflow正在使用梯度下降:在for
循环的每一步,您都会评估预测和实际数字之间的误差,以找到一个梯度来调整神经网络中的权重。
您确实可以每次检查整个测试集,但您将处理整个测试集,只是为了轻推权重,然后再次进行所有操作,以便再次轻推权重,依此类推。这是可行的,但对于大型数据集来说,速度会很慢。
在另一个极端,您可以只在循环中选择一个示例。这就是所谓的随机梯度下降。因为你在每一步只处理一个例子,所以它非常快,但不能保证收敛,进展将相当“陡峭”。
这里的代码是批量梯度下降,它是这两种方法之间的折中方案。通过每次调整权重时处理50个示例,您可以获得比完全梯度下降更快的训练速度和比随机梯度下降更稳定的训练。
next_batch
next_batch
方法只从测试集中获取下N条记录。默认情况下,就像这里一样,记录是随机排列的。您可以根据需要多次调用它;一旦记录耗尽,它将从另一个随机集重新开始。如果您感兴趣,可以查看代码here。
实验
MNIST数据集中有60,000个训练图像。您可以运行此代码三次,分别将MINIBATCH_SIZE
设置为1、50和60000,以查看它在每种情况下的执行情况。
https://stackoverflow.com/questions/49843243
复制相似问题