Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >tensorflow中协调器 tf.train.Coordinator

tensorflow中协调器 tf.train.Coordinator

作者头像
狼啸风云
修改于 2022-09-04 13:07:20
修改于 2022-09-04 13:07:20
1.3K00
代码可运行
举报
运行总次数:0
代码可运行

TensorFlow的Session对象是支持多线程的,可以在同一个会话(Session)中创建多个线程,并行执行。在Session中的所有线程都必须能被同步终止,异常必须能被正确捕获并报告,会话终止的时候, 队列必须能被正确地关闭。TensorFlow提供了两个类来实现对Session中多线程的管理:tf.Coordinator和 tf.QueueRunner,这两个类往往一起使用。

Coordinator类用来管理在Session中的多个线程,可以用来同时停止多个工作线程并且向那个在等待所有工作线程终止的程序报告异常,该线程捕获到这个异常之后就会终止所有线程。使用 tf.train.Coordinator()来创建一个线程管理器(协调器)对象。

QueueRunner类用来启动tensor的入队线程,可以用来启动多个工作线程同时将多个tensor(训练数据)推送入文件名称队列中,具体执行函数是 tf.train.start_queue_runners , 只有调用 tf.train.start_queue_runners 之后,才会真正把tensor推入内存序列中,供计算单元调用,否则会由于内存序列为空,数据流图会处于一直等待状态。

tf中的数据读取机制如下图:

  1. 调用 tf.train.slice_input_producer,从 本地文件里抽取tensor,准备放入Filename Queue(文件名队列)中;
  2. 调用 tf.train.batch,从文件名队列中提取tensor,使用单个或多个线程,准备放入文件队列;
  3. 调用 tf.train.Coordinator() 来创建一个线程协调器,用来管理之后在Session中启动的所有线程;
  4. 调用tf.train.start_queue_runners, 启动入队线程,由多个或单个线程,按照设定规则,把文件读入Filename Queue中。函数返回线程ID的列表,一般情况下,系统有多少个核,就会启动多少个入队线程(入队具体使用多少个线程在tf.train.batch中定义);
  5. 文件从 Filename Queue中读入内存队列的操作不用手动执行,由tf自动完成;
  6. 调用sess.run 来启动数据出列和执行计算;
  7. 使用 coord.should_stop()来查询是否应该终止所有线程,当文件队列(queue)中的所有文件都已经读取出列的时候,会抛出一个 OutofRangeError 的异常,这时候就应该停止Sesson中的所有线程了;
  8. 使用coord.request_stop()来发出终止所有线程的命令,使用coord.join(threads)把线程加入主线程,等待threads结束。

以上对列(Queue)和 协调器(Coordinator)操作示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding:utf-8 -*-
import tensorflow as tf
import numpy as np

# 样本个数
sample_num=5
# 设置迭代次数
epoch_num = 2
# 设置一个批次中包含样本个数
batch_size = 3
# 计算每一轮epoch中含有的batch个数
batch_total = int(sample_num/batch_size)+1

# 生成4个数据和标签
def generate_data(sample_num=sample_num):
    labels = np.asarray(range(0, sample_num))
    images = np.random.random([sample_num, 224, 224, 3])
    print('image size {},label size :{}'.format(images.shape, labels.shape))
    return images,labels

def get_batch_data(batch_size=batch_size):
    images, label = generate_data()
    # 数据类型转换为tf.float32
    images = tf.cast(images, tf.float32)
    label = tf.cast(label, tf.int32)

    #从tensor列表中按顺序或随机抽取一个tensor准备放入文件名称队列
    input_queue = tf.train.slice_input_producer([images, label], num_epochs=epoch_num, shuffle=False)

    #从文件名称队列中读取文件准备放入文件队列
    image_batch, label_batch = tf.train.batch(input_queue, batch_size=batch_size, num_threads=2, capacity=64, allow_smaller_final_batch=False)
    return image_batch, label_batch

image_batch, label_batch = get_batch_data(batch_size=batch_size)


with tf.Session() as sess:

    # 先执行初始化工作
    sess.run(tf.global_variables_initializer())
    sess.run(tf.local_variables_initializer())

    # 开启一个协调器
    coord = tf.train.Coordinator()
    # 使用start_queue_runners 启动队列填充
    threads = tf.train.start_queue_runners(sess, coord)

    try:
        while not coord.should_stop():
            print '************'
            # 获取每一个batch中batch_size个样本和标签
            image_batch_v, label_batch_v = sess.run([image_batch, label_batch])
            print(image_batch_v.shape, label_batch_v)
    except tf.errors.OutOfRangeError:  #如果读取到文件队列末尾会抛出此异常
        print("done! now lets kill all the threads……")
    finally:
        # 协调器coord发出所有线程终止信号
        coord.request_stop()
        print('all threads are asked to stop!')
    coord.join(threads) #把开启的线程加入主线程,等待threads结束
    print('all threads are stopped!')

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
************
((3, 224, 224, 3), array([0, 1, 2], dtype=int32))
************
((3, 224, 224, 3), array([3, 4, 0], dtype=int32))
************
((3, 224, 224, 3), array([1, 2, 3], dtype=int32))
************
done! now lets kill all the threads……
all threads are asked to stop!
all threads are stopped!

以上程序在 tf.train.slice_input_producer 函数中设置了 num_epochs 的数量, 所以在文件队列末尾有结束标志,读到这个结束标志的时候抛出 OutofRangeError 异常,就可以结束各个线程了。

如果不设置 num_epochs 的数量,则文件队列是无限循环的,没有结束标志,程序会一直执行下去。

