6.1 Tensorflow笔记(基础篇):队列与线程
来源:互联网 发布:淘宝 投诉未生产扣分吗 编辑:程序博客网 时间:2024/05/29 17:27
前言
在Tensorflow的实际应用中,队列与线程是必不可少,主要应用于数据的加载等,不同的情况下使用不同的队列,主线程与其他线程异步进行数据的训练与读取,所以队列与线程的知识也是Tensorflow必须要学会的重要知识
另一方面,Tensorflow作为符号编程框架,在构图后,加载数据有三种方式,预加载与填充数据都存在,数据量大消耗内存等情况的出现.使用第三种方式文件读取避免了前两者的缺点,但是其实现则必须要使用队列与此线程,因此为了进一步的学习,也需要在这个时候掌握队列与线程的知识
FIFOQueue : 先入先出的队列
# 在使用循环神经网络时,希望读入的训练样本是有序的,就要用到FIFOQueue# 先创建一个先入先出的队列,初始化队列插入0.1,0.2,0.3三个数字q = tf.FIFOQueue(3,tf.float32)init = q.enqueue_many(([0.1,0.2,0.3],))# 定义出队,+1,入队操作x = q.dequeue()y = x+1q_inc = q.enqueue(y)with tf.Session() as sess: sess.run(init) # quelen = sess.run(q.size()) for i in range(2): sess.run(q_inc) # 执行两次操作,队列中的值变为0.3,1.1,1.2 for j in range(sess.run(q.size())): print(sess.run(q.dequeue())) # 输出队列的值
运行结果
0.31.11.2
RandomShuffleQueue:随机队列
随机队列,再出队列时,是以随机的顺序产生元素的# 例如,我们在训练一些图像样本时,使用CNN的网络结构,希望可以无序的读入训练样本q = tf.RandomShuffleQueue(capacity=10,min_after_dequeue=2,dtypes=tf.float32)# capacity 队列最大长度,min_after_dequeue 出队后最小的长度with tf.Session() as sess : for i in range(0,10): # 10次入队 sess.run(q.enqueue(i)) for i in range(0,8): # 8次出队 print(sess.run(q.dequeue()))# 在队列长度等于最小值时,执行出队操作,会发生阻断# 在队列长度等于最大值时,执行入队操作,会发生阻断# 解除阻断的一种方法---设置等待时间# run_options = tf.RunOptions(time_out_in_ms = 100000) # 等待十秒# try:# sess.run(q.dequeue(),options=run_options)# except tf.errors.DeadlineExceededError:# print('out of range')
运行结果:
1.06.03.00.07.04.08.09.0
队列管理器
q = tf.FIFOQueue(1000, tf.float32)counter = tf.Variable(0.0) # 计数器increment_op = tf.assign_add(counter, tf.constant(1.0)) # 操作给计数器加一enquence_op = q.enqueue(counter) # 操作: 让计数器加入队列# 创建一个队列管理器QueueRunner,用这两个操作相对列q中添加元素,目前我们只使用一个线程qr = tf.train.QueueRunner(q, enqueue_ops=[increment_op, enquence_op] * 1)# 启动一个会话,从队列管理器qr中创建线程# 主线程with tf.Session() as sess: sess.run(tf.global_variables_initializer()) enquence_threads = qr.create_threads(sess, start=True) # 启用入队线程 # 主线程 for i in range(10): print(sess.run(q.dequeue()))# tensorflow.python.framework.errors_impl.CancelledError: Run call was cancelled
运行结果:
187.0190.0195.0201.0206.0209.0214.0219.0223.0230.0报错:......
线程和协调器
使用协调器来管理线程
这是要注意的的是在队列线程关闭后,再执行出队操作,将会报错”tf.errors.OutOfRange”
第一点会报错很好理解,队列关闭自然不能出队了(如果你学过数据结构那么你应该能够理解队列的意义,如果没能理解,建议重新掌握队列这一基本概念),
第二点则需要注意一下,报的错误是超出范围,而非队列不存在,希望当你遇到这个错误的时候能够想到,实际上可能是队列线程已经被取消了,而非真的超出了范围.
q = tf.FIFOQueue(1000, tf.float32)counter = tf.Variable(0.0) # 计数器increment_op = tf.assign_add(counter, tf.constant(1.0)) # 操作给计数器加一enquence_op = q.enqueue(counter) # 操作: 让计数器加入队列# 第一种情况,在关闭其他线程之后(除主线程之外的其它线程),调用出队操作print('第一种情况,在关闭其他线程之后(除主线程之外的其它线程),调用出队操作')# 创建一个队列管理器QueueRunner,用这两个操作相对列q中添加元素,目前我们只使用一个线程qr = tf.train.QueueRunner(q, enqueue_ops=[increment_op, enquence_op] * 1)# 主线程sess = tf.Session()sess.run(tf.global_variables_initializer())# Coordinator: 协调器, 协调线程间的关系,可以视为一种信号量,用来做同步coord = tf.train.Coordinator()# 启动入队线程,协调器是线程的参数enqueue_threads = qr.create_threads(sess,coord=coord,start=True)# 主线程for i in range(0,10): print(sess.run(q.dequeue()))coord.request_stop() # 通知其他线程关闭coord.join(enqueue_threads) # join 操作等待其他线程结束,其他所有线程关闭之后,这一函数才能返回print('第二种情况: 在队列线程关闭之后,调用出队操作-->处理tf.errors.OutOfRange错误')# q启动入队线程enqueue_threads = qr.create_threads(sess,coord=coord,start=True)# 主线程coord.request_stop() # 通知其他线程关闭for j in range(0,10): try: print(sess.run(q.dequeue())) except tf.errors.OutOfRangeError: breakcoord.join(enqueue_threads) # join 操作等待其他线程结束,其他所有线程关闭之后,这一函数才能返回
运行结果:
第一种情况,在关闭其他线程之后(除主线程之外的其它线程),调用出队操作5.07.010.017.023.029.034.038.046.052.0第二种情况: 在队列线程关闭之后,调用出队操作-->处理tf.errors.OutOfRange错误53.053.053.053.053.053.053.053.053.053.0
更详细的内容你可以参考github中的源代码
阅读全文
1 0
- 6.1 Tensorflow笔记(基础篇):队列与线程
- TensorFlow 基础知识笔记之队列和线程
- 线程 与 队列 - 学习笔记
- 1.1 Tensorflow笔记(基础篇): 图与会话,变量
- tensorflow下的队列与线程(1)
- 7.3 TensorFlow笔记(基础篇):加载数据之从队列中读取
- TensorFlow 队列与多线程
- tensorflow-队列与多线程
- tensorflow基础学习笔记
- Tensorflow基础学习笔记
- 学习笔记TF049:TensorFlow 模型存储加载、队列线程、加载数据、自定义操作
- 7.1 TensorFlow笔记(基础篇):加载数据之预加载数据与填充数据
- 深度学习基础与TensorFlow实战(Chapter3笔记)
- tensorflow29《TensorFlow实战》笔记-01 TensorFlow基础
- 线程与消息队列
- 线程与消息队列
- 线程与消息队列
- 线程与消息队列
- AppStore审核、排名规则及常用优化方法。
- zookeeper基础命令
- HDU5410(01背包+完全背包)
- java定时器的几种用法
- 线程的概念A
- 6.1 Tensorflow笔记(基础篇):队列与线程
- javascript(三)
- 未能加载文件或程序集“Oracle.DataAccess
- Flight HDU
- raid0/1/5/6/(1/0)/(0/1)
- 数通平台软件:软件升级兼容性考虑
- Java中AWT、Swing与SWT三大GUI技术
- [USACO3.4.1]heritage
- Count the Colors (线段树,区间更新)