标准TensorFlow格式

TensorFlow的训练过程其实就是大量的数据在网络中不断流动的过程,而数据的来源在官方文档[^1](API r1.2)中介绍了三种方式,分别是:

  • Feeding。通过Python直接注入数据。
  • Reading from files。从文件读取数据,本文中的TFRecord属于此类方式。
  • Preloaded data。将数据以constant或者variable的方式直接存储在运算图中。

当数据量较大时,官方推荐采用标准TensorFlow格式[^2](Standard TensorFlow format)来存储训练与验证数据,该格式的后缀名为tfrecord。官方介绍如下:

A TFRecords file represents a sequence of (binary) strings. The format is not random access, so it is suitable for streaming large amounts of data but not suitable if fast sharding or other non-sequential access is desired.

从介绍不难看出,TFRecord文件适用于大量数据的顺序读取。而这正好是神经网络在训练过程中发生的事情。


如何使用TFRecord文件

对于TFRecord文件的使用,官方给出了两份示例代码,分别展示了如何生成与读取该格式的文件。

生成TFRecord文件

第一份代码convert_to_records.py [^3]将MNIST里的图像数据转换为了TFRecord格式 。仔细研读代码,可以发现TFRecord文件中的图像数据存储在Feature下的image_raw里。image_raw来自于data_set.images,而后者又来自mnist.read_data_sets()。因此images的真身藏在mnist.py这个文件里。

mnist.py并不难找,在Pycharm里按下ctrl后单击鼠标左键即可打开源代码。

继续追踪,可以在mnist里发现图像来自extract_images()函数。该函数的说明里清晰的写明:

Extract the images into a 4D uint8 numpy array [index, y, x, depth].Args:f: A file object that can be passed into a gzip reader.Returns:data: A 4D uint8 numpy array [index, y, x, depth].Raises:ValueError: If the bytestream does not start with 2051.

很明显,返回值变量名为data,是一个4D Numpy矩阵,存储值为uint8类型,即图像像素的灰度值(MNIST全部为灰度图像)。四个维度分别代表了:图像的个数,每个图像行数,每个图像列数,每个图像通道数。

在获得这个存储着像素灰度值的Numpy矩阵后,使用numpy的tostring()函数将其转换为Python bytes格式[^4],再使用tf.train.BytesList()函数封装为tf.train.BytesList类,名字为image_raw。最后使用tf.train.Example()image_raw和其它属性一遍打包,并调用tf.python_io.TFRecordWriter将其写入到文件中。

至此,TFRecord文件生成完毕。

可见,将自定义图像转换为TFRecord的过程本质上是将大量图像的像素灰度值转换为Python bytes,并与其它Feature组合在一起,最终拼接成一个文件的过程。

需要注意的是其它Feature的类型不一定必须是BytesList,还可以是Int64List或者FloatList。

读取TFRecord文件

第二份代码fully_connected_reader.py [1]展示了如何从TFRecord文件中读取数据。

读取数据的函数名为input()。函数内部首先通过tf.train.string_input_producer()函数读取TFRecord文件,并返回一个queue;然后使用read_and_decode()读取一份数据,函数内部用tf.decode_raw()解析出图像的灰度值,用tf.cast()解析出label的值。之后通过tf.train.shuffle_batch()的方法生成一批用来训练的数据。并最终返回可供训练的imageslabels,并送入inference部分进行计算。

在这个过程中,有以下几点需要留意:

  1. tf.decode_raw()解析出的数据是没有shape的,因此需要调用set_shape()函数来给出tensor的维度。
  2. read_and_decode()函数返回的是单个的数据,但是后边的tf.train.shuffle_batch()却能够生成批量数据。
  3. 如果需要对图像进行处理的话,需要放在第二项提到的两个函数中间。

其中第2点的原理我暂时没有弄懂。从代码上看read_and_decode()返回的是单个数据,shuffle_batch接收到的也是单个数据,不知道是如何生成批量数据的,猜测与queue有关系。

所以,读取TFRecord文件的本质,就是通过队列的方式依次将数据解码,并按需要进行数据随机化、图像随机化的过程。


参考


  1. Github: fully_connected_reader.py ↩︎

转载于:https://www.cnblogs.com/jyxbk/p/7895313.html

