我有一个队列(称为queue_A
)并在里面填充100个元素。如果我想做以下两件事:
queue_A
中取出1个元素,对其进行一些处理,并将结果排入另一个队列(queue_B
)。排队操作称为op_B
。queue_A
,此排队操作称为op_A
。为了达到1,我可以写:
anElement = queue_A.dequeue()
result = proc(anElement)
op_B = queue_B.enqueue(result)
queue_runner = tf.train.QueueRunner(queue_B,
[op_B] * 4)
为了达到2,我可以写:
anElement = queue_A.dequeue()
op_A = queue_A.enqueue(anElement)
queue_runner = tf.train.QueueRunner(queue_A,
[op_A] * 4)
但是,我不知道如何一次完成这两件事。 现在,我使用以下代码:
anElement = queue_A.dequeue()
op_A = queue_A.enqueue(anElement)
result = proc(anElement)
op_B = queue_B.enqueue(result)
queue_runner = tf.train.QueueRunner(queue_B,
[op_A, op_B] * 4)
我希望queue_A
的大小是常量,但当我使用session.run(queue_A.size())
进行检查时,大小会逐渐减小。
这段代码出了什么问题?以及如何实现我想要的目标?
答案 0 :(得分:3)
示例中的代码有两种类型的“队列运行器”:
op_A
的一个:它将一个元素从queue_A
出列,并将其重新排列回queue_B
。op_B
的内容:它将queue_A
中的元素出列,通过proc()
对其进行处理,然后将结果排入queue_B
。问题是,当op_A
和op_B
单独运行时(例如,在不同的队列运行程序中,或者在对sess.run()
的不同调用中),它们将使不同来自queue_A
的em>元素。通过运行op_B
而出列的元素永远不会重新排队到queue_A
,这就解释了为什么它的大小会逐渐减少。
要解决此问题,如Andrei suggests,您需要创建一个运行单个TensorFlow子图的操作,该子图同时执行op_A
和op_B
。以下示例应该有效:
anElement = queue_A.dequeue()
op_A = queue_A.enqueue(anElement)
result = proc(anElement)
op_B = queue_B.enqueue(result)
# Creates a single op that enqueues the original element back to queue_A and the
# processed element to queue_B.
op = tf.group(op_A, op_B)
queue_runner = tf.train.QueueRunner(queue_B, [op] * 4)
答案 1 :(得分:1)
很遗憾,我无法解释为什么您的代码无效,但看起来 op_A 并不执行,因为它不依赖于 queue_B ,我建议您使用控制流操作(例如tf.group)来实现您的需求。
op = tf.group(op_A, op_B)
queue_runner = tf.train.QueueRunner(queue_B,
[op] * 4)