python - 关于 .shuffle、.batch 和 .repeat 的 TensorFlow 数据集问题
问题描述
我有一个关于使用 tf.Dataset 使用批处理、重复和随机播放的问题。
我不清楚如何使用重复和随机播放。我知道这.batch
将决定有多少训练示例将经历随机梯度下降,我仍然不清楚它的用途.repeat
和用途。.shuffle
第一个问题
即使在查看here和here之后,.repeat
也用于在tf.errors.OutOfRangeError
抛出 a 后重复数据集。因此,在我的代码中,这是否意味着我不再需要实现:
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)。批处理是一个单独的操作。
第三个问题
一般来说,我们根本不打乱测试集——只打乱训练集(无论如何我们都使用整个测试集进行评估,对吧?那为什么打乱呢?)。
所以,如果我只想测试整个测试数据集,我不会使用
.batch
嗯-并非如此(至少并非总是如此)。如果您的整个测试数据集不适合内存,您肯定需要使用批处理 - 这是常见的情况。您可能想测试整个数据集,但要以可管理的方式运行数字!
推荐阅读
- android - Opencsv 中的 java.io.FileNotFoundException
- r - 如何计算具有两个向量(开始日期和结束日期)的数据框和日期向量之间匹配的天数?
- python - 在 random.choice 期间丢弃列表中的一些字典项
- javascript - 如何添加一个保持激活状态的活动类
- java - 无法将 Java 应用程序部署到 App Engine/Heroku
- flask - 如何返回 Flask-SqlAlchemy 错误详细信息
- python - MacOs 上的 pygame 不会显示任何表面
- c++ - 如何使用 FILE* 清除文件
- python - Selenium 等待用户点击 python 中的警告对话框
- oracle - 使用 noappend 模式不记录