Contents
- 1 TFRecord文件概述
- 2 Protocol Buffer数据存储格式
- 2.1 1,作用
- 2.2 2,特点
- 2.3 3,应用场景
- 3 Example协议内存块理解
- 4 使用TFRecord文件的原因
- 5 参考资料
TFRecord文件概述
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中的数据都需要进行一个转化的过程,这个转化分成三种:
- int64
- float
- Bytes
一般来讲我们的图片读进来以后是两种形式:
- tf.image.decode_jpeg 解码图片读取成 (width,height,channels)的矩阵,这个读取的方式和cv2.imread以及ndimage.imread一样。
- tf.image.convert_image_dtype 会将读进来的上面的矩阵归一化,将图像转化为实数类型。一般来讲我们都要进行这个归一化的过程,归一化的好处是方便后续处理。
但是存储在TFrecord里面的不能是array的形式,所以我们需要利用tostring()将上面的矩阵转化成字符串,再通过tf.train.BytesList转化成可以存储的形式。
Protocol Buffer数据存储格式
Protocol Buffer是一种结构化数据的数据存储格式(类似于 XML、Json )。
1,作用
通过将结构化的数据进行串行化序列化,从而实现 数据存储 / RPC 数据交换的功能。
- 序列化: 将数据结构或对象转换成 二进制串的过程。
- 反序列化:将在序列化过程中所生成的二进制串 转换成 数据结构或者对象 的过程。
2,特点
对比于 常见的 XML、Json 数据存储格式,Protocol Buffer有如下特点:
3,应用场景
传输数据量大&网络环境不稳定的数据存储、RPC数据交换的需求场景,如即时IM(QQ,微信)的需求场景。
Example协议内存块理解
在TensorFlow官方github文档里面,有个example.proto的文件,这个文件详细说明了TensorFlow里面的example协议,这里我将简要叙述一下。
tensorflow的example包含的是基于key-value对的存储方法,其中key是一个字符串,其映射到的是feature信息,feature包含三种类型:
- BytesList:字符串列表
- FloatList:浮点数列表
- Int64List:64位整数列表
以上三种类型都是列表类型,意味着都能够进行拓展,但是也是因为这种弹性格式,所以在解析的时候,需要制定解析参数。在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对象,示例代码如下:
代码语言:javascript复制#创建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文件的原因
TFRecord文件并不是非用不可,但它确实是谷歌官方推荐的数据集文件格式。
- 它特别适应于 Tensorflow ,或者说它就是为 Tensorflow 量身打造的。
- 因为 Tensorflow开发者众多,统一训练时数据的文件格式是一件很有意义的事情。也有助于降低学习成本和迁移成本。
参考资料
- https://blog.csdn.net/u010223750/article/details/70482498
- https://mp.weixin.qq.com/s/33VN74QluG9ZkHmwck85qA
- https://blog.csdn.net/aptentity/article/details/68228071