一、队列
在Tensorflow中,队列不仅是一种数据结构,也是多线程输入数据处理框架的基础。队列和变量类似,都是计算图上有状态的节点,其他节点可以修改它的内容,对于变量,可以通过赋值操作改变变量的取值。对于队列,其他节点可以把新元素插入到队列后端,也可以把队列前端的元素删除,修改队列状态的操作主要有Enqueue(进队列)、EnqueueMany()、Dequeue(出队列)。在使用队列前需要明确调用初始化过程。
Tensorflow提供了FIFOQueue(先进先出)和RandomShuffleQueue(随机)两种队列,其中RandomShuffleQueue每次出队操作得到的是队列内所有元素中随机选择的一个。
实例代码:
import tensorflow as tf
q = tf.RandomShuffleQueue(capacity=10,min_after_dequeue=2,dtypes='float32')
#创建一个随机队列,最大长度为10,出队后的最小长度为2,数据类型为float32
with tf.Session() as sess :
for i in range(0,10):
sess.run(q.enqueue(i))
#在输出8次后被阻塞
for i in range(0,8):
print(sess.run(q.dequeue()))
Tensorflow提供了tf.Coordinator和tf.QueueRuner两个类来完成多线程协同的功能,tf.Coordinator主要用于协同多个线程一起停止,并提供了should_stop、request_stop和join三个函数,在启动线程前,首先需要声明一个tf.Coordinator类,并将这个类传入每一个创建的线程中。启动的线程需要一直查询should_stop函数,当返回值为True时,当前的线程也需要退出。每一个启动的线程都可以通过调用request_stop函数来通知其他线程退出,当某一个线程调用request_stop函数之后,should_stop函数的返回值将被设置为True,这样其他的线程就可以同时终止了。
实例代码:
import tensorflow as tf
import numpy as np
import threading
import