转载地址: https://www.cnblogs.com/mtcnn/p/9411706.html

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深度学习_1_Tensorflow_2_数据_文件读取
子线程读取数据 向队列放数据(如每次100个),主线程学习,不用全部数据读取后,开始学习
Dean0731
2020/05/08
8130
tensorflow读取数据-tfrecord格式
概述关于tensorflow读取数据,官网给出了三种方法: 1、供给数据:在tensorflow程序运行的每一步,让python代码来供给数据 2、从文件读取数据:建立输入管线从文件中读取数据 3、预加载数据:如果数据量不太大,可以在程序中定义常量或者变量来保存所有的数据。 这里主要介绍一种比较通用、高效的数据读取方法,就是tensorflow官方推荐的标准格式:tfrecord。 tfrecord数据文件 tfrecord数据文件是一种将图像数据和标签统一存储的二进制文件,能更好的利用内存,在tenso
用户1332428
2018/03/08
2.7K0
Tensorflow读取数据(一)
数据和算法是深度学习最重要的两大块。而更基础的首先是要熟练掌握一个框架来支撑算法的执行。 我个人使用最多的是tensorflow平台。就从最基础的数据输入开始记录吧。
languageX
2021/01/26
1.1K0
TensorFlow中读取图像数据的三种方式
从tesorflow1.11之后,(大概是这个版本号),谷歌推出了tf.data模块来读取数据,甚至在tensorflow2.0中,取消了数据队列管道,所以我建议大家学习tf.data模块。未来我也会做详细的tf.data模块使用说明。
狼啸风云
2020/12/29
7870
基于tensorflow的图像处理(三) 多线程输入图像处理框架
虽然一个TFRecord文件中可以存储多个训练样例,但是当训练数据量较大时,可将数据分成多个TFRecord文件来提高处理效率。tensorflow提供了tf.train.match_filenames_once函数来获取符合一个正则表达式的所有文件,得到的文件列表可以通过tf.train.string_input_producer函数进行有效的管理。
狼啸风云
2019/07/01
1.2K0
基于tensorflow的图像处理(三) 多线程输入图像处理框架
tf.train.batch 的偶尔乱序问题
我们将 csv 文件中的真实 Tensile 值放在第一列,将使用 tf.train.batch 函数得到的 Tensile 和 no 分别放在第二列和第三列
演化计算与人工智能
2020/08/14
6180
TensorFlow-手写数字识别(二)
本篇文章在上篇TensorFlow-手写数字识别(一)的基础上进行改进,主要实现以下3点:
xxpcb
2020/08/04
7970
TensorFlow 组合训练数据(batching)
摘要总结:本文主要介绍了使用TensorFlow从TFRecord文件中读取数据,并将其组合成batch进行训练的过程。首先介绍了TensorFlow和TFRecord的基本概念,然后详细讲解了从TFRecord文件中读取数据的过程,包括使用TensorFlow的队列和线程进行数据读取和组合成batch的过程。最后通过一个例子演示了如何使用TensorFlow读取和组合成batch进行训练的过程。
chaibubble
2018/01/02
2.1K0
TensorFlow 组合训练数据(batching)
TensorFlow基础(二)
而在tensorflow中提供多线程,并行的执行任务,队列(数据的共享),文件(tfrecords)的方式读取数据。来提高解析速度。
不断折腾
2019/09/23
7160
tensorflow动态加载文件
如果把文件全部加载到内存中,对大数据量来说,是不可行的,tensorflow使用列队,通过多线程来操作队列进出。举例子来说明> tf.train.slice_input_producer是一个tensor生成器,作用是按照设定,每次从一个tensor列表中按顺序或者随机抽取出一个tensor放入文件名队列。 下面这个例子是将文件名加入到队列中,每次从列队中只能取出一个tensor,然后读取图片数据,还是频繁io操作, import tensorflow as tf import matplotlib.
用户1733462
2018/06/07
1.4K0
深度学习_1_神经网络_3_验证码识别
​ N ------>[0.01,0.02,0.03.......] 概率 N------->[0,0,0,0,1.......] one-hot编码
Dean0731
2020/05/08
3120
tf.train
1、tf.train.queue_runner.add_queue_runner函数
狼啸风云
2019/08/14
3.7K0
深度学习与神经网络:调用数据集,完成应用(2)
在上一篇文章中,我们通过使用mnist上的图片和标签数据来去制作数据集,而今天这一篇文章我们将在反向传播过程中和测试过程中调用数据集. 一:反向传播获取文件(mnist_backward.py) 先上
云时之间
2018/07/11
3460
深度学习实战篇之 ( 六) -- TensorFlow学习之路(三)
Geffery Hinton被称为“深度学习之父”、“神经网络先驱”、“AI教父”,他的名字响彻整个AI领域,他的一举一动,都是热点导向。以深度神经网络为代表的深度学习模型,在19世纪70年代进入寒潮以来,再次焕发出活力、得到学术界和工业界广泛关注,与他的贡献密不可分。
用户5410712
2022/06/01
3350
深度学习实战篇之 ( 六) -- TensorFlow学习之路(三)
深度学习与神经网络:调用数据集,完成应用(2)
在上一篇文章中,我们通过使用mnist上的图片和标签数据来去制作数据集,而今天这一篇文章我们将在反向传播过程中和测试过程中调用数据集.
云时之间
2018/05/23
6603
【技术分享】TFRecord 实践
对于数据量较小而言,可能一般选择直接将数据加载进内存,然后再分batch输入网络进行训练。但是,如果数据量较大,这样的方法就不适用了,因为太耗内存,所以这时最好使用 tensorflow 提供的队列 queue,也就是第二种方法从文件读取数据。对于一些特定的读取,比如csv文件格式,官网有相关的描述。而 TFRecords 是tensorflow 的内定标准形式,更加高效的读取方法。 Tensorflow 读取数据的三种方式:
腾讯云TI平台
2019/07/03
2.2K1
【技术分享】TFRecord 实践
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
美还是丑?这有一个CNN开发的颜值评分器 | 实战
在人工智能的发展越来越火热的今天,其中智能应用也在伴随着我们的生活,其中最具有代表性的便是图像识别,并且其中的应用比比皆是,如车站的人脸识别系统,交通的智能监控车牌号系统等等。而卷积神经网络作为图像识别的首选算法,对于图像的特征提取具有很好的效果,而TensorFlow作为Google的开源框架具有很好的结构化特征,而本篇文章将利用卷积神经网络算法对图像识别进行应用,开发出颜值评分器的功能。
AI科技大本营
2019/11/12
1.2K0
TensorFlow实例: 手写汉字识别
MNIST手写数字数据集通常做为深度学习的练习数据集,这个数据集恐怕早已经被大家玩坏了。识别手写汉字要把识别英文、数字难上很多。首先,英文字符的分类少,总共10+26*2;而中文总共50,000多汉字,常用的就有3000多。其次,汉字有书法,每个人书写风格多样。 本文目标是利用TensorFlow做一个简单的图像分类器,在比较大的数据集上,尽可能高效地做图像相关处理,从Train,Validation到Inference,是一个比较基本的Example, 从一个基本的任务学习如果在TensorFlow下
机器学习AI算法工程
2018/03/15
4.4K0
TensorFlow实例: 手写汉字识别
tf.session.run()单函数运行和多函数运行区别
这里我们分别使用两种不同的代码,读取 csv 文件中的数据。我们观察这两种方式读取的数据有什么不同。源程序文件下载[1]test_tf_train_batch.csv[2]
演化计算与人工智能
2020/08/14
1.1K0
相关推荐
深度学习_1_Tensorflow_2_数据_文件读取
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验