TensorFlow队列订单源

时间:2016-08-09 16:43:18

标签: python tensorflow

我想知道TensorFlow以什么顺序排队饲料数据(特别是当你有一个他们正在喂食的张量列表时)。

例如,在这样的队列中:

fifo_q = tf.FIFOQueue(
              capacity=10,
              dtypes=[tf.string, tf.string]
              shapes=[[], []])

如果我将这些列表排入队列:

sess = tf.Session()

l = [str(i+1) for i in range(10)]
x = tf.constant(l)
y = tf.constant(l)

eq = fifo_q.enqueue_many([x, y])
dq1, dq2 = fifo_q.dequeue()
sess.run(eq)

我希望dq1dq2在第一次运行时为'1','1',然后在'2','2'等等。但这不是正在发生的事情。相反,当我运行以下代码时,我得到'1','2'然后'3','4',依此类推,直到dq2达到10,然后队列锁定。

for x in range(6):
  print('dq1:', sess.run(dq1))
  print('dq2:', sess.run(dq2))

为什么这会发生而不是我期望的?我正在使用它来匹配训练示例和标签,但是一些训练样例和标签被跳过/偏移。只是在单个队列中交错文件名是一个更好的解决方案吗?不管怎样,我想了解这种行为。

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

TensorFlow队列允许您在单个操作中以原子方式将列表(更准确地说是固定长度的元组)入队和出列。张量dq1dq2是相同的出队操作的输出,在这种情况下将从队列中移除两个张量的元组。 sess.run(dq1)sess.run(dq2)的每次调用都对应于出列操作的单独调用,但是当你调用sess.run(dq1)时TensorFlow会丢弃另一个元组元素,因为你没有在sess.run()的调用中明确请求它。

解决方案是确保dequeue()操作的两个输出都在{strong>相同调用sess.run()中消耗。例如,对程序的以下更改应生成您最初预期的结果:

for x in range(6):
  dq1_val, dq2_val = sess.run([dq1, dq2])
  print('dq1:', dq1_val)
  print('dq2:', dq2_val)