开发者学堂课程【深度学习框架 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 :线程协调员实例