关于 .shuffle、.batch 和 .repeat 的 Tensorflow 数据集问题

Tensorflow dataset questions about .shuffle, .batch and .repeat

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

我不清楚 repeat 和 shuffle 是如何使用的。我知道 .batch 将决定有多少训练样本将进行随机梯度下降,.repeat.shuffle 的用途对我来说仍然不清楚。

第一个问题

即使在查看 and 之后,.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 正在随机化批处理并且可能正在重用训练示例?

第一个问题:

没错 - 如果您提供数据集,您就不再需要捕获 OutOfRangeError

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

第二个问题

Shuffle()(如果使用)应该在 batch() 之前调用 - 我们想要随机播放记录而不是批次。

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

如果你有类似的东西

ds.shuffle(1000).batch(100)

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

第三题

通常我们根本不打乱 test 集 - 只有训练集(我们使用整个测试集进行评估,对吗?那为什么要打乱?)。

So, if I wanted to just test on the whole test dataset I wouldn't use .batch

嗯 - 并非如此(至少并非总是如此)。如果您的整个测试数据集不适合内存,您肯定需要使用批处理——这很常见。您可能想要测试整个数据集,但要 运行 可管理的数字!