Tensorflow入门(2)——深度学习框架Tesnsflow 线程+队列+IO操作 文件读取案例

目录

  • 一、二、Tesnsflow入门 & 环境配置 & 认识Tensorflow
  • 三、线程与队列与IO操作
    • 1.队列
      • 实例:完成一个出队列、+1、入队列操作(同步操作)
    • 2.队列管理器 创建线程
    • 3.线程协调器 管理线程
      • 案例:通过队列管理器来实现变量加1,入队,主线程出队列的操作,观察效果?(异步操作)
    • 4.文件读取流程
      • 1.文件读取API-文件队列构造
      • 2.文件读取API-文件阅读器
      • 3.文件读取API-文件内容解码器
      • 4.开启线程操作
      • 5.管道读端批处理
      • 案例:CSV文件读取
    • 5.图片文件


一、二、Tesnsflow入门 & 环境配置 & 认识Tensorflow

Tensorflow入门(1)——深度学习框架Tesnsflow入门 & 环境配置 & 认识Tensorflow

在这里插入图片描述

三、线程与队列与IO操作

1.队列

在训练样本的时候,希望读入的训练样本时有序的
• tf.FIFOQueue 先进先出队列,按顺序出队列
• tf.RandomShuffleQueue 随机出队列

在这里插入图片描述

FIFOQueue(capacity, dtypes, name=‘fifo_queue’)
创建一个以先进先出的顺序对元素进行排队的队列

  • capacity:整数。可能存储在此队列中的元素数量的上限
  • dtypes:DType对象列表。长度dtypes必须等于每个队列元素中的张量数,dtype的类型形状,决定了后面进队列元素形状
  • method:
      dequeue(name=None):出队列
      enqueue(vals, name=None):入队列
      enqueue_many(vals, name=None):vals列表或者元组:同时把许多数据放入队列,返回一个进队列操作
      size(name=None):队列的size

实例:完成一个出队列、+1、入队列操作(同步操作)

import tensorflow as tf
# tensorflow当中,运行操作有依赖性
# 1、首先定义队列
# 2、定义一些读数据,取数据的过程 ,  取数据,+1 ,入队列

# 1\定义队列
Q = tf.FIFOQueue(3, tf.float32)
# 放入数据
enq_many = Q.enqueue_many([[0.1,0.2,0.3],])# 列表

# 2\处理数据,取数据,+1,入队列
out_q = Q.dequeue()
data = out_q + 1
en_q = Q.enqueue(data)

with tf.Session() as sess:
    # 初始化队列
    sess.run(enq_many)

    # 处理数据
    for i in range(100):
        sess.run(en_q)# tensorflow当中,运行操作有依赖性
    # 训练数据
    for i in range(Q.size().eval()):
        print(sess.run(Q.dequeue()))

在这里插入图片描述

2.队列管理器 创建线程

在这里插入图片描述

tf.train.QueueRunner(queue, enqueue_ops=None)
创建一个QueueRunner

  • queue:A Queue
  • enqueue_ops:添加线程的队列操作列表,[]*2,指定两个线程
  • create_threads(sess, coord=None,start=False):创建线程来运行给定会话的入队操作
      start:布尔值,如果True启动线程;如果为False调用者必须调用start()启动线程
      coord:线程协调器,后面线程管理需要用到
      return:

3.线程协调器 管理线程

在这里插入图片描述

tf.train.Coordinator()
线程协调员,实现一个简单的机制来协调一组线程的终止
request_stop() 
should_stop() 检查是否要求停止
join(threads=None, stop_grace_period_secs=120)  
等待线程终止
return:线程协调员实例

案例:通过队列管理器来实现变量加1,入队,主线程出队列的操作,观察效果?(异步操作)

import tensorflow as tf
# 模拟异步 子线程:存入样本 ,主线程:读取样本
# 1、定义一个队列,1000
Q = tf.FIFOQueue(1000, tf.float32)
# 2、定义子线程要做的事情 循环 值 +1 ,放入队列中
var = tf.Variable(0.0)
# 不能用data = var + 1
#实现一个自增, tf.assign_add
# data = tf.assign_add(var, tf.constant(1.0))
data = tf.assign_add(var , tf.constant(1.0))
en_q = Q.enqueue(data)

# 3、定义队列管理器 op,指定多少个子线程 以及 子线程该干什么
qr = tf.train.QueueRunner(Q, enqueue_ops=[en_q] * 2)

# 初始化变量 OP
init_op = tf.global_variables_initializer()

with tf.Session() as sess:
    # 初始化变量
    sess.run(init_op)
    # 开启线程管理器
    coord = tf.train.Coordinator()

    # 开启真正子线程
    threads = qr.create_threads(sess, coord=coord ,start=True) # 指定老大是coord

    # 主线程,不断读取数据训练
    for i in range(300):
        print(sess.run(Q.dequeue()))
    # 回收你
    coord.request_stop()
    coord.join(threads) # 听老大的话

4.文件读取流程

在这里插入图片描述

在这里插入图片描述

1.文件读取API-文件队列构造

在这里插入图片描述

tf.train.string_input_producer(string_tensor , shuffle=True)
将输出字符串(例如文件名)输入到管道队列

string_tensor	 含有文件名的1阶张量
num_epochs : 过几遍数据,默认无限过数据
return :       具有输出字符串的队列

2.文件读取API-文件阅读器

在这里插入图片描述

根据文件格式,选择对应的文件阅读器
class tf.TextLineReader
阅读文本文件逗号分隔值(CSV)格式 , 默认按行读取
return:读取器实例

tf.FixedLengthRecordReader(record_bytes)
要读取每个记录是固定数量字节的二进制文件
record_bytes:整型,指定每次读取的字节数
return:读取器实例

tf.TFRecordReader
读取TfRecords文件

有一个共同的读取方法:read(file_queue):从队列中指定数量内容
返回一个Tensors元组(key文件名字,value默认的内容(行,字节))

3.文件读取API-文件内容解码器

在这里插入图片描述

由于从文件中读取的是字符串,需要函数去解析这些字符串到张量
tf.decode_csv(records,record_defaults=None,field_delim = None,name = None)

  • 将CSV转换为张量,与tf.TextLineReader搭配使用
    records:tensor 型字符串,每个字符串是csv中的记录行
    field_delim : 默认分割符”,”
    record_defaults :参数决定了所得张量的类型,并设置一个值在输入字符串中缺少使用默认值,如

    tf.decode_raw(bytes,out_type,little_endian = None,name = None)
  • 将字节转换为一个数字向量表示,字节为一字符串类型的张量,与函数tf.FixedLengthRecordReader搭配使用,二进制读取为uint8格式

4.开启线程操作

在这里插入图片描述

tf.train.start_queue_runners(sess=None,coord=None)
  收集所有图中的队列线程,并启动线程
  sess:所在的会话中
  coord:线程协调器
  return:返回所有线程队列

5.管道读端批处理

在这里插入图片描述

tf.train.batch(tensors,batch_size,num_threads = 1,capacity = 32,name=None)
读取指定大小(个数)的张量
  tensors:可以是包含张量的列表
  batch_size:从队列中读取的批处理大小
  num_threads:进入队列的线程数
  capacity:整数,队列中元素的最大数量
  return:tensors
tf.train.shuffle_batch(tensors,batch_size,capacity,min_after_dequeue,num_threads=1,)
  乱序读取指定大小(个数)的张量
  min_after_dequeue:留下队列里的张量个数,能够保持随机打乱

案例:CSV文件读取

在这里插入图片描述

