TFRecords文件读写
https://blog.csdn.net/u012222949/article/details/72875281/
https://blog.csdn.net/chengshuhao1991/article/details/78656724
- 统一不同输入文件的框架
- 更好的利用内存,更方便复制和移动(TFRecord压缩的二进制文件, protocal buffer序列化)
- 用于将二进制数据和标签(训练的类别标签)数据存储在同一个文件中
Protocol Buffer 协议缓冲区
- tfrecord文件包含了tf.train.Example 协议缓冲区(protocol buffer,协议缓冲区包含了特征 Features)。可以写一段代码获取数据, 将数据填入到Example协议缓冲区(protocol buffer),将协议缓冲区序列化为一个字符串, 并且通过tf.python_io.TFRecordWriter class写入到TFRecords文件。
- 内部使用**“Protocol Buffer”二进制数据编码**方案,只要生成一次TFRecord,之后的数据读取和加工处理的效率都会得到提高。
输入函数:数据集导入,返回两个对象(字典、包含一个或多个标签的tensor)
建立TFRecord存储器
write
向文件中写入一个字符串(序列化的Example)记录(即一个样本)。
序列化的Example,通过Example.SerializeToString()来实现,作用是将Example中的map压缩为二进制,节约大量空间。
# 创建一个writer来写 TFRecords 文件
writer = tf.python_io.TFRecordWriter(train_filename)
read
# 定义一个 reader ,读取下一个 record
reader = tf.TFRecordReader()
_, serialized_example = reader.read(filename_queue)
# 解析读入的一个record
features = tf.parse_single_example(serialized_example, features=feature)
Example协议块
tf.train.Example(features = None)
写入tfrecords文件
一般用于数值、图像等有固定大小的数据,同时使用tf.train.Feature指定每个记录各特征的名称和数据类型
tf.train.SequenceExample
一般用于文本、时间序列等没有固定长度大小的数据
tf.train.Features(feature = None)
构造每个样本的信息键值对
tf.train.Feature(**options)
options可以选择如下三种格式数据:
bytes_list = tf.train.BytesList(value = [Bytes])
int64_list = tf.train.Int64List(value = [Value])
float_list = tf.trian.FloatList(value = [Value])
读取
数据读取四种方式:
- 预先把所有数据加载进内存
- 在每轮训练中使用原生Python代码读取一部分数据,然后使用feed_dict输入到计算图
- 利用Threading和Queues从TFRecord中分批次读取数据
- 使用Dataset API
tf.parse_single_example(serialized,features=None,name= None)
解析一个单一的Example原型
serialized : 标量字符串的Tensor,一个序列化的Example,文件经过文件阅读器之后的value
features :字典数据,key为读取的名字,value为FixedLenFeature
return : 一个键值对组成的字典,键为读取的名字
tf.FixedLenFeature(shape,dtype)
shape : 输入数据的形状,一般不指定,为空列表
dtype : 输入数据类型,与存储进文件的类型要一致,类型只能是float32,int 64, string
return : 定长的Tensor (即使有零的部分也存储)
tf.VarLenFeature()
返回的是一个不定长的sparse tensor,用于处理可变长度的输入,在处理c t c 问题时,会用到tf.VallenFeature解析存储在tfrecord中的label。
tf.data.TFRecordDataset(input_file) # 定义来源:导入数据集(以TFRecord格式存储)
协议块
用于描述机器学习模型功能的协议消息训练或推理。
有三种基本的功能类型:字节,float,int64
功能包含可能包含零个或多个值的列表(基本值BytesList,FloatList,Int64List)。
功能按名称分为类别和功能消息,包含从名称到功能的映射。