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. HDU 1159 Common Subsequence(裸LCS)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Jav ...

  2. JDBC jar包

    密码qiij https://pan.baidu.com/share/init?surl=oBfMwQ6rd9t6VNjIluF1qw

  3. 搭建基本的React Native开发环境

    步骤如下: 1.安装HomeBrew,命令如下: 在终端输入命令:$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Home ...

  4. Java秒杀系统方案优化 高性能高并发实战(已完成)

    1:商品列表 2:商品详情判断是否可以开始秒杀,未开始不显示秒杀按钮显示倒计时,开始显示秒杀按钮,同时会显示验证码输入框以及验证码图片,当点击秒杀按钮的时候会首先判断验证码是否正确,如果正确会返回一个 ...

  5. window/linux下获取文件MD5

    MD5消息摘要算法(英语: MD5 Message-Digest Algorithm), 主要用于确保信息传输过程的一致性校验.   首先介绍两个工具: window: WinMD5Free Linu ...

  6. 【原创】如何治疗使用python中re模块group、groups与findall分组匹配后产生的“眩晕反应”

      转载请注明出处:https://www.cnblogs.com/oceanicstar/p/9244783.html   直接先上例子 >>> re.search('(book+ ...

  7. Python日常运维脚本

    1    扫描Windows系统CPU.内存.磁盘利用率 1.1    实现代码 #!usr/bin/env python #-*- coding:utf-8 _*- ""&quo ...

  8. 【HCNE题型自我考究】

      H3CNE题目归结 制定标准 组织: 802.1X协议起源于标准的无线局域网协议802.11.主要目的是为了解决有线局域网用户的接入认证问题. 426.一个包含有华为等多厂商设备的交换网络,其VL ...

  9. [转]Nginx伪静态配置和常用Rewrite伪静态规则集锦

    Nginx伪静态配置和常用Rewrite伪静态规则集锦 作者: 字体:[增加 减小] 类型:转载 时间:2014-06-10 我要评论 伪静态是一种可以把文件后缀改成任何可能的一种方法,如果我想把ph ...

  10. PHP 进阶篇:面向对象的设计原则,自动加载类,类型提示,traits,命名空间,spl的使用,反射的使用,php常用设计模式 (麦子学员 第三阶段)

    以下是进阶篇的内容:面向对象的设计原则,自动加载类,类型提示,traits,命名空间,spl的使用,反射的使用,php常用设计模式 ================================== ...