首页 > 解决方案 > TensorFlow 在预处理期间对数据进行两次混洗

问题描述

在 TensorFlow Load Images教程中,作者在使用 tf.data 时似乎对数据进行了两次混洗:

list_ds = tf.data.Dataset.list_files(str(data_dir/'*/*'), shuffle=False)
list_ds = list_ds.shuffle(image_count, reshuffle_each_iteration=False)  # <-- first shuffling

val_size = int(image_count * 0.2)
train_ds = list_ds.skip(val_size)
val_ds = list_ds.take(val_size)
...

def configure_for_performance(ds):
    ds = ds.cache()
    ds = ds.shuffle(buffer_size=1000)  # <-- second shuffling
    ds = ds.batch(batch_size)
    ds = ds.prefetch(buffer_size=AUTOTUNE)
    return ds

train_ds = configure_for_performance(train_ds)
val_ds = configure_for_performance(val_ds)

我的问题是,第二次改组是否有必要或产生我不知道的任何其他优势?此外,为什么将 buffer_size 设置为 1000 而不是在那里也使用 AUTOTUNE?

标签: tensorflowtensorflow-datasets

解决方案


他们出于不同的原因洗牌两次:

  1. 第一次洗牌是为了得到一个洗牌和一致的波谷时期训练/验证分裂。
  2. 第二次洗牌是在每个时期洗牌训练数据集。

说明:

  1. shuffle方法有一个特定的参数reshuffle_each_iteration,默认为True. 这意味着每当数据集用尽时,整个数据集都会重新洗牌。如果在调用 , 后将一个数据集拆分为两个shuffle(以获得随机拆分),则当数据集耗尽时,整个数据集将在拆分前重新洗牌。然后将训练集和验证集混合在一起。因此,要获得随机拆分,但在 epoch 之间保持一致,请使用 shufflereshuffle_each_iteration=False

  2. 然后,对于训练集,最好在每个 epoch 以不同的顺序为模型提供数据,因此调用第二次 shuffle。


对于您的第二个问题,tf.data.AUTOTUNE根本不兼容shuffle.


推荐阅读