我想知道 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))
为什么会发生这种情况而不是我所期望的?我使用它来将训练示例与标签相匹配,但一些训练示例和标签被跳过/偏移。将文件名交错在单个队列中是否是更好的解决方案?不管怎样,我想理解这种行为。
感谢任何帮助。
最佳答案
TensorFlow 队列允许您在单个操作中以原子方式将张量列表(更准确地说是固定长度元组)入队和出队。张量 dq1
和dq2
是同一出队操作的输出,在本例中将从队列中删除两个张量的元组。每次调用 sess.run(dq1)
或sess.run(dq2)
对应于出队操作的单独调用,但是当您调用 sess.run(dq1)
时TensorFlow 会丢弃另一个元组元素,因为您没有在调用 sess.run()
时明确请求它.
解决方案是确保 dequeue()
的两个输出操作在对 sess.run()
的相同调用中消耗。例如,对程序进行以下更改应该会产生您最初期望的结果:
for x in range(6):
dq1_val, dq2_val = sess.run([dq1, dq2])
print('dq1:', dq1_val)
print('dq2:', dq2_val)
关于python - TensorFlow 队列馈送顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38856292/