繁体   English   中英

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

[英]Tensorflow dataset questions about .shuffle, .batch and .repeat

我有一个关于使用 tf.Dataset 使用批处理、重复和随机播放的问题。

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

第一个问题

即使在此处此处查看之后,一旦tf.errors.OutOfRangeError被抛出, .repeat用于重复数据集。 因此,在我的代码中,这是否意味着我不再需要实现:

try:
    while True:
        _ = sess.run(self.optimizer)

except tf.errors.OutOfRangeError:
        pass

因为.repeat会在数据集耗尽后自动重复数据集? 什么时候停止? 或者它永远不会停止,一旦经过一定数量的批次(例如 1000),您就必须退出 while True 循环?

第二个问题

其次,使用.shuffle对我来说毫无意义。 .shuffle.batch()是否意味着我有 100,000 个样本,将 1000 个随机放入.shuffle的缓冲区中,然后用.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)

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

第三个问题

通常我们根本不打乱测试集 - 只打乱训练集(无论如何,我们使用整个测试集进行评估,对吧?那么为什么要打乱呢?)。

所以,如果我只想测试整个测试数据集,我不会使用.batch

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM