【小白学PyTorch】17 TFrec文件的创建与读取
【新闻】:机器学习炼丹术的粉丝的人工智能交流群已经建立,目前有目标检测、医学图像、时间序列等多个目标为技术学习的分群和水群唠嗑的总群,欢迎大家加炼丹兄为好友,加入炼丹协会。微信:cyx645016617.
参考目录:
本文的代码已经上传公众号后台,回复【PyTorch】获取。
第一次接触到TFrec文件,我也是比较蒙蔽的其实:
可以看到文件是.tfrec
后缀的,而且先记住这个文件是186.72MB大小的。
1 为什么用tfrec文件
正常情况下我们用于训练的文件夹内部往往会存着成千上万的图片或文本等文件,这些文件通常被散列存放。这种存储方式有一些缺点:
- 占用磁盘空间;
- 一个一个读取文件消耗时间
而tfrec格式的文件存储形式会很合理的帮我们存储数据,核心就是tfrec内部使用Protocol Buffer的二进制数据编码方案,这个方案可以极大的压缩存储空间。
之前我们知道一个tfrec文件100多M,这是因为这个tfrec文件内存储了很多的图片,类似于压缩,对tfrec解压缩后可以获取到一部分的数据集,当我们把全部的rfrec文件都解压缩后,可以获取到全部的数据集。
值得一提的是,rfrec文件内除了可以存储图片,还可以存储其他的数据,比方说图片的label。字符串,float类型等都可以转换成二进制的方法,所以什么数据类型基本上都可以存储到rfrec文件内,从而简化读取数据的过程。
2 tfrec文件的内部结构
tfrec文件时tensorflow的数据集存储格式,tensorflow可以高效的读取和处理这些数据集,因此我见过有的数据集因为是tfrec文件,所以用TF读取数据集,然后用pytorch训练模型。
之前提到了tfrec文件里面是有多个样本的,所以tfrec可以为是多个tf.train.Example
文件组成的序列(每一个example是一个样本),然后每一个tf.train.Example
又是由若干个tf.train.Features
字典组成。这个Features可以理解为这个样本的一些信息,如果是图片样本,那么肯定有一个Features是图片像素值数据,一个Features是图片的标签值;如果是预测任务,那么这个Feature可能就是一些字符串类型的特征
3 制作tfrec文件
import tensorflow as tf
import glob
# 先记录一下要保存的tfrec文件的名字
tfrecord_file = './train.tfrec'
# 获取指定目录的所有以jpeg结尾的文件list
images = glob.glob('./*.jpeg')
with tf.io.TFRecordWriter(tfrecord_file) as writer:
for filename in images:
image = open(filename, 'rb').read() # 读取数据集图片到内存,image 为一个 Byte 类型的字符串
feature = { # 建立 tf.train.Feature 字典
'image': tf.train.Feature(bytes_list=tf.train.BytesList(value=[image])), # 图片是一个 Bytes 对象
'label': tf.train.Feature(int64_list=tf.train.Int64List(value=[1])),
'float':tf.train.Feature(float_list=tf.train.FloatList(value=[1.0,2.0])),
'name':tf.train.Feature(bytes_list=tf.train.BytesList(value=[str.encode(filename)]))
}
# tf.train.Example 在 tf.train.Features 外面又多了一层封装
example = tf.train.Example(features=tf.train.Features(feature=feature)) # 通过字典建立 Example
writer.write(example.SerializeToString()) # 将 Example 序列化并写入 TFRecord 文件
代码中我们需要注意的地方是:
- 先读取图片,然后构建一个字典来作为这个example的格式;
- 上面代码中,字典中有四个属性,首先是image图片本身的像素值,然后有一个标签,标签是int类型,然后有一个float浮点类型,name是一个字符串类型,这个string类型的需要转换成byte字节类型的才能进行存储,所以这里使用
str.encode
来把字符串转换成字节; - 然后这个features再经过Example的封装,再然后把这个example写进这个tfrec文件中。
这一段代码建议保存下来,方便以后的直接参考和复制。构建tfrec文件对于tensorflow处理图片来说,应该是绕不过的一个步骤。
4 读取tfrec文件
现在,我们运行完上面的代码,应该生成了一个./train.tfrec
文件,下面我们再对这个文件进行读取。
import tensorflow as tf
dataset = tf.data.TFRecordDataset('./train.tfrec')
def decode(example):
feature_description = {
'image': tf.io.FixedLenFeature([], tf.string),
'label': tf.io.FixedLenFeature([], tf.int64),
'float': tf.io.FixedLenFeature([1, 2], tf.float32),
'name': tf.io.FixedLenFeature([], tf.string)
}
feature_dict = tf.io.parse_single_example(example, feature_description)
feature_dict['image'] = tf.io.decode_jpeg(feature_dict['image']) # 解码 JEPG 图片
return feature_dict
dataset = dataset.map(decode).batch(4)
for i in dataset.take(1):
print(i['image'].shape)
print(i['label'].shape)
print(i['float'].shape)
print(bytes.decode(i['name'][0].numpy()))
- 首先使用专门用来读取tfrec文件的方法
tf.data.TFRecordDataset
,进行读取,创建了一个dataset,但是这个dataset并不能直接使用,需要对tfrec中的example进行一些解码; - 自己写一个解码函数decode,首先写一个特征描述,我们知道在保存tfrec的时候每一个example有四个特征,这里需要对每一个特征确定他的类型,是string还是int还是float这样的。
- 然后通过这个特征描述和
tf.io.parse_single_example
方法,从example中提取到对应的特征; - 因为image是一个图片张量,而我们读取的时候是读取的tf.string的类型,所以使用
tf.io.decode_jpeg()
来把字符串解码成一个tensor张量。 - 最后使用上节课讲过的
.batch(4)
把数据集每一个batch包含四个样本。
上面代码输出的结果为:
需要注意的是这个如何把name转换成string类型的,如果已经在本地跑完了上面的代码,可以自己看看i['name']是一个什么类型的,然后自己试试如何转换成string类型的。上面的代码是能成功转换的。
下一次的内容就是如何构建模型,然后怎么把数据集喂给模型。
【小白学PyTorch】17 TFrec文件的创建与读取的更多相关文章
- 【小白学PyTorch】20 TF2的eager模式与求导
[新闻]:机器学习炼丹术的粉丝的人工智能交流群已经建立,目前有目标检测.医学图像.时间序列等多个目标为技术学习的分群和水群唠嗑的总群,欢迎大家加炼丹兄为好友,加入炼丹协会.微信:cyx64501661 ...
- excel2003和excel2007文件的创建和读取
excel2003和excel2007文件的创建和读取在项目中用的很多,首先我们要了解excel的常用组件和基本操作步骤. 常用组件如下所示: HSSFWorkbook excel的文档对象 HSSF ...
- 【小白学PyTorch】6 模型的构建访问遍历存储(附代码)
文章转载自微信公众号:机器学习炼丹术.欢迎大家关注,这是我的学习分享公众号,100+原创干货. 文章目录: 目录 1 模型构建函数 1.1 add_module 1.2 ModuleList 1.3 ...
- 【小白学PyTorch】18 TF2构建自定义模型
[机器学习炼丹术]的炼丹总群已经快满了,要加入的快联系炼丹兄WX:cyx645016617 参考目录: 目录 1 创建自定义网络层 2 创建一个完整的CNN 2.1 keras.Model vs ke ...
- 小白学flask之静态文件
引入css的方式有两种 1 那在flask中,如何处理静态文件? 做法很简单,只要在你的包或模块旁边创建一个名为 static 的文件夹就行了. flask的静态文件是位于应用的 /static 中的
- 小白学PyTorch 动态图与静态图的浅显理解
文章来自公众号[机器学习炼丹术],回复"炼丹"即可获得海量学习资料哦! 目录 1 动态图的初步推导 2 动态图的叶子节点 3. grad_fn 4 静态图 本章节缕一缕PyTorc ...
- 【小白学PyTorch】1 搭建一个超简单的网络
文章目录: 目录 1 任务 2 实现思路 3 实现过程 3.1 引入必要库 3.2 创建训练集 3.3 搭建网络 3.4 设置优化器 3.5 训练网络 3.6 测试 1 任务 首先说下我们要搭建的网络 ...
- 【小白学PyTorch】3 浅谈Dataset和Dataloader
文章目录: 目录 1 Dataset基类 2 构建Dataset子类 2.1 Init 2.2 getitem 3 dataloader 1 Dataset基类 PyTorch 读取其他的数据,主要是 ...
- 【小白学PyTorch】5 torchvision预训练模型与数据集全览
文章来自:微信公众号[机器学习炼丹术].一个ai专业研究生的个人学习分享公众号 文章目录: 目录 torchvision 1 torchvision.datssets 2 torchvision.mo ...
随机推荐
- Fiddler添加显示ip和响应时间
1. 打开Fiddler,在菜单Rules 栏里点击Customize Rules…或者使用快捷键CTRL+R打开Fiddler ScriptEditor 图 1 Customize Rules 2. ...
- 超全Python IDE武器库大总结,优缺点一目了然!
本文介绍了多个 Python IDE,并评价其优缺点.读者可以参考此文列举的 Python IDE 列表,选择适合自己的编辑器. 写 Python 代码最好的方式莫过于使用集成开发环境(IDE)了.它 ...
- Vuex 注入 Vue 生命周期的过程
首先我们结合 Vue 和 Vuex 的部分源码,来说明 Vuex 注入 Vue 生命周期的过程. 说到源码,其实没有想象的那么难.也和我们平时写业务代码差不多,都是方法的调用.但是源码的调用树会复杂很 ...
- C#可空类型 T?
可空类型概述 可空类型具有以下特性: 可空类型表示可被赋值为 null 值的值类型变量.无法创建基于引用类型的可空类型.(引用类型已支持 null 值.). 语法 T? 是 System.Nullab ...
- Rng(求逆元)
Problem Description Avin is studying how to synthesize data. Given an integer n, he constructs an in ...
- ctf常见源码泄露
前言 在ctf中发现很多源码泄露的题,总结一下,对于网站的搭建要注意删除备份文件,和一些工具的使用如git,svn等等的规范使用,避免备份文件出现在公网 SVN源码泄露 原理 SVN(subversi ...
- JavaScript 的 this 指向和绑定详解
JavaScript 中的 new.bind.call.apply 实际这些都离不开 this,因此本文将着重讨论 this,在此过程中分别讲解其他相关知识点. 注意: 本文属于基础篇,请大神绕路.如 ...
- 11 vue 自定义全局方法
//global.js// 定义vue 全局方 // 定义vue 全局方法 建议自定义的全局方法加_ 以示区分 export default { install(Vue, options = ...
- 《闲扯Redis十一》Redis 有序集合对象底层实现
一.前言 Redis 提供了5种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),理解每种数据类型的特点对于redis的开发和运维非常重要. ...
- IFile、File与实体转换
/** * 根据物理实体文件在开发工程中创建实体文件 */ @Override public void getEntityFilesByErFile(IFile erfile, IFolder ent ...