假设我有一个TensorFlow数据集,定义如下:
dataset = tf.data.Dataset.from_tensor_slices((inputs, labels))
dataset = dataset.shuffle(1000)
dataset = dataset.repeat()
dataset = dataset.batch(50)
每次从数据集中抽取50个新批次时,都会从接下来的1000个示例中随机抽取50个示例。但是除此之外,我想做的是在每个纪元开始时完全改组我的整个数据集。
一种方法是将shuffle_buffer
的大小设置为等于整个数据集的大小。但是,这将导致每次绘制批处理时整个数据集都被完全混洗,这将非常慢。取而代之的是,我只希望整个数据集在每个纪元开始时都被完全改组一次。
我该怎么做?
答案 0 :(得分:2)
但是,这将导致每次绘制批处理时整个数据集都被完全混洗,这会非常慢。
不太正确。不需要每次处理新样本时都需要重新整理整个缓冲区,而每次输入新样本时都只需要一个排列即可。
我做了一个小实验,确实没有发现改组缓冲区的大小对计算时间有任何显着影响。
您需要为具有较大的混洗缓冲区而付出的代价实际上是内存方面的:具有数据集大小的混洗缓冲区意味着将整个数据集都存储在内存中,这并不总是可能的。
答案 1 :(得分:1)
TF数据集的操作不是全部可交换的,但是如果在应用shuffle
和repeat
之前先应用batch
,则TF应该仅在每个时期对数据集进行一次随机播放}}等于您的数据集大小。您还必须正确使用迭代器,以确保不会在循环中实例化它。