Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >TensorFlow 队列与多线程的应用

TensorFlow 队列与多线程的应用

作者头像
chaibubble
发布于 2018-01-02 02:26:25
发布于 2018-01-02 02:26:25
1.7K00
代码可运行
举报
运行总次数:0
代码可运行

深度学习的模型训练过程往往需要大量的数据,而将这些数据一次性的读入和预处理需要大量的时间开销,所以通常采用队列与多线程的思想解决这个问题,而且TensorFlow为我们提供了完善的函数。

实现队列

Python中是没有提供直接实现队列的函数的,所以通常会使用列表模拟队列。 而TensorFlow提供了整套实现队列的函数和方法,在TensorFlow中,队列和变量类似,都是计算图上有状态的节点。操作队列的函数主要有:

FIFOQueue():创建一个先入先出(FIFO)的队列 RandomShuffleQueue():创建一个随机出队的队列 enqueue_many():初始化队列中的元素 dequeue():出队 enqueue():入队

下面是一个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import tensorflow as tf

q = tf.FIFOQueue(3,"int32")
init = q.enqueue_many(([0,1,2],))

x = q.dequeue()
y = x + 1
q_inc = q.enqueue([y]) 

with tf.Session() as sess:
     init.run()
     for a in range(5):
          v,a = sess.run([x,q_inc])
          print(v)

打印结果: 0 1 2 1 2 原理如下图:

多线程协同

TensorFlow为我们提供了多线程协同操作的类—tf.Coordinator,其函数主要有: should_stop():确定当前线程是否退出 request_stop():通知其他线程退出 join():等待所有线程终止 假设有五个线程同时在工作,每个线程自身会先判断should_stop()的值,当其返回值为True时,则退出当前线程;如果为Flase,也继续该线程。此时如果线程3发出了request_stop()通知,则其它4个线程的should_stop()将全部变为True,然后线程4自身的should_stop()也将变为True,则退出了所有线程。 下面是一段代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import tensorflow as tf
import numpy as np
import time
import threading

def MyLoop(coord,worker_id):
     while not coord.should_stop():
          if np.random.rand()<0.09:
               print('stoping from id:',worker_id)
               coord.request_stop()
          else:
               print('working from id:',worker_id)
          time.sleep(1)

coord = tf.train.Coordinator()
#声明5个线程
threads=[threading.Thread(target=MyLoop,args=(coord,i,)) for i in range(5)]
#遍历五个线程
for t in threads:  
     t.start()
coord.join(threads)       

打印结果: working from id: 0 working from id: 1 working from id: 2 working from id: 3 working from id: 4 stoping from id: 0

在第一轮遍历过程中,所有进程的should_stop()都为Flase,且随机数都大于等于0.09,所以依次打印了working from id: 0-5,再重新回到进程0时,出现了小于0.09的随机数,即进程0发出了request_stop()请求,进程1-4的should_stop()返回值全部为True(进程退出),也就无法进入while,进程0的should_stop()返回值也将为True(退出),五个进程全部退出。

多线程操作队列

前面说到了队列的操作,多线程协同的操作,在多线程协同的代码中让每一个线程打印自己的id编号,下面我们说下如何用多线程操作一个队列。 TensorFlow提供了队列tf.QueueRunner类处理多个线程操作同一队列,启动的线程由上面提到的tf.Coordinator类统一管理,常用的操作有: QueueRunner():启动线程,第一个参数为线程需要操作的队列,第二个参数为对队列的操作,如enqueue_op,此时的enqueue_op = queue.enqueue() add_queue_runner():在图中的一个集合中加‘QueueRunner’,如果没有指定的合集的话,会被添加到tf.GraphKeys.QUEUE_RUNNERS合集 start_queue_runners():启动所有被添加到图中的线程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import tensorflow as tf

#创建队列
queue = tf.FIFOQueue(100,'float')
#入队
enqueue_op = queue.enqueue(tf.random_normal([1]))
#启动5个线程,执行enqueue_op
qr = tf.train.QueueRunner( queue,[enqueue_op] * 5)
#添加线程到图
tf.train.add_queue_runner(qr)
#出队
out_tensor = queue.dequeue()

