文件读取通用流程|学习笔记

简介: 快速学习文件读取通用流程

开发者学堂课程【深度学习框架 TensorFlow 入门文件读取通用流程学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/773/detail/13552


文件读取通用流程


内容介绍:

一、读取数据的方式

二、文件读取流程

三、线程操作


一、读取数据的方式

有三种获取数据到 TensorFlow 程序的方法:

1. QueueRunner :基于队列的输入管道从 TensorFlow 图形开头的文件中读取数据。

2. Feeding :运行每一秒时, Python 代码提供数据。

3.预加载数据: TensorFlow 图中的张量包含所有数据(对于小数据集)。


二、文件读取流程

多线程 + 队列

第一阶段 构造文件名队列

方便我们快速高效地读取这组文件,先把文件名读取进来,在这过程中做了一个 Randim Shuffle (随机打乱)工作。

第二阶段 读取与解码

读取器 Reader 可以从上一步拿到的文件名队列的文件中读取数据,按照一个样本为一个单位读取。

不同数据类型的样本不一样,例如读取图片样本就是一张图片,读取二进制文件样本就是某一个固定字节长度的二进制。

根据文件类型的不同进行相应的解码,在读取不同文件的时候有细微的不同,最关键的不同在于读取与解码。

第三阶段 批处理

将解码的样本放入批处理队列中,处理后传给训练模型。

手动开启线程

注:这些操作需要启动运行这些队列操作的线程,以使我们在进行文件读取的工程中能够顺利进行入队出队操作。

(1)构造文件名队列

将需要读取的文件的文件名放入文件名队列。

tf.train.string_input_producer(string_tensor,shuffle=True)

 string_tensor :含有文件名+路径的1阶张量,传进来的列表会转换为1阶张量

 shuffle 默认打乱文件名顺序

 num_epochs :可以设置过几遍数据,默认无限过数据,直到满足设定的批处理大小为止

 return 文件队列

(2)读取与解码

1)读取文件内容

阅读器默认每次只读一个样本。

具体来说:文本文件默认一次读取一行 图片文件默认一次读取一张图片 二进制文件一次读取指定字节数(最好是一个样本的字节数) TFRecords 默认一次读取一个 example

tf.TextLineReader :

阅读文本文件逗号分隔值( CSV )格式,默认桉行读取

 return :读取器实例

tf.WholeFileReader :用于读取图片文件

 return :读取器实例

tf.FixedLengthRecordReader(record_bytes) :二进制文件

要读取每个记录是固定数量字节的二进制文件

 record_bytes :整型,指定每次读取(一个样本)的字节数

 return :读取器实例

tf.TFRecordReader :读取 TFRecords 文件

 return :读取器实例

1.它们有共同的读取方法: read(file_queue) ,并且都会返回一个Tensors元组( key 文件名字, value 默认的内容(一个样本))

2.由于默认只会读取一个样本,所以如果想要进行批处理,需要使用 tf.train.batch 或 tf.train.shuffle_batch 进行批处理操作,便于之后指定每批次多个样本的训练。

2)内容解码

读取不同类型的文件,也应该对读取到的不同类型的内容进行相对应的解码操作,解码成统一的 Tensor 格式

tf.decode_csv :解码文本文件内容

tf.image.decode_jpeg(contents)

将 JPEG 编码的图像解码为 uint8张量

 return : uint8张量,3-D形状[height,width,hannels]

tf.image.decode_png(contents)

将 PNG 编码的图像解码为 uint8张量

return :张量类型,3-D形状[height,width,hannels]

tf.decode_raw :解码二进制文件内容

与 tf.FixedLengthRecordReader 搭配使用,二进制读取为 uint8类型

解码阶段,默认所有的内容都解码成 tf.uint8类型,如果之后需要转成指定类型则可使用 tf.cast() 进行相应转换。

(3)批处理

解码之后,可以直接获取默认的一个样本内容了,但如果想要获取多个样本,需要加入到新的队列进行批处理。

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


三、线程操作

以上用到的队列都是 tf.train.QueueRunner 对象。

每个 QueueRunner 都负责一个阶段, tf.train.start_queue_runners 函数会要求图中的每个 QueueRunner 启动它的运行队列操作的线程。(这些操作需要在会话中开启)

tf.train.start_queue_runners(sess=None,coord=None)

收集图中所有的队列线程,默认同事启动线程

 sess :所在的会话

 coord :线程协调器

 return :返回所有线程

tf.train.Coordinator()

线程协调员,对线程进行管理和协调

 request_stop():请求停止

 should_stop():询问是否结束

 join(threads=None,stop_grace_period_secs=120):回收线程

 return :线程协调员实例

相关文章
|
3月前
|
C语言
C 语言文件处理全攻略:创建、写入、追加操作解析
在 C 语言中,您可以通过声明类型为 FILE 的指针,并使用 fopen() 函数来创建、打开、读取和写入文件:
86 0
|
Java 数据库连接 API
流程定义资源文件下载
流程定义资源文件下载
|
10月前
|
XML C# 数据格式
【C#编程最佳实践 四】XML配置文件编写与读取实践
【C#编程最佳实践 四】XML配置文件编写与读取实践
183 0
|
程序员 iOS开发 C++
如何用C++做文件和流
如何用C++做文件和流
|
网络协议 程序员 测试技术
管道的注意事项和细节(2)|学习笔记
快速学习管道的注意事项和细节(2),使用 select 可以解决从管道取数据的阻塞问题【案例演示】 我们在管道读取数据的时候要 close 管道,如果没有关闭,这个时候他会阻塞,而且会发生死锁,但有些情况如想在不想关闭的情况下也不被阻塞的话,我们就要使用 select
80 0
管道的注意事项和细节(2)|学习笔记
|
网络协议 测试技术 Go
管道的注意事项和细节(3)|学习笔记
快速学习管道的注意事项和细节(3)
59 0
|
网络协议 测试技术 Go
管道的注意事项和细节(1)|学习笔记
快速学习管道的注意事项和细节(1)
72 0
|
Python
【通用文件操作】文件自动整理
今天我们就带大家来实现一下文件自动整理的操作。在我们日常生活中,文件总是杂乱无章的,这个时候就需要我们整理一下。但是文件太多的话整理起来是非常麻烦的,因此我们今天就来用Python实现文件的自动整理。
122 0
|
SQL 存储 JSON