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