关于 .shuffle、.batch 和 .repeat 的 Tensorflow 数据集问题
Tensorflow dataset questions about .shuffle, .batch and .repeat
我对使用 tf.Dataset 进行批处理、重复和随机播放有疑问。
我不清楚 repeat 和 shuffle 是如何使用的。我知道 .batch
将决定有多少训练样本将进行随机梯度下降,.repeat
和 .shuffle
的用途对我来说仍然不清楚。
第一个问题
即使在查看 and 之后,.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 个样本,用 .shuffle
随机将 1000 个放在缓冲区中,然后用 .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)
然后为了 return 单个批次,将最后一步重复 100 次(将缓冲区保持在 1000)。批处理是一个单独的操作。
第三题
通常我们根本不打乱 test 集 - 只有训练集(我们使用整个测试集进行评估,对吗?那为什么要打乱?)。
So, if I wanted to just test on the whole test dataset I wouldn't use
.batch
嗯 - 并非如此(至少并非总是如此)。如果您的整个测试数据集不适合内存,您肯定需要使用批处理——这很常见。您可能想要测试整个数据集,但要 运行 可管理的数字!
我对使用 tf.Dataset 进行批处理、重复和随机播放有疑问。
我不清楚 repeat 和 shuffle 是如何使用的。我知道 .batch
将决定有多少训练样本将进行随机梯度下降,.repeat
和 .shuffle
的用途对我来说仍然不清楚。
第一个问题
即使在查看 .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 个样本,用 .shuffle
随机将 1000 个放在缓冲区中,然后用 .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)
然后为了 return 单个批次,将最后一步重复 100 次(将缓冲区保持在 1000)。批处理是一个单独的操作。
第三题
通常我们根本不打乱 test 集 - 只有训练集(我们使用整个测试集进行评估,对吗?那为什么要打乱?)。
So, if I wanted to just test on the whole test dataset I wouldn't use
.batch
嗯 - 并非如此(至少并非总是如此)。如果您的整个测试数据集不适合内存,您肯定需要使用批处理——这很常见。您可能想要测试整个数据集,但要 运行 可管理的数字!