我对使用tf.Dataset进行批处理,重复和随机播放有疑问。
我不清楚究竟如何使用重复和随机播放。我知道.batch
会决定有多少训练示例将经历随机梯度下降,我仍然不清楚.repeat
和.shuffle
的用法。
第一个问题
即使在查看了here和here之后,一旦抛出.repeat
时,tf.errors.OutOfRangeError
仍会在数据集上重复。因此,在我的代码中确实意味着我不再需要实现:
try:
while True:
_ = sess.run(self.optimizer)
except tf.errors.OutOfRangeError:
pass
因为.repeat
一旦耗尽数据集就会自动重复?什么时候停止?还是它永远不会停止,只要经过一定数量的批次(例如1000),您就必须退出while True循环?
第二个问题
第二,使用.shuffle
对我来说毫无意义。 .shuffle.batch()
是否表示我有100,000个样本,是否将.shuffle
随机放入1000个样本中,然后用.batch()
批量处理了其中100个样本。据我了解,下一批将使用其中的999个样本,并将1个新样本放入缓冲区。因此,如果我的样品没有顺序,那么应该.shuffle
一起避免使用吗?而且,如果使用.batch
,它是否仍会从缓冲区中的999 + 1批处理100个?
第三个问题
最后,如果我使用单独的td.dataset
对象进行测试,我应该考虑.shuffle.batch()
的哪个顺序?现在我用:
sess.run(self.test_init)
try:
while True:
accuracy_batch = sess.run(self.accuracy)
except tf.errors.OutOfRangeError:
pass
使用:
test_data = self.test_dataset.shuffle(self.batch_size).batch(self.batch_size)
我有超过110,000个训练示例可供使用,因此self.batch_size将设置我想用来测试我的准确性的样本数量。因此,如果我只想对整个测试数据集进行测试,就不会使用.batch
吗?但是由于我使用while True
遍历整个数据集,所以没有区别吗?使用.shuffle
时,我注意到我的准确度发生了变化,但是没有它,它们的准确性就非常相似。这使我认为.shuffle
正在将批次随机化,并且可能正在重用训练示例?
答案 0 :(得分:0)
是正确的-如果您提供数据集,则不再需要捕获OutOfRangeError
。
repeat()
带有一个可选参数,表示应重复的次数。这意味着repeat(10)
将遍历整个数据集10次。如果您选择省略该参数,那么它将无限期重复
Shuffle()
(如果使用的话)应该在batch()
之前调用-我们要改组记录而不是批量记录。
首先通过按顺序添加记录来填充缓冲区,然后将其填满,然后选择并发出一个随机记录,并从原始源中读取一条新记录。
如果您有类似的东西
ds.shuffle(1000).batch(100)
然后,为了返回单个批次,此最后一步重复100次(将缓冲区保持在1000)。批处理是一项单独的操作。
通常,我们根本不会对测试集进行混洗,而只是对训练集进行混洗(反正我们会使用整个测试集进行评估,对吗?为什么要混洗?)。
因此,如果我只想对整个测试数据集进行测试,则不会使用
.batch
嗯-并非如此(至少并非总是如此)。如果您的整个测试数据集都不适合内存,那么您肯定需要使用批处理-一种常见的情况。您可能想测试整个数据集,但要以可管理的方式运行数字!