【问题标题】:Tensorflow Shuffling Data Twice During PreprocessingTensorFlow 在预处理期间对数据进行两次混洗
【发布时间】:2021-05-19 11:55:57
【问题描述】:

在 TensorFlow Load Images tutorial 中,作者在使用 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呢?

【问题讨论】:

    标签: tensorflow tensorflow-datasets


    【解决方案1】:

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

    1. 第一个 shuffle 是为了得到一个 shuffle 和一致的 trough epochs train/validation split。
    2. 第二次洗牌是在每个 epoch 洗牌训练数据集。

    说明:

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

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


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

    【讨论】:

    • 感谢您的洞察力。你也知道我的第二个问题吗?
    • 我没有回答这个问题,因为在 stackoverflow 上同时提出多个问题是不好的做法。但答案很简单,shuffle 与tf.data.AUTOTUNE 不兼容。
    猜你喜欢
    • 2021-10-30
    • 2018-07-21
    • 1970-01-01
    • 2017-01-12
    • 2023-03-15
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多