引子
队列(queue
)是TensorFlow中的重要组成部件。所有队列管理器被默认加入图的tf.GraphKeys.QUEUE_RUNNERS
集合中。
在读入数据的这个例子中,可以在构建完图之后,打印出图中队列的相关信息:
queue_runners = tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS)
for qr in queue_runners:
print(type(qr.queue))
print(qr.queue.name)
for opt in qr.enqueue_ops:
print(type(opt))
print(opt.name)
这个例子中,出现了两个QueueRunner
:第一个由tf.train.string_input_produecer
函数创建,负责管理数据文件名;第二个由tf.train.shuffle_batch
函数创建,负责管理样本。
每个队列管理器拥有一个queue
:可以是先进先出的(FIFOQueue
),或者随机的(RandomShuffleQueue
)。
每个队列管理器还有用一个enqueue_ops
列表,装有入队操作。第一个队列管理器只有一个入队操作;第二个队列管理器,由于设置num_threads=2
,有两个线程向样本队列中添加。
使用样本时,从第二个队列中执行出队操作。
接下来,我们用最简单的例子展示TensorFlow的队列机制。
Queue
队列本身也是图中的一个节点。
其他节点(enqueue, dequeue)可以修改队列节点中的内容。
FIFOQue
创建一个先进先出队列,以及一个“出队,+1,入队”操作:
q = tf.FIFOQueue(3, "float")
x = q.dequeue()
y = x+1
q_inc = q.enqueue([y])
初始化并执行2次这个操作,之后查看队列内容
sess = tf.Session()
sess.run(q.enqueue_many(([0.1, 0.2, 0.3]),))
for i in range(0,2):
sess.run(q_inc)