Tensorflow:出队然后入队

时间:2016-08-23 06:21:27

标签: tensorflow

我有一个队列(称为queue_A)并在里面填充100个元素。如果我想做以下两件事:

  1. queue_A中取出1个元素,对其进行一些处理,并将结果排入另一个队列(queue_B)。排队操作称为op_B
  2. 将此元素(在处理之前)排队回queue_A,此排队操作称为op_A
  3. 为了达到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())进行检查时,大小会逐渐减小。 这段代码出了什么问题?以及如何实现我想要的目标?

2 个答案:

答案 0 :(得分:3)

示例中的代码有两种类型的“队列运行器”:

  1. 运行op_A的一个:它将一个元素从queue_A出列,并将其重新排列回queue_B
  2. 另一个运行op_B的内容:它将queue_A中的元素出列,通过proc()对其进行处理,然后将结果排入queue_B
  3. 问题是,当op_Aop_B单独运行时(例如,在不同的队列运行程序中,或者在对sess.run()的不同调用中),它们将使不同queue_A的em>元素。通过运行op_B而出列的元素永远不会重新排队到queue_A,这就解释了为什么它的大小会逐渐减少。

    要解决此问题,如Andrei suggests,您需要创建一个运行单个TensorFlow子图的操作,该子图同时执行op_Aop_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)