python - TensorFlow 队列馈送顺序

标签 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))

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

感谢任何帮助。

最佳答案

TensorFlow 队列允许您在单个操作中以原子方式将张量列表(更准确地说是固定长度元组)入队和出队。张量 dq1dq2是同一出队操作的输出,在本例中将从队列中删除两个张量的元组。每次调用 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/

相关文章:

python - Pandas:根据某些条件过滤 groupby 数据

tensorflow - 如何在 TensorFlow 中使用带有 PCA 的 'sphereize data' 选项

python - 我的神经网络有什么问题,它给出了错误的预测

python - 收集所有不同轮廓的非零像素

python - 如何更好地使用 Cython 更快地求解微分方程?

python - 如何从 Tensorflow 中的检查点文件加载单个张量?

python - 如何将 python 列表输入 Tensorflow

tensorflow - 为什么我的 tf_gradients 返回 None ?

python - 进行此搜索的最有效方法是什么(mysql 或文本)?

python - Pandas Dataframe 输出到 JSON