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多线程输入数据处理框架的更多相关文章

  1. TensorFlow多线程输入数据处理框架(四)——输入数据处理框架

    参考书 <TensorFlow:实战Google深度学习框架>(第2版) 输入数据处理的整个流程. #!/usr/bin/env python # -*- coding: UTF-8 -* ...

  2. TensorFlow多线程输入数据处理框架(三)——组合训练数据

    参考书 <TensorFlow:实战Google深度学习框架>(第2版) 通过TensorFlow提供的tf.train.batch和tf.train.shuffle_batch函数来将单 ...

  3. TensorFlow多线程输入数据处理框架(二)——输入文件队列

    参考书 <TensorFlow:实战Google深度学习框架>(第2版) 一个简单的程序来生成样例数据. #!/usr/bin/env python # -*- coding: UTF-8 ...

  4. Tensorflow多线程输入数据处理框架(一)——队列与多线程

    参考书 <TensorFlow:实战Google深度学习框架>(第2版) 对于队列,修改队列状态的操作主要有Enqueue.EnqueueMany和Dequeue.以下程序展示了如何使用这 ...

  5. tensorflow学习笔记——多线程输入数据处理框架

    之前我们学习使用TensorFlow对图像数据进行预处理的方法.虽然使用这些图像数据预处理的方法可以减少无关因素对图像识别模型效果的影响,但这些复杂的预处理过程也会减慢整个训练过程.为了避免图像预处理 ...

  6. 吴裕雄 python 神经网络——TensorFlow 输入数据处理框架

    import tensorflow as tf files = tf.train.match_filenames_once("E:\\MNIST_data\\output.tfrecords ...

  7. 吴裕雄--天生自然 pythonTensorFlow图形数据处理:输入数据处理框架

    import tensorflow as tf # 1. 创建文件列表,通过文件列表创建输入文件队列 files = tf.train.match_filenames_once("F:\\o ...

  8. 大数据处理框架之Strom:认识storm

    Storm是分布式实时计算系统,用于数据的实时分析.持续计算,分布式RPC等. (备注:5种常见的大数据处理框架:· 仅批处理框架:Apache Hadoop:· 仅流处理框架:Apache Stor ...

  9. x86汇编利用int 16h中断实现伪多线程输入

    x86汇编利用int 16h中断实现伪多线程输入 我们都知道,如果想让一个程序,同时又干这个,又干那个,最好的办法就是多线程.这个在高级语言里面已经用烂了. 但是,DOS是只有单线程的.我如果想让程序 ...

随机推荐

  1. logistic regression svm hinge loss

    二类分类器svm 的loss function 是 hinge loss:L(y)=max(0,1-t*y),t=+1 or -1,是标签属性. 对线性svm,y=w*x+b,其中w为权重,b为偏置项 ...

  2. ORACLE 账户解除锁定

    用pl/sql连接数据库发现账户被锁定.本以为管理员账户才能解锁.同其他账户登录也能解锁 pl/sql下执行命令 alter user   ****  account unlock ***处为待解锁的 ...

  3. 小程序登录 -41003: aes 小程序加密数据解密失败问题

    在微信小程的开发中,登录问题,一定要按照这样的顺序 1. 小程序请求login,拿到code 然后传给服务端:  2.服务端拿到code 到微信服务器拿到sessionKey :3.然后小程序调用ge ...

  4. 解决 Android sdk content loader 0%

    第一次遇到这种情况,真的很头痛,没办法 ,是问题就要解决,在网上找了一些方法,归纳了下来. 方法一(关闭后重启): 遇到Eclipse右下角一直显示“Android sdk content loade ...

  5. java的动态验证码单线设计

    1.java的动态验证码我这里将介绍两种方法: 一:根据java本身提供的一种验证码的写法,这种呢只限于大家了解就可以了,因为java自带的模式编写的在实际开发中是没有意义的,所以只供学习一下就可以了 ...

  6. 五、RegExp(正则表达式)篇

    正则表达式,只用记住: 0./pattern/igm   i--不区分大小写 g--找到所有相匹配的 m--多行匹配  可以只写其中一个  ps:/pattern/i (无视大小写) 1." ...

  7. 【转载】vue.js实现格式化时间并每秒更新显示功能示例

    引用:https://www.jb51.net/article/143351.htm 这篇文章主要介绍了vue.js实现格式化时间并每秒更新显示功能,结合实例形式分析了vue.js时间格式化显示与基于 ...

  8. Spring IoC的底层技术支持——Java反射机制

    我们知道,通过 new XmlClassPathApplicationContext("beans.xml")等方式即可启动容器.在容器启动时,Spring 根据配置文件的描述信息 ...

  9. PHP 序列化与反序列化简单理解

    序列化就是把保存在内存中的各种对象状态,保存起来,在需要的时候还原出来. string serialize ,产生一个可以储存的表示 mixed unserialize 从已储存的表示中创建php值( ...

  10. Xshell4 出现Linux中中文字符乱码问题

    Xshell5竟然收费了... 没办法只能用回Xshell4 但是不知道是版本不对还是在咋的 发现中文乱码,导致操作非常不方便 解决方案 LANG=zh_CN.big5 执行在终端执行上面的命令就可以 ...