您如何使用 tf.data 管道来允许数据集选择和批处理?

How do you use the tf.data pipeline to allow dataset selection and batching?

我正在尝试使用 tf.data 输入管道,以便在对数据进行批处理时允许 select 在 运行 时间处理数据集。以下应该允许我 运行 InitTrain/InitTest 到 select 使用哪个数据集:

TrainData = tf.data.Dataset.from_generator(TrainGenerator,tf.float32)
TestData = tf.data.Dataset.from_generator(TestGenerator,tf.float32)

DataIterator = tf.data.Iterator.from_structure(tf.float32)
DataNext = DataIterator.get_next()
InitTrain = DataIterator.make_initializer(TrainData)
InitTest = DataIterator.make_initializer(TestData)

如果不使用迭代器,我可以使用以下方法获取填充批次:

TrainData.padded_batch(1000,someshape) 

如何在保留 select 输入数据源的能力的同时对数据进行批处理?

一个可能的解决方法是创建一个新的 from_generator 数据集并创建一个生成器,该生成器调用 DataNext 上的 sess.run 来创建一个可以批处理的数据集,但是这会导致分配 运行 调用,所以我怀疑这是不是它应该使用的方式。

您的每个数据集都独立于另一个运行,并且迭代器根据您使用的初始化程序在反测试之间切换。因此,如果您想批处理一个数据集而不是另一个数据集,您可以使用:

TrainData = tf.data.Dataset.from_generator(TrainGenerator,tf.float32)
TrainData = TrainData.batch(100)

TestData = tf.data.Dataset.from_generator(TestGenerator,tf.float32)

DataIterator = tf.data.Iterator.from_structure(tf.float32)
DataNext = DataIterator.get_next()
InitTrain = DataIterator.make_initializer(TrainData)
InitTest = DataIterator.make_initializer(TestData)

顺便说一句,您还可以利用这两个管道不同的事实(如果您愿意)为每个数据集做不同的映射。因此,例如,您可以对训练数据使用批量归一化,但不对测试数据进行归一化(如果您已经对整个数据集进行了归一化)。