上篇文章中我梳理一下在TensorFlow中几种不同类型数据读取的流程,但是没有具体说到TFRecords这种文件类型,这篇文章就来具体梳理这一文件格式。
TFRecords是TensorFlow中的设计的一种内置的文件格式,它是一种二进制文件,优点有如下几种:
- 统一不同输入文件的框架
- 它是更好的利用内存,更方便复制和移动(TFRecord压缩的二进制文件, protocal buffer序列化)
- 是用于将二进制数据和标签(训练的类别标签)数据存储在同一个文件中
一、TFRecords存储
在将其他数据存储为TFRecords文件的时候,需要经过两个步骤:
- 建立TFRecord存储器
- 构造每个样本的Example模块
1、建立TFRecord存储器
tf.python_io.TFRecordWriter(path)
- 写入tfrecords文件
- path : TFRecords文件的路径
- return : 写文件
- 方法:
- write(record):向文件中写入一个字符串记录(即一个样本)
- close() : 关闭文件写入器
注:此处的字符串为一个序列化的Example,通过Example.SerializeToString()
来实现,它的作用是将Example中的map压缩为二进制,节约大量空间。
2、构造每个样本的Example协议块
message Example {
Features features = 1;
};
message Features {
map<string, Feature> feature = 1;
};
message Feature {
oneof kind {
BytesList bytes_list = 1;
FloatList float_list = 2;
Int64List int64_list = 3;
}
};
上面这段代码即为Example协议块的规则,详解如下:
(1)tf.train.Example(features = None)
- 写入tfrecords文件
- features : tf.train.Features类型的特征实例
- return : example协议格式块
(2)tf.train.Features(feature = None)
- 构造每个样本的信息键值对
- feature : 字典数据,key为要保存的名字,value为tf.train.Feature实例
- return : Features类型
(3)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])
(4)将图片数据转化为TFRecords的例子:
对每一个样本,都做如下的处理:
example = tf.train.Example(feature = tf.train.Features(feature = {
"image":tf.train.Feature(bytes_list=tf.train.BytesList(value=[image(bytes)]))
"label":tf.train.Feature(int64_list=tf.train.Int64List(value=[label(int)]))
}))
二、TFRecords读取方法
1.流程:
和文件阅读器的流程基本相同,只是中间多了一步解析过程