【TensorFlow】TFRecord文件使用详解
Contents
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文件并不是非用不可,但它确实是谷歌官方推荐的数据集文件格式。
- 它特别适应于 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
相关文章
- linux .gz文件 解压缩命令的简单使用
- golang下文件锁的使用[通俗易懂]
- vue项目使用.env文件配置全局环境变量
- 如何使用Python对嵌套结构的JSON进行遍历获取链接并下载文件
- 【Android 安装包优化】Tint 着色器 ( 简介 | 布局文件中的 Tint 着色器基本用法 | 代码中使用 Tint 着色器添加颜色效果 )
- linux下使用shell 自动执行脚本文件详解程序员
- Java使用iText生成PDF文件详解编程语言
- 使用apathe的poi.jar读取Excel文件详解编程语言
- java使用poi读取excel文件代码示例详解编程语言
- Java 使用 NIO 方式读文件详解编程语言
- 使用FileUpload上传文件的主要Java代码详解编程语言
- 使用commons-fileupload实现文件上传详解编程语言
- java使用七牛云存储文件和图片详解编程语言
- Spring Boot(十七):使用Spring Boot上传文件详解编程语言
- 使用CG3Z向服务器添加文件时,报错:No physical path is configured for logical file name EHS_FTAPPL_2详解编程语言
- 使用 Linux 批量重命名文件(批量重命名linux)
- MySQL日志详解:读懂MySQL日志文件的作用和使用方法(mysql日志详解)
- 详解Linux CAP文件的作用及使用方法(linuxcap文件)
- Linux下查看文件连接信息:LSOF使用详解(linuxlsof)
- 如何使用Oracle导出DMP文件,步骤详解(oracle导出dmp文件)
- 使用MongoDB导入TXT文件: 简单步骤详解(mongodb导入txt)
- Linux下使用命令行新建文件(linux用命令创建文件)
- 使用MSSQL快速生成SQL文件(mssql生成sql文件)
- Oracle实现的文件共享服务(oracle 共享文件)
- 文件,需要安装使用(mysql不是可执行)
- 使用Deflate算法对文件进行压缩与解压缩的方法详解
- 使用php将某个目录下面的所有文件罗列出来的方法详解
- CFile与CStdioFile的文件读写使用方法详解
- Java使用jxl包写Excel文件适合列宽实现
- 使用Python进行稳定可靠的文件操作详解