1、队列和线程
2、文件读取
3、图片处理
1、队列与队列管理器
2、线程和协调器
——在训练样本的时候,希望读入的训练样本时有序的
——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)
——
——
分析:当数据量很大时,入队操作从硬盘中读取数据,放入内存中,
主线程需要等待入队操作完成,才能进行训练。会话里可以运行多个
线程,实现异步读取。
——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:
通过队列管理器来实现变量加1,入队,主线程出队列的操作,观察效果?
(异步操作)
分析:这时候有一个问题就是,入队自顾自的去执行,在需要的出
队操作完成之后,程序没法结束。需要一个实现线程间的同步,终
止其他线程。
——tf.train.Coordinator()
—— 线程协调员,实现一个简单的机制来协调一
——组线程的终止
——
——request_stop()
——should_stop() 检查是否要求停止
——join(threads=None, stop_grace_period_secs=120)
——等待线程终止
——
——return:线程协调员实例
——
1、文件读取流程
2、文件读取API
3、文件读取案例
——tf.train.string_input_producer(string_tensor,
—— ,shuffle=True)
——将输出字符串(例如文件名)输入到管道队列
——
——string_tensor 含有文件名的1阶张量
——num_epochs:过几遍数据,默认无限过数据
——return:具有输出字符串的队列
——根据文件格式,选择对应的文件阅读器
——class tf.TextLineReader
——阅读文本文件逗号分隔值(CSV)格式,默认按行读取
——return:读取器实例
——
——tf.FixedLengthRecordReader(record_bytes)
——要读取每个记录是固定数量字节的二进制文件
——record_bytes:整型,指定每次读取的字节数
——return:读取器实例
——
——tf.TFRecordReader
——读取TfRecords文件
——有一个共同的读取方法:
——read(file_queue):从队列中指定数量内容
——返回一个Tensors元组(key文件名字,value默认的内容(行,字节))
——由于从文件中读取的是字符串,需要函数去解析这些字符串到张量
——
——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格式
——tf.train.start_queue_runners(sess=None,coord=None)
—— 收集所有图中的队列线程,并启动线程
——sess:所在的会话中
——coord:线程协调器
——return:返回所有线程队列
——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:留下队列里的张量个数,能够保持随机打乱
1、文件简单读取
2、CIFAR-10二进制数据读取
CIFAR-10二进制数据读取
1、图像基本知识
2、图像读取API
3、 TFRecords分析、存取
——三要素:长度、宽度、通道数
三通道,RGB
指定3-D张量:
长度
通道数
宽度
目的:
1、增加图片数据的统一性
2、所有图片转换成指定大小
3、缩小图片数据量,防止增加开销
操作:
1、缩小图片大小
——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格式图片
狗图片读取
——图像读取器
——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]
——
1、构造图片文件队列
2、构造图片阅读器
3、读取图片数据
4、处理图片数据
——TFRecords是Tensorflow设计的一种内置文件格式,是一种二进制文件,
——它能更好的利用内存,更方便复制和移动
——
——为了将二进制数据和标签(训练的类别标签)数据存储在同一个文件中
——文件格式:*.tfrecords
——
——
——写入文件内容:Example协议块
——1、建立TFRecord存储器
——tf.python_io.TFRecordWriter(path)
——写入tfrecords文件
——path: TFRecords文件的路径
——return:写文件
——
——method
——write(record):向文件中写入一个字符串记录
——
——close():关闭文件写入器
注:字符串为一个序列化的Example,Example.SerializeToString()
——2、构造每个样本的Example协议块
——tf.train.Example(features=None)
——写入tfrecords文件
——features:tf.train.Features类型的特征实例
——return:example格式协议块
——
——tf.train.Features(feature=None)
——构建每个样本的信息键值对
——feature:字典数据,key为要保存的名字,
——value为tf.train.Feature实例
——return:Features类型
——
——tf.train.Feature(**options)
——**options:例如
——bytes_list=tf.train. BytesList(value=[Bytes])
——int64_list=tf.train. Int64List(value=[Value])
——
——tf.train. Int64List(value=[Value])
——tf.train. BytesList(value=[Bytes])
——tf.train. FloatList(value=[value])
——
——
——
——
——
——同文件阅读器流程,中间需要解析过程
——
——解析TFRecords的example协议内存块
——tf.parse_single_example(serialized,features=None,name=None)
——解析一个单一的Example原型
——serialized:标量字符串Tensor,一个序列化的Example
——features:dict字典数据,键为读取的名字,值为FixedLenFeature
——return:一个键值对组成的字典,键为读取的名字
——tf.FixedLenFeature(shape,dtype)
——shape:输入数据的形状,一般不指定,为空列表
——dtype:输入数据类型,与存储进文件的类型要一致
——类型只能是float32,int64,string
——
1、构造存储器
2、构造每一个样本的Example
3、写入序列化的Example
1、构造TFRecords阅读器
2、解析Example
3、转换格式,bytes解码