我想知道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)
我希望dq1
,dq2
在第一次运行时为'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))
为什么这会发生而不是我期望的?我正在使用它来匹配训练示例和标签,但是一些训练样例和标签被跳过/偏移。只是在单个队列中交错文件名是一个更好的解决方案吗?不管怎样,我想了解这种行为。
感谢任何帮助。
答案 0 :(得分:2)
TensorFlow队列允许您在单个操作中以原子方式将列表(更准确地说是固定长度的元组)入队和出列。张量dq1
和dq2
是相同的出队操作的输出,在这种情况下将从队列中移除两个张量的元组。 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)