繁体   English   中英

使用张量流数据集改组输入文件

[英]Shuffling input files with tensorflow Datasets

使用旧的输入管道API,我可以执行以下操作:

filename_queue = tf.train.string_input_producer(filenames, shuffle=True)

然后将文件名传递到其他队列,例如:

reader = tf.TFRecordReader()
_, serialized_example = reader.read_up_to(filename_queue, n)

如何使用Dataset -API实现类似的行为?

tf.data.TFRecordDataset()期望文件名的张量以固定顺序排列。

开始按顺序阅读它们,然后立即洗牌

BUFFER_SIZE = 1000 # arbitrary number
# define filenames somewhere, e.g. via glob
dataset = tf.data.TFRecordDataset(filenames).shuffle(BUFFER_SIZE)

编辑:

这个问题的输入管道为我提供了有关如何使用Dataset API改组文件名的想法:

dataset = tf.data.Dataset.from_tensor_slices(filenames)
dataset = dataset.shuffle(BUFFER_SIZE) # doesn't need to be big
dataset = dataset.flat_map(tf.data.TFRecordDataset)
dataset = dataset.map(decode_example, num_parallel_calls=5) # add your decoding logic here
# further processing of the dataset

这会将一个文件的所有数据放在下一个文件的前面,依此类推。 文件经过重新排序,但其中的数据将以相同顺序生成。 您也可以用interleave替换dataset.flat_map来同时处理多个文件并从每个文件返回样本:

dataset = dataset.interleave(tf.data.TFRecordDataset, cycle_length=4)

注意: interleave实际上并不会在多个线程中运行,而是循环操作。 有关真正的并行处理,请参见parallel_interleave

当前的Tensorflow版本(02/2018中的v1.5)似乎不支持在Dataset API中本地支持文件名混排。 这是使用numpy的简单方法:

import numpy as np
import tensorflow as tf

myShuffledFileList = np.random.choice(myInputFileList, size=len(myInputFileList), replace=False).tolist()

dataset = tf.data.TFRecordDataset(myShuffledFileList)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM