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

时间:2017-10-28 04:04:59

标签: tensorflow tfrecord

想象一下,我希望将来自一个数据池的样本与来自另一个数据池的样本配对以馈送到网络中。但是第一个池中的许多样本应该与第二个池中的相同样本配对。 (让我们假设所有样本的形状都相同)。

例如,如果我们将第一个池中的样本表示为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文件中似乎几乎是磁盘空间使用量的两倍。

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

非常感谢!

1 个答案:

答案 0 :(得分:0)

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

  

(注意,与TensorFlow中的其他有状态对象一样,调用Iterator.get_next()不会立即推进迭代器。而是必须在TensorFlow表达式中使用返回的tf.Tensor对象,并将该表达式的结果传递给tf.Session.run()获取下一个元素并推进迭代器。)

所以你只需要几个循环来迭代并组合每个迭代器中的样本作为一对,然后你可以在运行你想要的操作时提供它。例如:

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})

这会回答你的问题吗?