Tensorflow多线程输入数据处理框架
Tensorflow提供了一系列的对图像进行预处理的方法,但是复杂的预处理过程会减慢整个训练过程,所以,为了避免图像的预处理成为训练神经网络效率的瓶颈,Tensorflow提供了多线程处理输入数据的框架!
下面将一一阐述多线程处理输入数据的理论及Tensorflow的源代码!
1 队列和多线程
首先来介绍Tensorflow中定义队列的方式,在Tensorflow中,可以定义FIFOQueue和RandomShuffleQueue两种类型的队列,FIFO顾名思义是先入先出型队列,而RandomShuffleQueue就是随机读出的操作,RandomShufleQueue操作在训练过程中的作用很大,可以随机的从数据集中取出数据,提高鲁棒性
tensorflow中,队列和变量类似,都是计算图上有状态的节点,其他的状态节点可以修改他们的状态,对于一个变量来说,赋值操作可以修改变量的取值,而对于队列来说,修改队列的相应状态主要有三个方法:
1Enquene Enqueue的操作相当于进入队列的操作,也就是想要将数据插入到队列中时,调用此方法,假如已经定义好队列q,那么调用q.enqueue(([55]))就可以将数据写入队列
2 EnqueneMany q.EnqueneMany方法是一次性写入多个数据!举例:q.EnqueneMany(([34,55]))
3 Dequeue 此方法相当于从队列中调出数据的操作, x = q.dequeue()
队列的作用不仅仅是一种数据结构,它可以提供一种多线程的机制,提高数据的读取存储速度,比如多线程可以同时向一个队列中写元素,或者同时从一个队列中读取元素,多线程并行处理数据,提高数据预处理的速度就是Tensorflow提供的解决上述瓶颈问题的方案!
既然是多线程处理,那么必须需要某个交通指挥官来协调处理多线程的工作,没错,协调-coordinator,tensorflow提供了一个tf.Coordinator类和tf.QueueRunner类来完成多线程工作状态的管理和启动!
Coordinator提供了三个函数:1 should_stop 2 request_stop 3 join 来进行线程的管理操作,在每个线程启动之前,都需要先定义一个coordinator类然后当做参数传入到线程里面去,表明接管本线程的所有操作,线程在启动运行的过程中不断的查询should_stop的状态,一旦发现should_stop变成True,那么该线程就必须得退出,同样,每一个启动的线程都可以调用request_stop函数来通知其他线程退出,下面给出一段使用这两个类来操作线程的代码:
import tensorflow as tf
import numpy as np
import threading
import time def MyLooP(coord,worker_id): while not coord.should_stop(): if np.random.rand() < 0.1
print("Stoping form id: %d\n" %worker_id)
coord.request_stop() else :
print("Working on id : %d\n" %worker_id)
time.sleep(1) coord = tf.train.coordinator() threads = [ threading.Thread(target = MyLooP,args=(coord,i,)) for i in xrange(5)] for t in threads: t.start() coord.join(threads) #等待所有线程退出 #运行以上程序,得到结果如下:
#working on id : 0
#working on id : 1
#working on id : 2
#working on id : 4
#working on id : 3
#working on id : 0
#stoping on id : 4
#working on id : 1
如上面程序描述的,首先定义了一个MyLoop函数,接受coord和workerid两个参数,当coord.should_stop != True的时候,产生一个随机数,如果随机数小于0.1,那么对应的这个进程就会去申请request_stop()函数,通知其他的所有进程结束!
否则的话就打印当前进程的workerid,接下来定义了协调器类的实例coordinator()和五个进程,进程id分别是0-4,之后启动所有的进程等待某个进程的request_stop(),最后调用一个coord.join()来等待所有进程合理的退出,从运行的结果中我们
我们可以看出,working on id :0,1,2,4,3五个进程分别启动完成,然后重新进入MyLoop中继续执行,然后working on id:0, 突然进程4在执行的过程中它随机生成数小于0.1,这导致进程4会去申请request.stop(),从而导致五个进程查询should_stop全部变成了True,于是5个进程便全部结束自身进程,可以看到最后一行仍然有working on id:1打印出来,实际上是因为在进程4申请Request_stop的过程中,进程1已经完成了判断进入到了下一条else中,所以它仍然可以打印出来,但是再一次循环之前查询should_stop的时候就执行结束进程的相关操作了!
未完待续.......
Tensorflow多线程输入数据处理框架的更多相关文章
- TensorFlow多线程输入数据处理框架(四)——输入数据处理框架
参考书 <TensorFlow:实战Google深度学习框架>(第2版) 输入数据处理的整个流程. #!/usr/bin/env python # -*- coding: UTF-8 -* ...
- TensorFlow多线程输入数据处理框架(三)——组合训练数据
参考书 <TensorFlow:实战Google深度学习框架>(第2版) 通过TensorFlow提供的tf.train.batch和tf.train.shuffle_batch函数来将单 ...
- TensorFlow多线程输入数据处理框架(二)——输入文件队列
参考书 <TensorFlow:实战Google深度学习框架>(第2版) 一个简单的程序来生成样例数据. #!/usr/bin/env python # -*- coding: UTF-8 ...
- Tensorflow多线程输入数据处理框架(一)——队列与多线程
参考书 <TensorFlow:实战Google深度学习框架>(第2版) 对于队列,修改队列状态的操作主要有Enqueue.EnqueueMany和Dequeue.以下程序展示了如何使用这 ...
- tensorflow学习笔记——多线程输入数据处理框架
之前我们学习使用TensorFlow对图像数据进行预处理的方法.虽然使用这些图像数据预处理的方法可以减少无关因素对图像识别模型效果的影响,但这些复杂的预处理过程也会减慢整个训练过程.为了避免图像预处理 ...
- 吴裕雄 python 神经网络——TensorFlow 输入数据处理框架
import tensorflow as tf files = tf.train.match_filenames_once("E:\\MNIST_data\\output.tfrecords ...
- 吴裕雄--天生自然 pythonTensorFlow图形数据处理:输入数据处理框架
import tensorflow as tf # 1. 创建文件列表,通过文件列表创建输入文件队列 files = tf.train.match_filenames_once("F:\\o ...
- 大数据处理框架之Strom:认识storm
Storm是分布式实时计算系统,用于数据的实时分析.持续计算,分布式RPC等. (备注:5种常见的大数据处理框架:· 仅批处理框架:Apache Hadoop:· 仅流处理框架:Apache Stor ...
- x86汇编利用int 16h中断实现伪多线程输入
x86汇编利用int 16h中断实现伪多线程输入 我们都知道,如果想让一个程序,同时又干这个,又干那个,最好的办法就是多线程.这个在高级语言里面已经用烂了. 但是,DOS是只有单线程的.我如果想让程序 ...
随机推荐
- BZOJ2659: [Beijing wc2012]算不出的算式(数学)
Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1575 Solved: 939[Submit][Status][Discuss] Descriptio ...
- 今天看到的一篇文章:一位资深程序员大牛给予Java初学者的学习路线建议
一位资深程序员大牛给予Java初学者的学习路线建议 持续学习!
- Linux下通过uptime判断负载情况
[root@localhost ~]# uptime 18:34:12 up 5:30, 1 user, load average: 0.00, 0.01, 0.05 load average后面的三 ...
- React中的全选反选问题
全选反选问题 1.在state里维护一个数组,例如showArr:[] 2.绑定点击事件的时候将当前这个当选按钮的index加进来 <span className='arrow' onClick ...
- (转载)jsp的内部方法jspInit(),_jspService(),jspDestroy()
jspInit(){}:jsp Page被初始化的时候调用该方法,并且该方法仅在初始化时执行一次,所以可以在这里进行一些初始化的参数配置等一次性工作,由作者创建jspDestroy(){}:jsp P ...
- PHP中有关IPV4 和IPV6地址转换以及其它一些常见问题
这里主要介绍一下 IPV4 / IPV6 在 PHP / MySQL 中如何转换.以及中间容易碰到的一些问题. 首先介绍两个函数: ip2long:将 IPV4 的字符串互联网协议转换成长整型数字 i ...
- 强化记忆之php
php 输出的区分 新手摸索道路,有说不对的地方,还请多多包涵. echo 能够输出一个以上的字符串,也能输出html标签 print 一次只能接受一个字符串(区分与echo),也能输出html标签 ...
- python3 练习题100例 (二十七)列表元素改写
题目内容: 输入一个列表alist,要求列表中的每个元素都为正整数且不超过10: 将列表中的奇数变为它的平方,偶数除以2后打印新的列表(新的列表中所有元素仍都为整数). 可以使用以下实现列表alist ...
- while,格式化输出
1. while循环: while 条件: 代码块(循环体) num=1 while num<=5: print(num) num+=1 break:结束循环;停止当前本层循环 continue ...
- Python3爬虫(六) 解析库的使用之Beautiful Soup
Infi-chu: http://www.cnblogs.com/Infi-chu/ Beautiful Soup 借助网页的结构和属性等特性来解析网页,这样就可以省去复杂的正则表达式的编写. Bea ...