如何在创建一对张量的张量流数据集迭代器时重用一个张量?

How to reuse one tensor when creating a tensorflow dataset iterator of a pair of tensors?

想象一下我想将一个数据池中的样本与另一个数据池中的样本配对以馈入网络的情况。但是第一个池中的许多样本应该与第二个池中的相同样本配对。 (假设所有样本的形状都相同)。

例如,如果我们将第一个池中的样本表示为 f_i,将第二个池中的样本表示为 g_j,我可能想要一个小批量样本,如下所示(每行是小批量中的一个样本): (f_0, g_0) (f_1, g_0) (f_2, g_0) (f_3, g_0) ... (f_10, g_0) (f_11, g_1) (f_12, g_1) (f_13, g_1) ... (f_19, g_1) ...

如果第二个池中的数据很小(如标签),那么我可以简单地将它们与第一个池中的样本一起存储到 tfrecords。但在我的例子中,第二个池中的数据与第一个池中的数据大小相同(例如,两者都是电影片段)。然后将它们成对保存在一个 tfrecords 文件中似乎几乎使磁盘 space 使用量增加一倍。

我想知道是否有任何方法可以只将第二个池中的所有样本保存在磁盘上一次,但仍然按照我想要的方式将数据传送到我的网络? (假设我已经根据文件名指定了第一个池中样本与第二个池中样本之间的映射)。

非常感谢!

您可以为每个 tfrecords(或样本池)使用一个迭代器,这样您就可以获得两个迭代器,每个迭代器都可以按照自己的步调进行迭代。当您在迭代器上 运行 get_next() 时,将返回下一个样本,因此您必须将其保存在张量中并手动输入。引用自 documentation:

(Note that, like other stateful objects in TensorFlow, calling Iterator.get_next() does not immediately advance the iterator. Instead you must use the returned tf.Tensor objects in a TensorFlow expression, and pass the result of that expression to tf.Session.run() to get the next elements and advance the iterator.)

因此,您所需要的只是几个循环,将来自每个迭代器的样本作为一对进行迭代和组合,然后您可以在 运行 您想要的操作时提供它。例如:

g_iterator = g_dataset.make_one_shot_iterator()
get_next_g = g_iterator.get_next()

f_iterator = f_dataset.make_one_shot_iterator()
get_next_f = f_iterator.get_next()

# loop g:
temp_g = session.run(get_next_g)
  # loop f:
  temp_f = session.run(get_next_f)
  session.run(train, feed_dict={f: temp_f, g: temp_g})

这是否回答了您的问题?