如何使用TensorFlow洗牌整个数据集?

如何使用TensorFlow洗牌整个数据集?,tensorflow,shuffle,Tensorflow,Shuffle,现在我使用下面的函数进行洗牌 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(d

现在我使用下面的函数进行洗牌

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() 
但它只会以
buffer\u size
的数量洗牌数据,并按顺序填充
buffer


我的数据量很大,我不能将
缓冲区大小设置得太大。是否有其他解决方案可以洗牌整个数据集?

目前,Dataset API不支持洗牌整个数据集(超过10k个示例)。根据thread的说法,常用的方法是:

  • 使用 MapReduce/Spark/Beam等创建一组大小大致相同的 文件(“碎片”)
  • 在每个时代:

    a。使用Dataset.list_files(…).shuffle(num_shard)随机洗牌碎片文件名列表

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

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


  • 也许在代码的未来部分,您将转换为
    张量
    ?如果答案是肯定的,您可以使用
    tf.random\u shuffle
    。转移到
    Tensor
    的部分只是
    batch\u部分
    ,而不是所有数据…在数据队列之前创建一个带有shuffle的文件名队列,如“tf.train.string\u input\u producer”,可以解决您的问题吗?Thks,但这会导致其他问题,看到了吗?你介意在训练模型之前将洗牌作为一个预处理步骤吗?如果没有,请查看
    shuf
    unix命令。