美文网首页
25-队列管理器和协程协调器实现异步读取训练

25-队列管理器和协程协调器实现异步读取训练

作者: jxvl假装 | 来源:发表于2019-10-05 11:17 被阅读0次

分析:当数据量很大时,入队操作从硬盘中读取数据,放入内存中,主线程需要等待入队操作完成,才能进行训练。会话里可以运行多个线程,实现异步读取。

队列管理器

虽然叫队列管理器,但是其作用是创建线程


队列管理器
import tensorflow as tf

#模拟异步子线程存入样本,主线程读取样本
#1. 定义一个队列, 1000
Q = tf.FIFOQueue(1000, tf.float32)
#2. 定义子线程要做的事情 循环值 +1 放入队列当中
var = tf.Variable(0.0)
#实现一个自增 tf.assign_add
data = tf.assign_add(var, tf.constant(1.0)) #注意,这里的data是一个op
en_q = Q.enqueue(data)
#3. 定义队列管理器op:指定子线程要做的事情
qr = tf.train.QueueRunner(Q, enqueue_ops=[en_q]*2)   #用两个线程执行en_q这个op
#初始化变量的op
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
    #初始化变量
    sess.run(init_op)
    #真正开启子线程
    qr.create_threads(sess, start=True) #在这里即开启子线程
    #主线程,不断取数据
    for i in range(300):
        print(sess.run(Q.dequeue()))

注意:以上代码会报tensorflow.python.framework.errors_impl.CancelledError: Enqueue operation was cancelled异常
这是因为主线程已经结束,所以Session已经被释放,子线程就没有了资源

线程协调器

线程协调器
import tensorflow as tf

#模拟异步子线程存入样本,主线程读取样本
#1. 定义一个队列, 1000
Q = tf.FIFOQueue(1000, tf.float32)
#2. 定义子线程要做的事情 循环值 +1 放入队列当中
var = tf.Variable(0.0)
#实现一个自增 tf.assign_add
data = tf.assign_add(var, tf.constant(1.0)) #注意,这里的data是一个op
en_q = Q.enqueue(data)
#3. 定义队列管理器op:指定子线程要做的事情
qr = tf.train.QueueRunner(Q, enqueue_ops=[en_q]*2)   #用两个线程执行en_q这个op
#初始化变量的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=threads)

相关文章

网友评论

      本文标题:25-队列管理器和协程协调器实现异步读取训练

      本文链接:https://www.haomeiwen.com/subject/vsuuuctx.html