我正在使用TFrecords和keras拟合神经网络模型。我有一个相对较大的数据集,它是非常异构的。在模型的训练过程中,我已经使用了shuffle my dataset,如文档示例:https://keras.io/examples/keras_recipes/tfrecord/ (但无法将其全部混洗,因为它会占用太多内存),我还将我的数据集分成多个小碎片,每个碎片大小相等。
然而,我有理由认为这种“近似”的混洗是不够的,我还认为馈送已经混洗的数据将提高训练速度。
所以现在我的问题是:在我将我的数据集分成Tfrecords分片后,是否有可能高效地编写随机获取2个分片的代码,加载它们,对它们进行混洗,然后重写2个分片(现在在两个分片之间进行混洗)。因此我可以重复这个过程很多次,这将导致正确的混洗TFrecords文件。
更准确地说,我使用两个分片: shard1.tfrec和shard2.tfrec,将它们加载到一个tf.data.dataset中,对其进行混洗,然后再次输出两个大小相等的分片。
发布于 2020-12-08 23:33:24
这可能不能直接回答您的问题,但我想解决这一点:
无法混洗所有内容,因为它会占用太多内存
混洗调用中的数字2048是缓冲器大小,即,保存在存储器缓冲器中的将从其中随机选择元素的元素的数量。您可以大幅减少这个数字,以获得更好的内存效率。
def get_dataset(filenames, labeled=True):
dataset = load_dataset(filenames, labeled=labeled)
dataset = dataset.shuffle(32)
dataset = dataset.prefetch(buffer_size=AUTOTUNE)
dataset = dataset.batch(BATCH_SIZE)
return dataset然而,这不是完全随机的。甚至比具有2048的缓冲区大小更小。参见tf.data.Dataset.shuffle。
随机地打乱这个数据集的元素。此数据集使用buffer_size元素填充缓冲区,然后从该缓冲区中随机采样元素,并用新元素替换选定的元素。对于完美的混洗,需要大于或等于数据集的完整大小的缓冲区大小。例如,如果数据集包含10,000个元素,但buffer_size设置为1,000,则shuffle最初将仅从缓冲区中的前1,000个元素中选择一个随机元素。一旦选择了一个元素,它在缓冲区中的空间就会被下一个(即1,001-st)元素所取代,从而保持1000个元素的缓冲区。reshuffle_each_iteration控制每个时期的混洗顺序是否应该不同。
https://stackoverflow.com/questions/65201252
复制相似问题