TFRecords转化和读取相关推荐

  1. 由浅入深之Tensorflow(3)----数据读取之TFRecords

    由浅入深之Tensorflow(3)----数据读取之TFRecords 转载自http://blog.csdn.net/u012759136/article/details/52232266 原文作 ...

  2. TensorFlow高效读取数据的方法

    概述 最新上传的mcnn中有完整的数据读写示例,可以参考. 关于Tensorflow读取数据,官网给出了三种方法: 供给数据(Feeding): 在TensorFlow程序运行的每一步, 让Pytho ...

  3. Tensorflow中使用tfrecord,队列方式读取数据

    博客地址:https://blog.csdn.net/liangjun_feng/article/details/79698809 标准TensorFlow格式 有一种保存记录的方法可以允许你讲任意的 ...

  4. ISP【三】———— raw读取、不同格式图片差异

    part zero: 如何处理.raw格式数据,读取和转化 matlab读取raw图 (mark读取图片尺寸和位数均可设置,图片尺寸M,N,图片数据类型8bit,16bit改成uint16) clea ...

  5. Python+selenium 自动化-读取excel记录的脚本执行登陆操作实战演示

    我们可以用 excel 来记录自动化,然后读取 excel 来执行命令,excel 可以很方便直观的管理我们录入的自动化.下面给大家演示一下 Python+selenium 自动化的实例,读取 exc ...

  6. TensorFlow 教程 --进阶指南--3.4数据读取

    数据读取 TensorFlow程序读取数据一共有3种方法: 供给数据(Feeding): 在TensorFlow程序运行的每一步, 让Python代码来供给数据. 从文件读取数据: 在TensorFl ...

  7. TensorFlow中数据读取—如何载入样本

    考虑到要是自己去做一个项目,那么第一步是如何把数据导入到代码中,何种形式呢?是否需要做预处理?官网中给的实例mnist,数据导入都是写好的模块,那么自己的数据呢? 一.从文件中读取数据(CSV文件.二 ...

  8. php打开excel文件,PHP读取Excel文件的简单示例

    这篇文章主要为大家详细介绍了PHP读取Excel文件的简单示例,具有一定的参考价值,可以用来参考一下. 对PHP读取Excel文件感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! 涉及知识 ...

  9. 深度学习入门笔记(十二):深度学习数据读取

    欢迎关注WX公众号:[程序员管小亮] 专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具 ...

最新文章

  1. 动态修改迅雷的下载地址
  2. 【TensorFlow】TF-tf.nn.dropout
  3. cad在线转换_CAD转PDF批量转换怎么转?教你一次性操作,一看就会
  4. hadoop关联文件处理
  5. sublime text3 怎么配置、运行python_SublimeText3按ctrl+b执行python无反应
  6. 解决频率选择性衰落的措施_螺杆压缩机,振动怎么办?解决办法在这里
  7. 拓端tecdat|用SAS进行泊松,零膨胀泊松和有限混合Poisson模型分析
  8. python中如何生成项目帮助文档
  9. 开源OA协同办公平台使用教程:O2OA集成WPS
  10. Mac安装Python并使用GUI界面设计
  11. 【Python实例学习】用Python的xlsxwriter模块,进行Excel表格插入图标的操作
  12. Windows系统win10系统流程图软件推荐
  13. 关于send和recv在UDP的使用
  14. 如何从Docker容器内部获取Docker主机的IP地址
  15. ROUGE 简易安装教程
  16. 用于阿尔茨海默症分期早期检测的多模态深度学习模型
  17. win10打开文件夹速度慢怎么办
  18. 21、scratch教程-列表使用
  19. Erlang自动化编译组件说明
  20. 手把手教你用 Cocos Creator 实现《大炮英雄》

热门文章

  1. mysql从零开始自增id_MySQL从零开始 7-表约束之主键,自增长,唯一键
  2. 计算机说课如何做课件ppt,《我的新工具——计算机》说课课件.ppt
  3. 机器人学习--定位、建图和导航问题从古至今
  4. Allegro中元器件位号重排并反标回原理图
  5. 数据结构学习笔记(四):重识数组(Array)
  6. php的isset(),PHP isset()具有多个参数
  7. VC中实现弹出CEdit的气泡提示框
  8. VC控件自绘制三步曲
  9. python 字典处理_python 字典的处理
  10. c语言运算优先级记忆方法