一、队列和线程
(一)tensorflow队列
1、在训练样本的时候,希望读入的训练样本时有序的
2、tf.FIFOQueue 先进先出队列,按顺序出队列
FIFOQueue(capacity, dtypes, name=‘fifo_queue’)
创建一个以先进先出的顺序对元素进行排队的队列
(1)capacity:整数。可能存储在此队列中的元素数量的上限;
(2)dtypes:DType对象列表。长度dtypes必须等于每个队列元素中的张量数,dtype的类型形状,决定了后面进队列元素形状;
method
(1)dequeue(name=None)
(2)enqueue(vals, name=None):
(3)enqueue_many(vals, name=None):vals列表或者元组
返回一个进队列操作
(4)size(name=None)
3、tf.RandomShuffleQueue 随机出队列
例如:
import tensorflow as tf
#模拟一下同步先处理数据,然后才能去数据训练
#tensorflow当中,运行操作有依赖性
#1、首先定义队列
Q = tf.FIFOQueue(3, tf.float32)
#放入一些数据
enq_many = Q.enqueue_many([[0.1, 0.2, 0.3], ])
#2、定义一些处理数据的螺距,取数据的过程 取数据, +1, 入队列
out_q = Q.dequeue()
data = out_q +1
en_q = Q.enqueue(data)
with tf.Session() as sess:
#初始化队列
sess.run(enq_many)
#处理数据
for i in range(100):
sess.run(en_q)
#训练数据
for i in range(Q.size().eval()):
print(sess.run(Q.dequeue()))
二、文件读取
三、图片处理
四、队列管理器
tf.train.QueueRunner(queue, enqueue_ops=None)
创建一个QueueRunner
(1)queue:A Queue
(2)enqueue_ops:添加线程的队列操作列表,[]*2,指定两个线程
(3)create_threads(sess, coord=None,start=False)创建线程来运行给定会话的入队操作
(4)start:布尔值,如果True启动线程;如果为False调用者必须调用start()启动线程
(5)coord:线程协调器,后面线程管理需要用到
(6)return:
例如:异步操作
import tensorflow as tf
#模拟异步子线程 存入样本,主线程读取样本
#1、定义一个队列,1000
Q = tf.FIFOQueue(1000,tf.float32)
#2、定义子线程要做的事情 循环 值,+1, 放入队列
var = tf.Variable(0.0)
#实现一个自增 tf.assige_add
data = tf.assign_add(var, tf.constant(1.0))
en_q = Q.enqueue(data)
#3、定义队列管理器op,指定多少个子线程,子线程该干什么事情
qr = tf.train.QueueRunner(Q, enqueue_ops=[en_q] * 2)
#初始化变量的op
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
#初始化变量
sess.run(init_op)
#真正开启子线程
threads = qr.create_threads(sess, start=True)
#主线程,不断读取数据训练
for i in range(300):
print(sess.run(Q.dequeue()))
入队自顾自的去执行,在需要的出队操作完成之后,程序没法结束。需要一个实现线程间的同步,终止其他线程。
五、线程协调器
tf.train.Coordinator()线程协调员,实现一个简单的机制来协调一组线程的终止
1、request_stop()
2、should_stop() 检查是否要求停止
3、join(threads=None, stop_grace_period_secs=120)
等待线程终止
4、return:线程协调员实例
例如:
import tensorflow as tf
#模拟异步子线程 存入样本,主线程读取样本
#1、定义一个队列,1000
Q = tf.FIFOQueue(1000,tf.float32)
#2、定义子线程要做的事情 循环 值,+1, 放入队列
var = tf.Variable(0.0)
#实现一个自增 tf.assige_add
data = tf.assign_add(var, tf.constant(1.0))
en_q = Q.enqueue(data)
#3、定义队列管理器op,指定多少个子线程,子线程该干什么事情
qr = tf.train.QueueRunner(Q, enqueue_ops=[en_q] * 2)
#初始化变量的op
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
#初始化变量
sess.run(init_op)
#开启线程管理器
coord = tf.train.Coordinator()
#真正开启子线程
threads = qr.create_threads(sess, coord=coord, start=True)
#主线程,不断读取数据训练
for i in range(300):
print(sess.run(Q.dequeue()))
#回收你
coord.request_stop()
coord.join(threads)