前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【TensorFlow】TFRecord文件使用详解

【TensorFlow】TFRecord文件使用详解

作者头像
嵌入式视觉
发布2022-09-05 13:21:48
1.6K0
发布2022-09-05 13:21:48
举报
文章被收录于专栏:嵌入式视觉

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

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

  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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • TFRecord文件概述
  • Protocol Buffer数据存储格式
    • 1,作用
      • 2,特点
        • 3,应用场景
        • Example协议内存块理解
        • 使用TFRecord文件的原因
        • 参考资料
        相关产品与服务
        对象存储
        对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档