有关.shuffle,.batch和.repeat

时间:2019-07-09 03:18:35

标签: python tensorflow tensorflow-datasets

我对使用tf.Dataset进行批处理,重复和随机播放有疑问。

我不清楚究竟如何使用重复和随机播放。我知道.batch会决定有多少训练示例将经历随机梯度下降,我仍然不清楚.repeat.shuffle的用法。

第一个问题

即使在查看了herehere之后,一旦抛出.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正在将批次随机化,并且可能正在重用训练示例?

1 个答案:

答案 0 :(得分:0)

第一个问题:

是正确的-如果您提供数据集,则不再需要捕获OutOfRangeError

repeat()带有一个可选参数,表示应重复的次数。这意味着repeat(10)将遍历整个数据集10次。如果您选择省略该参数,那么它将无限期重复

第二个问题

Shuffle()(如果使用的话)应该在batch()之前调用-我们要改组记录而不是批量记录。

首先通过按顺序添加记录来填充缓冲区,然后将其填满,然后选择并发出一个随机记录,并从原始源中读取一条新记录。

如果您有类似的东西

ds.shuffle(1000).batch(100)

然后,为了返回单个批次,此最后一步重复100次(将缓冲区保持在1000)。批处理是一项单独的操作。

第三个问题

通常,我们根本不会对测试集进行混洗,而只是对训练集进行混洗(反正我们会使用整个测试集进行评估,对吗?为什么要混洗?)。

  

因此,如果我只想对整个测试数据集进行测试,则不会使用   .batch

嗯-并非如此(至少并非总是如此)。如果您的整个测试数据集都不适合内存,那么您肯定需要使用批处理-一种常见的情况。您可能想测试整个数据集,但要以可管理的方式运行数字!