js打印线程id_TensorFlow 多线程!!!

cf56cfc49a94280b5173cb94cf9fedf2.png

多线程输入数据处理框架

为了避免图形预处理成为神经网络模型训练效率的瓶颈,为多线程体处理输入数据的框架

  • Tensorflow提供了tf.train.string_input_producer函数来有效管理原始输入文件列表
  • tf.train.shuffle_batch_join和tf.train.shuffle_batch函数,并比较不同函数的多线程并行方式

队列与多线程

队列和变量类似,都是计算图上状态的节点

对于变量来说,可以通过赋值操作来修改变量的取值。对于队列,修改队列的转肽的操作主要有 Enqueue、EnqueueMany和Dequeue

import 

Tensorflow提供了FIFOQueue和RandomShuffleQueue两种队列,以上code展示的是FIFOQueue,

  • FIFOQueue是先进先出队列
  • RandomShuffleQueue会将队列中元素打乱,每次出队列操作得到的是从当前队列中所有元素中随机选择的一个

Tensorflow 提供tf.Coordinator和tf.QueueRunner两个类来完成多线程协同的功能tf.Coordinator主要用于协同多个线程一起停止,并提供should_stop、request_stop和join三个函数。

  • 启动线程前,声明一个tf.Coordinator类,并将类传入到每个创建的线程中
  • 启动后需要一直查询tf.Coordinator类中提供的should_stop函数,返回True 时,该线程退出
  • every线程都可以通过调用request_stop来通知其他线程退出
  • 当某一线程调用request_stop函数之后,should_stop函数的返回值被设置为True ,其他线程同时停止

tf.Coordinator

next section will show how to use tf.Coordinator()

import 

range() vs xrange() in Python range() and xrange() are two functions that could be used to iterate a certain number of times in for loops in Python. In Python 3, there is no xrange , but the range function behaves like xrange in Python 2.If you want to write code that will run on both Python 2 and Python 3, you should use range().

range() – This returns a list of numbers created using range() function. xrange() – This function returns the generator object that can be used to display numbers only by looping. Only particular range is displayed on demand and hence called “lazy evaluation“.

Both are implemented in different ways and have different characteristics associated with them. The points of comparisons areReturn Type

  • Memory
  • Operation
  • UsageSpeed
  • Return Type
    range() returns – the list as return type. xrange() returns – xrange() object.
#接上代码

所有的线程启动之后,每个线程会打印个各自的ID,于是前面4行打印出了他们的ID。然后在暂停一秒之后,所有的线程又开始第二遍打印ID。此时有一个线程退出的条件达到,于是调用coord。request_stop函数来停止所有其他的线程。然后打印Stoping from id:4之后,可以看到有线程仍然在输出。这是因为这些线程已经执行完coord.should_stop的判断,于是输出自己的ID。但在下次判断后True后退出线程,于是不会再有输出

tf.QueueRunner

主要用于启动多个线程来操纵同一个队列,启动的这些线程可以通过tf.Coordinator类来统一管理。

show 如何使用tf.QueueRunner和tf.Coordinator来管理多线程队列操作

import 

输入文件队列

TensorFlow中的队列管理输入文件列表

假设所有的输入数据都已经整理成了TFRecord格式。

  • 虽然一个TFRecord文件中可以储存多个训练样例,但是当训练数据数量较大时,可以将数据分成多个TFRecord文件来提高处理效率
  • tf.train.match_filenames_once函数获取一个正则表达式的所有文件
  • 得到的文件列表可以通过tf.train.string_input_producer函数进行有效的管理
  • 使用初始化时提供的文件列表创建一个输入队列,输入队列中的原始的元素为文件列表中的所有文件(得到的文件列表可以通过tf.train.string_input_producer函数进行有效的管理)tf.train.string_input_producer函数会使用初始化时提供的文件列表创建一个输入队列
    1.设置shuffle参数,支持随机打乱文件列表出队的顺序,shuffle为True,文件在加入队列之前会被打乱顺序,所以出队的顺序也是随机的。(随机打乱文件顺序以及即入输入队列的过程会跑在单独的线程)
    2.输入队列会将队列中的文件均匀地分给不同的线程,不会出现处理重复的现象
    3.当一个输入队列中的所有文件都被处理完后,它会将初始化时提供的文件列表中的文件全部重新加入队列
    4.设置num_epochs参数来限制记载初始文件列表的最大轮数。所有都使用后,继续读取新文件则会,ERORR:OutOfRange的错误

生成样例

import 

tf.train.match_filenames_once和tf.train.string_input_producer使用方法

import 

组合样例数据(batching)

tf.train.batch和tf.train.shuffle_batch函数来将单个的样例组成batch的形式输出

这两个函数都会生成数列,队列的入队操作是生成单个样例的方法,而每个出队的得到的是一个把batch的样例(唯一区别是否会将数据顺序打乱)

以下展示两个函数的使用方法

import 

下面展示tf.train.shuffle_batch函数使用方法

#tf.train.batchd的样例来组合样例一样产生example和label

TensorFlow提供tf.train.batch和tf.shuffle.batch函数将单个样例组织成batch的形式输出。

import 

结果:

[0 0] [0 1]
[1 1] [0 1]
[0 0] [0 1]

输入数据处理框架完整代码

import 

以上代码输入数据处理的整个流程基本如下:

118a9b38972763e6e31077c145a69a5d.png

步骤:

  • 获取存储数据的文件列表;
  • 通过tf.train.string_input_producer函数,可以选择性将顺序打乱,并加入队列;(备注:因为函数会生成并维护一个输入文件队列,不同进程中的文件读取函数可以共享输入队列)
  • 预处理;(备注:预处理会通过tf.train.shuffle_batch提供多线程)
  • tf.train.shuffle_batch将处理好的单个输入样例整理成batch提供给神经网络。

TIP:

Deep Learning的模型训练都是基于Batch学习的。因此每次进行Gradient Update的时候并不需要一个完整的数据集,而是只需要一个Batch。如果使用tf record,Tensorflow并不会将10万个图片完全读入内存中,而是将自动优化每次的Batch提取,只从tf record中读取对应需要的Batch。因此强烈建议使用tf record,这可以大幅提升内存使用效率以及数据提取效率,总体大幅提升模型的训练效率

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值