最直接的方法是使一批出列,通过谓词测试运行它们,使用tf.where生成与谓词匹配的稠密向量,并使用tf.gather收集结果并将该批次排队。如果您希望自动发生这种情况,您可以在第二个队列上启动队列运行程序 - 最简单的方法是使用tf.train.batch
:
Example:
import numpy as np
import tensorflow as tf
a = tf.constant(np.array([5, 1, 9, 4, 7, 0], dtype=np.int32))
q = tf.FIFOQueue(6, dtypes=[tf.int32], shapes=[])
enqueue = q.enqueue_many([a])
dequeue = q.dequeue_many(6)
predmatch = tf.less(dequeue, [5])
selected_items = tf.reshape(tf.where(predmatch), [-1])
found = tf.gather(dequeue, selected_items)
secondqueue = tf.FIFOQueue(6, dtypes=[tf.int32], shapes=[])
enqueue2 = secondqueue.enqueue_many([found])
dequeue2 = secondqueue.dequeue_many(3) # XXX, hardcoded
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
sess.run(enqueue) # Fill the first queue
sess.run(enqueue2) # Filter, push into queue 2
print sess.run(dequeue2) # Pop items off of queue2
谓词产生一个布尔向量;这tf.where
产生真实值索引的密集向量,并且tf.gather
根据这些索引从原始张量中收集项目。
当然,在这个示例中,很多东西都是硬编码的,您在现实中需要进行非硬编码,但希望它能显示您正在尝试执行的操作的结构(创建过滤管道)。在实践中,您希望 QueueRunners 保持自动运转。使用tf.train.batch
自动处理这个问题非常有用——参见线程和队列了解更多详情。