如何使用TensorFlow对整个数据集进行混洗?

dan*_*che 8 shuffle tensorflow

现在我使用以下功能进行改组

from tensorflow.contrib import data
def input_pipeline(filenames, batch_size):
    # Define a `tf.contrib.data.Dataset` for iterating over one epoch of the data.
    dataset = data.TextLineDataset(filenames)
    dataset = dataset.map(decode_func)
    dataset = dataset.shuffle(buffer_size=10000)  # Equivalent to min_after_dequeue=10000.
    dataset = dataset.batch(batch_size)

    # Return an *initializable* iterator over the dataset, which will allow us to
    # re-initialize it at the beginning of each epoch.
    return dataset.make_initializable_iterator() 
Run Code Online (Sandbox Code Playgroud)

但它只是按数量调整数据,buffer_size它将填写buffer订单.

我的数据非常庞大,我无法设置buffer_size得太大.有没有其他解决方案可以改组整个数据集?

zoh*_*kom 7

目前,数据集 API 不支持对整个数据集进行混洗(超过 10k 个示例)。根据this thread,常见的方法是:

  1. 使用 MapReduce/Spark/Beam 等随机打乱一次整个数据。创建一组大致相同大小的文件(“分片”)的作业。
  2. 在每个时代:

    一种。使用 Dataset.list_files(...).shuffle(num_shards) 随机打乱分片文件名列表。

    湾 使用 dataset.interleave(lambda filename: tf.data.TextLineDataset(filename), cycle_length=N) 将来自 N 个不同分片的记录混合在一起。

    C。使用 dataset.shuffle(B) 对结果数据集进行混洗。设置 B 可能需要一些实验,但您可能希望将其设置为大于单个分片中的记录数的某个值。