Tensorflow 将数据批量添加到tf.data.Dataset API

Tensorflow 将数据批量添加到tf.data.Dataset API,tensorflow,tensorflow-datasets,Tensorflow,Tensorflow Datasets,我有一个数据集,我想传递给tf.data.datasetAPI进行调度。但是,在传递到tf.data.Dataset之前,我需要读入大量数据文件并对其进行预处理。我不想一次将内存中的所有数据读取。目前,我一直在一次读取一个文件,对它们进行批处理,然后读取下一个文件。i、 e 导入itertools 类数据记录器: 定义初始化(self,文件列表): self.list\u of_文件=list\u of_文件 self.init_索引=0 self.x,self.y=self.loop\u文件(

我有一个数据集,我想传递给
tf.data.dataset
API进行调度。但是,在传递到
tf.data.Dataset
之前,我需要读入大量数据文件并对其进行预处理。我不想一次将内存中的所有数据读取。目前,我一直在一次读取一个文件,对它们进行批处理,然后读取下一个文件。i、 e

导入itertools
类数据记录器:
定义初始化(self,文件列表):
self.list\u of_文件=list\u of_文件
self.init_索引=0
self.x,self.y=self.loop\u文件()
def循环_文件(自):
对于itertools.cycle(self.list\u文件)中的一个\u部分:
#读入一个零件文件,其中有N个示例
#做一些预处理
#self.x和self.y的形状分别为[N,feature_num]、[N,]
屈服于self.x,self.y
def gen_批次(自身、批次大小):
#如果剩余数据不足以进行批处理,则丢弃剩余数据
如果(self.init\u索引+批次大小)>self.y.shape[0]:
self.x,self.y=self.loop\u文件()
self.init_索引=0
x_batch,y_batch=self.x[self.init_index:self.init_index+batch_size,:],self.y[self.init_index:self.init_index+batch_size]
self.init\u index+=批量大小
返回x_批,y_批
数据批处理程序=数据批处理程序(文件)
x_样本,y_样本=数据批处理程序。gen_批处理(10)

x\u样本
y\u样本
然后通过
feed\u dict
传递到tensorflow模型。但是我想改为
tf.data.Dataset
,以提高性能。我发现
tf.data.Dataset.from_tensor_slices
在分派之前读取整个数据集,而
tf.data.Dataset.from_generator
一次读取一个示例,两者都没有有效地使用资源,这两者之间有什么办法吗?类似于使用generator生成数据集的一部分?

如果使用数据集API,则不需要批处理逻辑。最好是:

  • 在现有的生成器函数上使用
    Dataset.from_generator
  • 然后使用
    dataset.batch()
    方法批处理到您需要的任何大小的批
  • 也许是这样的:

    data_batcher = DataBatcher(files)
    
    dataset = tf.data.Dataset.from_generator(data_batcher.loop_files, output_types=(tf.float32, tf.float32))
    batched_data = dataset.batch(BATCH_SIZE)
    

    如果使用dataset API,则不需要批处理逻辑。最好是:

  • 在现有的生成器函数上使用
    Dataset.from_generator
  • 然后使用
    dataset.batch()
    方法批处理到您需要的任何大小的批
  • 也许是这样的:

    data_batcher = DataBatcher(files)
    
    dataset = tf.data.Dataset.from_generator(data_batcher.loop_files, output_types=(tf.float32, tf.float32))
    batched_data = dataset.batch(BATCH_SIZE)
    

    来自_生成器的
    可以包装任意Python代码。这意味着是的,您可以一次完全生成部分数据集。但是,最终由您来确保,从数据集到模型中的任何内容都具有“合理”的结构。是的,我尝试让生成器生成部分数据,但在批处理过程中,该部分被视为一个数据示例,而不是来自\u generator的多个示例
    可以包装任意Python代码。这意味着是的,您可以一次完全生成部分数据集。但最终要由您确保,从数据集到模型中的任何内容都具有“合理”的结构。是的,我尝试让生成器生成部分数据,但在批处理过程中,该部分被视为一个数据示例,没有多个示例将
    数据\u batcher.loop\u文件
    从\u生成器
    传递到
    的问题在于,它将把
    loop\u文件
    的每个输出视为一个示例,实际上,它是一个文件中的N个示例。我的代码示例对此不清楚,我将添加注释。是的,我可以这样做。我只是认为这可能比我自己的批处理使用
    feed\u dict
    效率更低。虽然我还没有测试过/我无意中删除了那个评论!抱歉,犹豫不决和错误点击的组合!:-)我想你已经明白我想说的要点了!将
    数据\u batcher.loop\u文件
    从\u生成器
    传递到
    的问题在于,它将把
    loop\u文件
    的每个输出视为一个示例,实际上,它是一个文件中的N个示例。我的代码示例对此不清楚,我将添加注释。是的,我可以这样做。我只是认为这可能比我自己的批处理使用
    feed\u dict
    效率更低。虽然我还没有测试过/我无意中删除了那个评论!抱歉,犹豫不决和错误点击的组合!:-)我想你已经明白我想说的要点了!