Skip to main content
 首页 » 编程设计

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

2024年11月24日30zfyouxi

我对使用 tf.Dataset 的 batch、repeat 和 shuffle 有疑问。

我不清楚 repeat 和 shuffle 是如何使用的。我知道 .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 个样本,将 1000 个随机放入带有 .shuffle 的缓冲区中,然后批处理说,其中 100 个带有 .batch()。据我了解,下一批将使用其中的 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)。批处理是一个单独的操作。

第三个问题

一般来说,我们根本不打乱测试集——只打乱训练集(无论如何我们都使用整个测试集进行评估,对吧?那为什么要打乱?)。

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

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