import tensorflow as tf
import os
def csvread(filelist):
    '''
    读取CSV文件
    :param filelist: 文件路径+名字的列表
    :return: 读取的内容
    '''
    # 2\构造文件队列
    file_queue = tf.train.string_input_producer(filelist)
    # 3\构造CSV阅读器读取队列数据(按照一行)
    reader = tf.TextLineReader()
    key , value = reader.read(file_queue)
    # 4\对每行数据进行解码
    # record_defaults: 指定每一个样本的每一列的类型,指定默认值
    records = [["None"],[4.0]] #指定两列的默认值为字符串和float
    example, label = tf.decode_csv(value, record_defaults=records) #有两列,两个参数接受
    # 5\想要读取多个数据,就需要批量处理
    # 批处理大小,跟队列,数据的数量没有影响,只决定这批次读取多少数据
    example_batch ,label_batch= tf.train.batch([example, label],batch_size=9,num_threads = 1,capacity = 9)


    return example_batch ,label_batch

if __name__ == '__main__':
    # 1\找到文件,放入列表  路径+名字  放入列表当中
    file_name = os.listdir("./data/csvdata/")
    filelist = [os.path.join("./data/csvdata/" , file) for file in file_name]
    example_batch,label_batch = csvread(filelist)

    # 开启会话运行结果
    with tf.Session() as sess:
        # 定义一个线程协调器
        coord = tf.train.Coordinator()
        # 开启读取文件的线程
        threads = tf.train.start_queue_runners(sess, coord=coord)
        # 打印读取的内容
        print(sess.run([example_batch,label_batch]))

        #回收子线程
        coord.request_stop()
        coord.join(threads)  # 听老大的话

5.图片文件

在这里插入图片描述

图像读取器
  tf.WholeFileReader
  将文件的全部内容作为值输出的读取器
  return:读取器实例
  read(file_queue):输出将是一个文件名(key)和该文件的内容(值)

图像解码器
  tf.image.decode_jpeg(contents)
  将JPEG编码的图像解码为uint8张量
  return:uint8张量,3-D形状[height, width, channels]
  tf.image.decode_png(contents)将PNG编码的图像解码为uint8或uint16张量
  return:张量类型,3-D形状[height, width, channels]

缩小图片
  tf.image.resize_images(images, size)
  images:4-D形状[batch, height, width,   channels]或3-D形状的张量[height, width, channels]的图片数据
  size:1-D int32张量:new_height, new_width,图像的新尺寸返回4-D格式或者3-D格式图片

import tensorflow as tf
import os

def picread(filelist):
    """
    读取狗图片并转换成张量
    :param filelist: 文件路径+ 名字的列表
    :return: 每张图片的张量
    """
    # 1、构造文件队列
    file_queue = tf.train.string_input_producer(filelist)

    # 2、构造阅读器去读取图片内容(默认读取一张图片)
    reader = tf.WholeFileReader()
    key, value = reader.read(file_queue)
    print(value)

    # 3、对读取的图片数据进行解码
    image = tf.image.decode_jpeg(value)
    print(image)

    # 5、处理图片的大小(统一大小)
    image_resize = tf.image.resize_images(image, [200, 200])
    print(image_resize)

    # 注意:一定要把样本的形状固定 [200, 200, 3],在批处理的时候要求所有数据形状必须定义
    image_resize.set_shape([200, 200, 3])
    print(image_resize)

    # 6、进行批处理
    image_batch = tf.train.batch([image_resize], batch_size=20, num_threads=1, capacity=20)
    print(image_batch)
    return image_batch

if __name__ == '__main__':
    # 1\找到文件,放入列表  路径+名字  放入列表当中
    file_name = os.listdir("./data/dog/")
    filelist = [os.path.join("./data/dog/" , file) for file in file_name]
    image_batch = picread(filelist)

    # 开启会话运行结果
    with tf.Session() as sess:
        # 定义一个线程协调器
        coord = tf.train.Coordinator()
        # 开启读取文件的线程
        threads = tf.train.start_queue_runners(sess, coord=coord)
        # 打印读取内容
        print(sess.run([image_batch]))
        #回收子线程
        coord.request_stop()
        coord.join(threads)  # 听老大的话

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/37917.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实操:用Flutter构建一个简单的微信天气预报小程序

