Jam*_*mon 5 python tensorflow tensorflow-datasets
我有一个关于使用 tf.Dataset 使用批处理、重复和随机播放的问题。
我不清楚如何使用重复和随机播放。据我所知,.batch将决定许多训练实例将如何进行随机梯度下降,的用途.repeat和.shuffle仍然不清晰。
第一个问题
即使在查看here和here 之后,.repeat也用于在tf.errors.OutOfRangeError抛出a 后重复数据集。因此,在我的代码中,这是否意味着我不再需要实现:
try:
while True:
_ = sess.run(self.optimizer)
except tf.errors.OutOfRangeError:
pass
Run Code Online (Sandbox Code Playgroud)
因为.repeat一旦数据集耗尽会自动重复数据集?什么时候停止?或者它永远不会停止,一旦经过一定数量的批次(例如 1000),您就必须退出 while True 循环?
第二个问题
其次,使用.shuffle对我来说没有意义。是否.shuffle.batch()意味着我有,比方说,10万个样本,把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
Run Code Online (Sandbox Code Playgroud)
和:
test_data = self.test_dataset.shuffle(self.batch_size).batch(self.batch_size)
Run Code Online (Sandbox Code Playgroud)
我有超过 110,000 个训练示例可供我使用,因此 self.batch_size 将设置我想用来测试准确性的样本数量。所以,如果我只想测试整个测试数据集,我不会使用.batch? 但是因为我用 迭代了整个数据集while True,所以没有区别吗?随着使用.shuffle我注意到我的准确度发生了变化,但没有它它们非常相似。这让我觉得.shuffle是随机化批次并且可能会重复使用训练示例?
这是正确的 - 如果您提供数据集,则不再需要捕获OutOfRangeError.
repeat()采用可选参数来表示应重复的次数。这意味着repeat(10)将迭代整个数据集 10 次。如果您选择省略参数,那么它将无限期地重复
Shuffle()(如果使用)应该在之前调用batch()- 我们想要洗牌记录而不是批次。
首先通过按顺序添加记录来填充缓冲区,然后,一旦填满,就会选择并发出随机记录,并从原始源读取一条新记录。
如果你有类似的东西
ds.shuffle(1000).batch(100)
Run Code Online (Sandbox Code Playgroud)
然后为了返回单个批次,最后一步重复 100 次(将缓冲区保持在 1000)。批处理是一个单独的操作。
一般来说,我们根本不会洗牌测试集——只洗牌训练集(无论如何我们都会使用整个测试集进行评估,对吧?那么为什么要洗牌呢?)。
所以,如果我只想测试整个测试数据集,我不会使用
.batch
嗯 - 并非如此(至少并非总是如此)。如果您的整个测试数据集无法装入内存,那么您肯定需要使用批处理(这是常见的情况)。您可能想要测试整个数据集,但要以易于管理的方式运行这些数字!