mxnet Record IO详解
导读
当我们需要使用大数据集来训练模型的时候,这时候加载和读取数据就成为了我们训练的瓶颈。Mxnet提供了一种数据的存储格式ImageRecord
,通过这种数据的存储格式可以使用多进程来加载数据,可以极大的提高训练的效率。
Mxnet提供了一个mx.recordio
模块,可以对ImageRecord
文件进行操作,该模块里面包含了两个子模块。MXRecordIO
支持顺序读写,MXIndexedRecordIO
支持随机读写。下面就来我们一起来看一下,这两个子模块中的一些接口函数,以及如何使用它们来读取和保存ImageRecord 文件
MXRecordIO
- 将数据保存为rec文件
在python3中需要先将字符串转为byte
数据之后才能写入到rec文件中,而python2中不需要做这一步处理
import mxnet as mxwrite_record = mx.recordio.MXRecordIO("test.rec","w")
for i in range(5):#向rec文件中写入数据#将字符串数据转换为bytes数据,写入到文件中write_record.write(str.encode("record_%d"%i))
write_record.close()
- 读取rec文件的内容
read_record = mx.recordio.MXRecordIO("test.rec","r")
while True:item = read_record.read()if not item:break#将bytes数据转换为字符串print(item.decode())
read_record.close()
- 重新开始读取rec文件
rec文件的读取采用的是指针来读取的,当指针移到到文件的结束位置时,此时再读取文件的时候,会返回一个None
。如果你想要从头开始读取文件,可以通过reset
方法,将指针移动到文件的开始位置。
read_record = mx.recordio.MXRecordIO("test.rec","r")
i = 3
while True:item = read_record.read()if not item:break#将bytes数据转换为字符串print(item.decode())
#再次读取内容
print(read_record.read())#None
#将指针移到文件的开始位置
read_record.reset()
#读取内容
print(read_record.read())#b'record_0'
read_record.close()
MXIndexedRecordIO
在训练模型的时候我们希望打乱数据集中数据的顺序,通过MXIndexedRecordIO
可以获取到一个随机顺序的数据
- 保存数据
import mxnet as mxwrite_record = mx.recordio.MXIndexedRecordIO('test.idx', 'test.rec', 'w')
for i in range(5):write_record.write_idx(i, str.encode('record_%d'%i))
write_record.close()
- 读取数据
read_record = mx.recordio.MXIndexedRecordIO('test.idx', 'test.rec', 'r')
for i in range(5):item = read_record.read()if item is None:breakprint(item.decode())
read_record.close()
- 获取随机顺序的数据
通过read_idx
我们可以移动指针的位置,来获取随机的数据
import randomidx_list = [i for i in range(0,4)]
#打乱idx的顺序
random.shuffle(idx_list)
read_record = mx.recordio.MXIndexedRecordIO('test.idx', 'test.rec', 'r')
for i in idx_list:#获取指定idx的数据read_record.read_idx(i)item = read_record.read()if item is None:breakprint(item.decode())
read_record.close()
- 获取文件中的idx
read_record = mx.recordio.MXIndexedRecordIO('test.idx', 'test.rec', 'r')
#通过items来获取idx
for key,_ in read_record.idx.items():#key就是文件中的idxprint(key)
#获取文件的idx
print(read_record.keys)
二进制数据的保存和读取
在训练模型的时候,我们的数据格式大多是(data,label)
的形式来进行保存的,而其中的data可能是,可能是图片数据或者其他类型的数据,我们都可以将其转换为二进制数据来进行保存。
MXNet的每个rec
文件能够用来保存任意的二进制数据,而且mx.recordio
还提供了几个非常有用的函数用来打包
和解压
数据,pack
,unpack
, pack_img
, and unpack_img
字符串数据的保存和读取
#需要保存的字符串数据
data = "data"
#label可以是列表类型的数据
label1 = 1.0#[1.0,2.0,3.0]
#数据的id
id = 1
#打包数据的标签和id
header1 = mx.recordio.IRHeader(flag=0,label=label1,id=id,id2=0)
#将字符串转为二进制数据
s1 = mx.recordio.pack(header1,str.encode(data))
#解压数据
unpack_header1,unpack_s1 = mx.recordio.unpack(s1)
print(unpack_header1)#HEADER(flag=0, label=1.0, id=1, id2=0)
#获取数据的标签和id信息
print(unpack_header1.label,unpack_header1.id)#1.0 1
#获取压缩的数据
print(unpack_s1.decode())#data
图片数据的保存和读取
- 保存rec文件
import mxnet as mxwrite_record = mx.recordio.MXIndexedRecordIO("test.idx","test.rec", 'w')
#读取图片
img_path = "img/test.jpg"
#将图片数据转为Numpy数组
img = mx.image.imread(img_path).asnumpy()
label = 1.0
header = mx.recordio.IRHeader(flag=0,label=label,id=0,id2=0)
s = mx.recordio.pack_img(header,img,quality=95,img_fmt=".jpg")
#将数据写入到rec文件中
write_record.write_idx(0,s)
write_record.close()
- 读取rec文件
read_record = mx.recordio.MXIndexedRecordIO("test.idx","test.rec","r")
#遍历rec文件
for idx in read_record.keys:item = read_record.read()#解压数据header,s = mx.recordio.unpack(item)#将图片的bytes数据转换为ndarrayimg = mx.image.imdecode(s)print(img.shape)
通过ImageRecordIter读取rec文件
from mxnet.io import ImageRecordItertrain_data = ImageRecordIter(path_imgrec = "test.rec",path_imgidx = "test.idx",data_shape = (3, 112, 112),batch_size = 1,shuffle = True
)
for batch in train_data:print(batch.data[0].shape, batch.label[0].shape)break
参考:
- https://github.com/Xilinx/mxnet/blob/master/docs/tutorials/basic/record_io.md
- http://34.201.8.176/versions/io/api/python/io/io.html?highlight=mxindexedrecordio#mxnet.recordio.MXIndexedRecordIO
- https://gluon-cv.mxnet.io/build/examples_datasets/recordio.html
mxnet Record IO详解相关推荐
- [转]文件IO详解(二)---文件描述符(fd)和inode号的关系
原文:https://www.cnblogs.com/frank-yxs/p/5925563.html 文件IO详解(二)---文件描述符(fd)和inode号的关系 ---------------- ...
- 网络IO和磁盘IO详解
网络IO和磁盘IO详解 1. 缓存IO 缓存I/O又被称作标准I/O,大多数文件系统的默认I/O操作都是缓存I/O.在Linux的缓存I/O机制中,数据先从磁盘复制到内核空间的缓冲区,然后从内核空间缓 ...
- Java基础——Java IO详解
一.概述 1.Java IO Java IO即Java 输入输出系统.不管我们编写何种应用,都难免和各种输入输出相关的媒介打交道,其实和媒介进行IO的过程是十分复杂的,这要考虑的因素特别多,比如我们要 ...
- java 测试磁盘io,详解三种Linux测试磁盘IO性能的方法总结,值得收藏
概述 在磁盘测试中我们一般最关心的几个指标分别为:iops(每秒执行的IO次数).bw(带宽,每秒的吞吐量).lat(每次IO操作的延迟). 当每次IO操作的block较小时,如512bytes/4k ...
- 17、文件IO详解及实例
上篇文章已经讲过了文件系统的一些基本的概念,这里首先对文件IO进行详细的学习,文件IO也称为系统调用IO,是操作系统为"用户态"运行的进程和硬件交互提供的一组接口,即操作系统内核留 ...
- java中的IO详解(下)
BufferedReader的小例子 注意: BufferedReader只能接受字符流的缓冲区,因为每一个中文需要占据两个字节,所以需要将System.in这个字节输入流变为字符输入流,采用: 1 ...
- java中的IO详解(上)
Java中的IO整理完整版(一) [案例1]创建一个新文件 1 import java.io.*; 2 class hello{ 3 public static void main(Strin ...
- java 网络io详解_Java网络socket编程详解
或许有点长 但是一步步教你 我想你也愿意看7.2面向套接字编程 我们已经通过了解Socket的接口,知其所以然,下面我们就将通过具体的案例,来熟悉Socket的具体工作方式7.2.1使用套接字实现基于 ...
- java按照io流向基类_Java IO详解
1 Java IO流的概念,分类 1.1 Java IO流的概念 java的IO是实现输入和输出的基础,可以方便的实现数据的输入和输出操作.在java中把不同的输入/输出源(键盘,文件,网络连接等)抽 ...
最新文章
- 最新大脑图谱研究表明,手部的运动区域也与整个身体相连
- windows2003权限如何配置
- 去掉a标签下划线_条码软件如何修改条码标签的字体格式
- libtool: line 990: g++: command not found的解决
- 网格系统常用的三种比例
- Kettle parameter方式实现循环
- 服务器系统怎么么安装手绘板驱动,wacom数位板如何使用?wacom数位板驱动安装教程!...
- 智能优化算法学习总结
- Mac系统安装consul
- markdown如何调整行距_Markdown基础语法
- 数学杂记(1)一些无处安放的数学推导
- html5中的td tr,html5 表格标签 table tr td
- Air Jordan 33 Performance Review
- 一个始乱没有终弃故事——leo看职场小说《做单》
- 多线程和事务之Workaround
- 《英雄联盟》——召唤师峡谷模式 游戏设计元素分析
- 传统中小企业对SEO的错误认识和偏见
- 转炉炼钢计算机仿真实验报告,计算机仿真冶炼运用(共4523字).doc
- EVP 签名和校验 Signing and Verifying
- Units are seconds since 1970.
热门文章
- 华为机试——翻译电话号码
- 刚子扯扯蛋:说下百度对网站原创文章的个人感受
- Centos7 添加新用户并赋予权限
- 如何解决MacOS Big Sur,打印错误:ERROR invalidcontent?
- python修改Jenkins job的参数默认值
- 算法导论第十五章:动态规划(一)
- Codeforces Round #470 (Div. 2) A Protect Sheep (基础)输入输出的警示、边界处理
- 优必选在 CES 上发布了一个真·家庭服务机器人
- k8s-nexus私库
- Python——SMTP发送邮件(发送不同格式、附件)