真锋
永远保持一颗学习和专注的心
嵌入式视觉

【TensorFlow】TFRecord文件使用详解

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对象,示例代码如下:

#创建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文件并不是非用不可,但它确实是谷歌官方推荐的数据集文件格式。

  1. 它特别适应于 Tensorflow ,或者说它就是为 Tensorflow 量身打造的。
  2. 因为 Tensorflow开发者众多,统一训练时数据的文件格式是一件很有意义的事情。也有助于降低学习成本和迁移成本。

参考资料

  • https://blog.csdn.net/u010223750/article/details/70482498
  • https://mp.weixin.qq.com/s/33VN74QluG9ZkHmwck85qA
  • https://blog.csdn.net/aptentity/article/details/68228071
赞赏
更多干货文章,欢迎关注我的微信公众号-嵌入式视觉。

发表回复

textsms
account_circle
email

  • harley博主

    自己评论,哈哈。

    4年前 回复

嵌入式视觉

【TensorFlow】TFRecord文件使用详解
TFRecord文件概述 TFRecord 是谷歌推荐的一种二进制文件格式,理论上它可以保存任何格式的信息。TFRecord的核心内容在于内部有一系列的Example,Example是Protocol Buffer协议下的消息体…
扫描二维码继续阅读
2018-11-10