Skip to main content
 首页 » 编程设计

python之TensorFlow 队列馈送顺序

2024年10月17日24傻小

我想知道 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) 的每次调用都对应于对出队操作的单独调用,但是当您invoke sess.run(dq1) TensorFlow 丢弃另一个元组元素,因为您没有在调用 sess.run() 时明确请求它。

解决方案是确保 dequeue() 操作的两个 输出在对 sess 的相同 调用中被消耗。运行()。例如,对您的程序进行以下更改应该会产生您最初预期的结果:

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