​ 微信小程序是一种快速、高效的开发方式,Flutter则是一款强大的跨平台开发框架。结合二者,可以轻松地开发出功能丰富、用户体验良好的微信小程序。 这里将介绍如何使用Flutter开发一个简单的天气预报小程序,并提供相应的代码示例。 1. 准备…

10.25UEC++/小试牛刀(笨鸟先飞案例)

1.思路整理: 如何入手? 角色可能是每个游戏的最重要的部分,所以一般可以先从角色入手,如果游戏很复杂,可以进行拆分设计。 蓝图创建地图: 创建默认Pawn: 编写GameMode默认构造函数:…

【机器人模拟-02】 模拟移动机器人设置里程计

一、说明 在本教程中,我将向您展示如何设置移动机器人的测程。本教程是“机器人模拟”指南中的第二个教程。测量位移是仿真中的重要内容,设置测程的官方教程在此页面上,但我将逐步引导您完成整个过程。 您可以在此处获取此项目的完整代码。让我们开始吧! 二、ROS 2 中的里程…

dede编辑器修改成纯文本编辑器的方法

我在做优秀啦网站大全的时候需要的正文内容都不需要设置什么文字样式,所以我需要把编辑器上的工具全部取消掉,包括会员投稿中的编辑器工具栏全部取消掉或者屏蔽隐藏掉,所以我需要把DEDE编辑器修改成纯文本编辑器的方法如下:如图&a…

【Docker】Docker高级网络(NetWork)

【Docker】Docker高级网络(NetWork) 文章目录 【Docker】Docker高级网络(NetWork)1. 概述2. 网络2.1 网桥类型2.2 创建网络自定义桥2.3 查看所有网络2.4 查看特定网络的细节2.5 删除特定网络2.6 多个容器使用指定网络 参考文档:高级网络配置 Docker – 从入门到实践…

力扣小技巧:如何用最简单的方式实现小写字母转换

