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是只有单线程的.我如果想让程序 ...
随机推荐
- vue-resource+iview上传文件取消上传
vue-resource+iview上传文件取消上传 子组件: <template> <div class="upload-area-div"> <U ...
- iOS之一些实用的Demo
图像浏览及处理 FLAnimatedImage - gif播放处理的工具. CLImageEditor - 超强的图片编辑库,快速帮你实现旋转,防缩,滤镜等等一系列麻烦的事情. ios-image-f ...
- iOS Alamofire插件使用方法
let parameters = [ " ] Alamofire.request("http://110.185.104.100:8888/skproject/HvLogistic ...
- hdu_2067_小兔的棋盘
小兔的叔叔从外面旅游回来给她带来了一个礼物,小兔高兴地跑回自己的房间,拆开一看是一个棋盘,小兔有所失望.不过没过几天发现了棋盘的好玩之处.从起点(0,0)走到终点(n,n)的最短路径数是C(2n,n) ...
- 如何安全地跨窗体调用Timer控件 从一个窗体调用控制另外一个窗体的控件
具体的情况是Form1中有一个Timer2时钟,Timer2时钟事件弹出Warning窗体,点击Warning窗体上面的按钮,重新激活一下Form1中的Timer2.从而实现了从一个窗体调用另外一个窗 ...
- nginx: [error] open() "/var/run/nginx.pid" failed (2: No such file or directory)
解决办法: nginx nginx -s reload
- 在Vue项目里面使用d3.js
之前写一个 Demo里面 有些东西要使用d3实现一些效果 但是在很多论坛找资源都找不到可以在Vue里面使用D3.js的方法,npm 上面的D3相对来说 可以说是很不人性化了 完全没有说 在webpac ...
- ElasticSearch : 基础
#新建索引以及类型: PUT http://10.18.43.3:9200/test { "settings": { "number_of_shards": 3 ...
- Less Is More【少即是多】
Less Is More Adults understand what it feels like to be flooed with objects. 成年人知道被物品淹没的感觉. Why do w ...
- JAVA反射之 Field (属性)
主要方法: public static void main(String[] args) throws Exception { Class<?> clazz = Class.forName ...