【问题标题】:How to fully shuffle TensorFlow Dataset on each epoch如何在每个时期完全洗牌 TensorFlow 数据集
【发布时间】:2018-08-14 22:32:42
【问题描述】:

假设我有一个定义如下的 TensorFlow 数据集:

dataset = tf.data.Dataset.from_tensor_slices((inputs, labels))
dataset = dataset.shuffle(1000)
dataset = dataset.repeat()
dataset = dataset.batch(50)

每次从数据集中抽取 50 个新批次时,它会从接下来的 1000 个示例中随机抽取 50 个示例。但除此之外,我还想做的是在每个 epoch 开始时完全打乱我的整个数据集。

一种方法是将shuffle_buffer 的大小设置为等于整个数据集的大小。但是,这会导致每次绘制批次时整个数据集都被完全打乱,这会非常慢。相反,我只希望整个数据集在每个 epoch 开始时完全洗牌一次。

我该怎么做?

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    但是,这会导致我每次绘制批次时整个数据集都被完全打乱,这会非常慢。

    不完全正确。每次处理新样本时,不需要对整个缓冲区进行洗牌,每次进入新样本时只需进行一次排列即可。

    我做了一个小实验,确实没有发现 shuffle 缓冲区的大小对计算时间有任何显着影响。

    你为拥有一个大的随机缓冲区付出的代价实际上是内存方面的:拥有一个与数据集大小相同的随机缓冲区意味着你的整个数据集都在内存中,这并不总是可能的。

    【讨论】:

      【解决方案2】:

      TF 数据集操作并非都是可交换的,但如果您在应用 repeatbatch 之前应用 shuffle,那么如果您的 buffer_size 等于您的数据集大小,TF 应该只在每个 epoch 对数据集进行一次洗牌.您还必须正确使用迭代器,以确保不会在循环中重新实例化它。

      【讨论】:

        猜你喜欢
        • 2019-01-25
        • 2018-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-23
        • 2019-11-24
        • 2017-11-14
        • 1970-01-01
        相关资源
        最近更新 更多