Python TensorFlow中迭代器之间的多路复用

Python TensorFlow中迭代器之间的多路复用,python,tensorflow,Python,Tensorflow,我需要的功能:我的数据集被划分为块,每个块位于一个二进制文件中。 我有一个算法,它也对块进行操作以降低计算复杂度,然后在访问所有块后将结果合并在一起。重要的是要有一个来自单个块的单个小批量数据,并且要知道哪个块能够准确地将一些参数传递到特定于该块的图形中。在下一次迭代中,当再次从块0开始时,应使用来自所有块的下一个小批量。块的长度可以不相等,并且应该永远重复 我当前的解决方案:目前,我为每个块(即:每个文件)创建了一个tf.Iterator,该块是用tf.data.FixedLengthReco

我需要的功能:我的数据集被划分为块,每个块位于一个二进制文件中。 我有一个算法,它也对块进行操作以降低计算复杂度,然后在访问所有块后将结果合并在一起。重要的是要有一个来自单个块的单个小批量数据,并且要知道哪个块能够准确地将一些参数传递到特定于该块的图形中。在下一次迭代中,当再次从块0开始时,应使用来自所有块的下一个小批量。块的长度可以不相等,并且应该永远重复

我当前的解决方案:目前,我为每个块(即:每个文件)创建了一个
tf.Iterator
,该块是用
tf.data.FixedLengthRecordDataset
创建的:

// for every file:
ds = tf.dataFixedLengthRecordDataset(...)
ds = ds.repeat()
ds = ds.batch(...)
ds = ds.map(...)
ds = ds.prefetch(buffer_size=1)

it = ds.make_one_shot_iterator()
然后我有一个“主”迭代器,它在文件级迭代器之间进行多路复用。这是通过:

itr_handle = tf.placeholder(tf.string, shape=())
master_itr = tf.data.Iterator.from_string_handle(itr_handle, output_types)
master_next = master_itr.get_next()
因此,每次执行图形时,我都将要用于此执行的相应迭代器的字符串句柄传递到占位符中。这样,每个文件级迭代器仍然有自己的状态;因此,当为下一个迷你批处理请求相同的块文件时,它将有效地返回下一个迷你批处理,而不是重新打开该文件,然后再次返回第一个迷你批处理

问题:创建文件级迭代器的速度很慢。每个文件至少需要200毫秒才能创建迭代器。我使用的数据集可以很容易地包含多达100个块文件,这导致TensorFlow/Python坐在那里生成这些迭代器对象和图形节点20秒,而不是实际处理任何数据

问题:

  • 例如,用一个迭代器来解决这个问题的另一种方法
  • 如果没有,如何加快迭代器的创建

  • 看起来您可以使用api,或者您可以创建一个数据集,根据需要的顺序交错数据,然后对其进行批处理,并使用一个迭代器对其进行迭代。是否需要显式控制每次运行图时从哪个块中选取批处理,或者这仅仅是您作为当前解决方案的一部分添加的内容?@jdehesa:我希望每个块都只包含一次,然后合并结果。然后我可以重复整个过程。在逐块处理时,我需要知道在算法中配置哪个块的参数,特定于该块。