Contents
TFRecord 是谷歌推荐的一种二进制文件格式,理论上它可以保存任何格式的信息。TFRecord的核心内容在于内部有一系列的Example,Example是Protocol Buffer协议下的消息体。(Protobuf是Google开源的一款类似于Json,XML数据交换格式,其内部数据是纯二进制格式,不依赖于语言和平台,具有简单,数据量小,快速等优点。
TFRecords文件包含了tf.train.Example 协议内存块(protocol buffer)(协议内存块包含了字段 Features)。我们可以写一段代码获取你的数据, 将数据填入到Example协议内存块(protocol buffer),再将协议内存块序列化为一个字符串, 并且通过tf.python_io.TFRecordWriter 写入到TFRecords文件。
从TFRecords文件中读取数据, 可以使用tf.TFRecordReader的tf.parse_single_example解析器。这个操作可以将Example协议内存块(protocol buffer)解析为张量。 在TFrecord中的数据都需要进行一个转化的过程,这个转化分成三种:
一般来讲我们的图片读进来以后是两种形式:
但是存储在TFrecord里面的不能是array的形式,所以我们需要利用tostring()将上面的矩阵转化成字符串,再通过tf.train.BytesList转化成可以存储的形式。
Protocol Buffer是一种结构化数据的数据存储格式(类似于 XML、Json )。
通过将结构化的数据进行串行化序列化,从而实现 数据存储 / RPC 数据交换的功能。
对比于 常见的 XML、Json 数据存储格式,Protocol Buffer有如下特点:
传输数据量大&网络环境不稳定的数据存储、RPC数据交换的需求场景,如即时IM(QQ,微信)的需求场景。
在TensorFlow官方github文档里面,有个example.proto的文件,这个文件详细说明了TensorFlow里面的example协议,这里我将简要叙述一下。
tensorflow的example包含的是基于key-value对的存储方法,其中key是一个字符串,其映射到的是feature信息,feature包含三种类型:
以上三种类型都是列表类型,意味着都能够进行拓展,但是也是因为这种弹性格式,所以在解析的时候,需要制定解析参数。在TensorFlow中,example是按照行读的,这个需要时刻记住,比如存储M×NM×N矩阵,使用ByteList存储的话,需要M×NM×N大小的列表,按照每一行的读取方式存放。
tf.train.Example协议内存块定义如下图:
基本上,一个Example包含一个features,features里面包含一些feature,每个feature都是由键值对组成的,其key是一个字符串,其value是上面提到的三种类型之一, FloatList,或者ByteList,或者Int64List。
protocol buffer 是通用的协议格式,对主流的编程语言都适用。所以这些 List 对应到 python 语言当中是列表,而对于 Java 或者 C/C++ 来说他们就是数组。
举个例子,一个 BytesList 可以存储 Byte 数组,因此像字符串、图片、视频等等都可以容纳进去。所以 TFRecord 可以存储几乎任何格式的信息。 值得注意的是,更具官方说明的文档来源于 Tensorflow的源码,里面有更加详细的定义及注释说明。
创建Example对象,示例代码如下:
#创建Example对象,并将Feature一一填充进去。
example = tf.train.Example(features=tf.train.Features(feature={
'name':_bytes_feature(name),
'shape':tf.train.Feature(int64_list=tf.train.Int64List(value=[shape[0],shape[1],shape[2]])),
'data':_bytes_feature(image_data)
}))
TFRecord文件并不是非用不可,但它确实是谷歌官方推荐的数据集文件格式。