如何使用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命令。