本篇博客会讲解力扣“709. 转换成小写字母”的解题思路,这是题目链接。 本题的解法非常简单,只需利用tolower函数即可。这个函数的作用是将所有大写字母转换为小写字母,而对其他字符不做任何改变。 char * toLowerCase(char * s){// 把字符串…

Spring接收前端传递数据的方式

搭建项目 然后点击下一步完成即可搭建成功 在pom文件中导入lombok的jar包,帮助我们快速创建实体类 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.16</version> </dependency&…

外包软件定制开发中质量控制

引言 在外包软件定制开发项目中&#xff0c;确保交付的软件质量符合预期是至关重要的。由于外包团队通常是独立于企业的&#xff0c;他们可能没有对企业的业务需求和标准有深入的了解。因此&#xff0c;质量控制成为一个重要的挑战。本文将探讨外包软件定制开发中常见的质量控…

ubuntu安装单个redis服务

1.apt-get install redis-server 使用lighthouse用户这样操作会报与权限有关的错误&#xff0c; 改成使用root账号操作 2.安装完成后&#xff0c;Redis服务器会自动启动&#xff0c;查看进程是否正常启动 ps -axu|grep redis redis 18689 0.1 0.4 40136 6860 ? …

【深度学习】受限玻尔兹曼机 (RBM) 初学者指南

一、说明 受限玻尔兹曼机&#xff08;Restricted Boltzmann Machine&#xff0c;RBM&#xff09;是一种基于能量模型的人工神经网络。它只有一个隐层&#xff0c;将输入层和隐层中的每个神经元互相连接&#xff0c;但不同层的神经元之间没有连接。RBM是一种无向的概率图模型&am…

解决win11系统下vivado使用RTL分析闪退、小蓝熊easy anti chat无法启动问题

最近在接触使用vivado时被这个软件庞大的包体和繁多的报错搞得焦头烂额&#xff0c;经过多次尝试&#xff0c;我解决了两个困扰我许久的关乎软件正常使用的问题&#xff0c;将解决办法分享给大家。 一.RTL analysis运行闪退 这个问题关系到程序的正常使用&#xff0c;主要发生…

9.带你入门matlab假设检验(matlab程序)

1.简述 函数 ztest 格式 h ztest(x,m,sigma) % x为正态总体的样本&#xff0c;m为均值μ0&#xff0c;sigma为标准差&#xff0c;显著性水平为0.05(默认值) h ztest(x,m,sigma,alpha) %显著性水平为alpha [h,sig,ci,zval] ztest(x,m,sigma,alpha,tail) %sig为观察…

Pytorch深度强化学习1-3:策略评估与贝尔曼期望方程详细推导

目录 0 专栏介绍1 从一个例子出发2 回报与奖赏3 策略评估函数4 贝尔曼期望方程5 收敛性证明 0 专栏介绍 本专栏重点介绍强化学习技术的数学原理&#xff0c;并且采用Pytorch框架对常见的强化学习算法、案例进行实现&#xff0c;帮助读者理解并快速上手开发。同时&#xff0c;辅…

油猴脚本-Bilibili剧场模式仿Youtube

对比某个不存在的视频网站&#xff08;YouTube&#xff09;&#xff0c;以及B站的播放模式&#xff0c;普通模式以及网页全屏之间都有一个“中间档”&#xff0c;油管的叫 剧场模式&#xff0c;B站的叫 宽屏模式。 剧场模式 宽屏模式 相比之下&#xff0c;还是更喜欢油管的剧…

高并发的哲学原理(六)-- 拆分网络单点(下):SDN 如何替代百万人民币的负载均衡硬件

上一篇文章的末尾&#xff0c;我们利用负载均衡器打造了一个五万 QPS 的系统&#xff0c;本篇文章我们就来了解一下负载均衡技术的发展历程&#xff0c;并一起用 SDN&#xff08;软件定义网络&#xff09;技术打造出一个能够扛住 200Gbps 的负载均衡集群。 负载均衡发展史 F5 …

网络协议与攻击模拟-17-DNS协议-报文格式

二、DNS 查询 客户机想要访问www.baidu.com&#xff0c;根据自己的 TCP / IP 参数&#xff0c;向自己的首选 DNS 服务器发送 DNS 请求 首选 DNS 收到客户机的请求后&#xff0c;会去查询自己的区域文件&#xff0c;找不到www.baidu.com的 IP 地址信息&#xff08;将请求转发到…

【论文阅读】TransCAM: Transformer Attention-based CAM Refinement for WSSS

分享一篇阅读的用于弱监督分割的论文 论文标题&#xff1a; TransCAM: Transformer Attention-based CAM Refinement for Weakly Supervised Semantic Segmentation 作者信息&#xff1a; 代码地址&#xff1a; https://github.com/liruiwen/TransCAM Abstract 大多数现有…

mybatis双重foreach实现遍历map中的两个list数组

文章目录 实现背景&#xff1a;前端传值的格式Debug断点调试java如何解析json对象第一步 JSONArray.fromObject()第二步 遍历jsonArray第三步 mybatis双重foreach foreach标签说明最终效果 实现背景&#xff1a; 前端传值时可能会有多个字段传递过来&#xff0c;需要后台将这多…

SpringBoot快速实践 --Ⅰ

文章目录 启动一个SpringBoot项目如何替换内嵌容器玩转SpringBoot配置全局异常处理过滤器拦截器使用Lombok简洁代码使用IDEA HTTP Client进行接口调试 启动一个SpringBoot项目 如果你觉得使用官网来创建太慢了&#xff0c;那你直接把以前项目的依赖粘过来就行了&#xff1a; …

《银行法律法规》三、银行管理——2、公司治理、 内部控制与合规管理

第二章 公司治理、 内部控制与合规管理 第一节 公司治理 考点1 银行公司治理概述★★ 商业银行公司治理是指股东大会、 董事会、 监事会、 高级管理层、 股东及其他利益相关者之间的相互关系&#xff0c; 包括组织架构、 职责边界、 履职要求等治理制衡机制&#xff0c; 以…