with tf.Session() as sess:
     coord = tf.train.Coordinator()
     threads=tf.train.start_queue_runners(sess=sess,coord=coord)
     for i in range(6):
          print(sess.run(out_tensor)[0])
     coord.request_stop()
     coord.join(threads)

打印结果: -0.543751 -0.712543 1.32066 0.2471 0.313005 -2.16349

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-06-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
TensorFlow中的多线程
TensorFlow提供两个类帮助实现多线程,一个是tf.train.Coordinator,另一个是tf.train.QueueRunner。Coordinator主要用来实现多个线程同时停止,QueueRunner用来创建一系列线程。 Coordinator 根据官方文档,Coordinator主要有三个方法: 1、tf.train.Coordinator.should_stop: returns True if the threads should stop. 2、tf.train.Coordinat
用户1332428
2018/03/07
1.6K0
TensorFlow中的多线程
TensorFlow基础(二)
而在tensorflow中提供多线程,并行的执行任务,队列(数据的共享),文件(tfrecords)的方式读取数据。来提高解析速度。
不断折腾
2019/09/23
7390
tensorflow读取数据-tfrecord格式
概述关于tensorflow读取数据,官网给出了三种方法: 1、供给数据:在tensorflow程序运行的每一步,让python代码来供给数据 2、从文件读取数据:建立输入管线从文件中读取数据 3、预加载数据:如果数据量不太大,可以在程序中定义常量或者变量来保存所有的数据。 这里主要介绍一种比较通用、高效的数据读取方法,就是tensorflow官方推荐的标准格式:tfrecord。 tfrecord数据文件 tfrecord数据文件是一种将图像数据和标签统一存储的二进制文件,能更好的利用内存,在tenso
用户1332428
2018/03/08
2.7K0
tensorflow学习笔记(四十二):输入流水线
ensorflow 如何读取数据 tensorflow有三种把数据放入计算图中的方式: 通过feed_dict 通过文件名读取数据:一个输入流水线 在计算图的开始部分从文件中读取数据 把数据预加载到一
ke1th
2018/01/02
1.3K0
tensorflow中协调器 tf.train.Coordinator
TensorFlow的Session对象是支持多线程的,可以在同一个会话(Session)中创建多个线程,并行执行。在Session中的所有线程都必须能被同步终止,异常必须能被正确捕获并报告,会话终止的时候, 队列必须能被正确地关闭。TensorFlow提供了两个类来实现对Session中多线程的管理:tf.Coordinator和 tf.QueueRunner,这两个类往往一起使用。
狼啸风云
2019/07/02
1.3K0
tensorflow中协调器 tf.train.Coordinator
深度学习与神经网络:调用数据集,完成应用(2)
在上一篇文章中,我们通过使用mnist上的图片和标签数据来去制作数据集,而今天这一篇文章我们将在反向传播过程中和测试过程中调用数据集. 一:反向传播获取文件(mnist_backward.py) 先上
云时之间
2018/07/11
3600
【技术分享】TFRecord 实践
对于数据量较小而言,可能一般选择直接将数据加载进内存,然后再分batch输入网络进行训练。但是,如果数据量较大,这样的方法就不适用了,因为太耗内存,所以这时最好使用 tensorflow 提供的队列 queue,也就是第二种方法从文件读取数据。对于一些特定的读取,比如csv文件格式,官网有相关的描述。而 TFRecords 是tensorflow 的内定标准形式,更加高效的读取方法。 Tensorflow 读取数据的三种方式:
腾讯云TI平台
2019/07/03
2.3K1
【技术分享】TFRecord 实践
tensorflow编程: Inputs and Readers
与 tf.placeholder 不同的是,这里如果 未 被feed_dict,并不会 打印报错,而是打印出 默认数据。
JNingWei
2018/09/28
7120
深度学习_1_Tensorflow_2_数据_文件读取
子线程读取数据 向队列放数据(如每次100个),主线程学习,不用全部数据读取后,开始学习
Dean0731
2020/05/08
8680
深度学习与神经网络:调用数据集,完成应用(2)
在上一篇文章中,我们通过使用mnist上的图片和标签数据来去制作数据集,而今天这一篇文章我们将在反向传播过程中和测试过程中调用数据集.
云时之间
2018/05/23
6753
TensorFlow多线程输入数据处理框
参考书 《TensorFlow:实战Google深度学习框架》(第2版) 一个简单的程序来生成样例数据。 #!/usr/bin/env python # -*- coding: UTF-8 -*- # coding=utf-8 """ @author: Li Tian @contact: 694317828@qq.com @software: pycharm @file: sample_data_produce1.py @time: 2019/2/3 21:46 @desc: 一个简单的程序来生成
py3study
2020/01/17
7880
深度学习_1_神经网络_3_验证码识别
​ N ------>[0.01,0.02,0.03.......] 概率 N------->[0,0,0,0,1.......] one-hot编码
Dean0731
2020/05/08
3230
Tensorflow读取数据(一)
数据和算法是深度学习最重要的两大块。而更基础的首先是要熟练掌握一个框架来支撑算法的执行。 我个人使用最多的是tensorflow平台。就从最基础的数据输入开始记录吧。
languageX
2021/01/26
1.2K0
TensorFlow-手写数字识别(二)
本篇文章在上篇TensorFlow-手写数字识别(一)的基础上进行改进,主要实现以下3点:
xxpcb
2020/08/04
8510
手把手教你完成图像分类实战——基于卷积神经网络的图像识别
在很多的项目中,都会用到图像识别技术。我在智能电子秤的项目中,就使用了简单的图像识别算法来完成对果蔬的分类(三分类)。 图像识别中,最常用的框架就是TensorFlow,我们今天就使用这个框架,手把手教学完成图像识别分类。 完成一个图像识别模块主要包括四步:
全栈程序员站长
2022/07/01
9890
手把手教你完成图像分类实战——基于卷积神经网络的图像识别
tf.FIFOQueue()
tf.FIFOQueue根据先进先出(FIFO)的原则创建一个队列。队列是Tensorflow的一种数据结构,每个队列的元素都是包含一个或多个张量的元组,每个元组都有静态的类型和尺寸。入列和出列可以支持一次一个元素,或一次一批元素。它继承于Tensorflow队列执行的基类tf.QueueBase。队列是Tensorflow计算图异步处理张量的重要对象。 初始化
狼啸风云
2019/07/02
1.1K0
tf API 研读4:Inputs and Readers
tensorflow中数据的读入相关类或函数: 占位符(Placeholders) tf提供一种占位符操作,在执行时需要为其提供数据data。 操作 描述 tf.placeholder(dtype, shape=None, name=None) 为一个tensor插入一个占位符 eg:x = tf.placeholder(tf.float32, shape=(1024, 1024)) tf.placeholder_with_default(input, shape, name=None)
MachineLP
2018/01/09
1.6K0
tf API 研读4:Inputs and Readers
实例介绍TensorFlow的输入流水线
在训练模型时,我们首先要处理的就是训练数据的加载与预处理的问题,这里称这个过程为输入流水线(input pipelines,或输入管道,[参考:https://www.tensorflow.org/performance/datasets_performance])。在TensorFlow中,典型的输入流水线包含三个流程(ETL流程):
机器学习算法工程师
2018/07/27
1.6K0
实例介绍TensorFlow的输入流水线
tf.train.batch 的偶尔乱序问题
我们将 csv 文件中的真实 Tensile 值放在第一列,将使用 tf.train.batch 函数得到的 Tensile 和 no 分别放在第二列和第三列
演化计算与人工智能
2020/08/14
6580
TensorFlow实例: 手写汉字识别
MNIST手写数字数据集通常做为深度学习的练习数据集,这个数据集恐怕早已经被大家玩坏了。识别手写汉字要把识别英文、数字难上很多。首先,英文字符的分类少,总共10+26*2;而中文总共50,000多汉字,常用的就有3000多。其次,汉字有书法,每个人书写风格多样。 本文目标是利用TensorFlow做一个简单的图像分类器,在比较大的数据集上,尽可能高效地做图像相关处理,从Train,Validation到Inference,是一个比较基本的Example, 从一个基本的任务学习如果在TensorFlow下
机器学习AI算法工程
2018/03/15
4.5K0
TensorFlow实例: 手写汉字识别
相关推荐
TensorFlow中的多线程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验