导读

当我们需要使用大数据集来训练模型的时候,这时候加载和读取数据就成为了我们训练的瓶颈。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

参考:

  1. https://github.com/Xilinx/mxnet/blob/master/docs/tutorials/basic/record_io.md
  2. http://34.201.8.176/versions/io/api/python/io/io.html?highlight=mxindexedrecordio#mxnet.recordio.MXIndexedRecordIO
  3. https://gluon-cv.mxnet.io/build/examples_datasets/recordio.html

mxnet Record IO详解相关推荐

  1. [转]文件IO详解(二)---文件描述符(fd)和inode号的关系

    原文:https://www.cnblogs.com/frank-yxs/p/5925563.html 文件IO详解(二)---文件描述符(fd)和inode号的关系 ---------------- ...

  2. 网络IO和磁盘IO详解

    网络IO和磁盘IO详解 1. 缓存IO 缓存I/O又被称作标准I/O,大多数文件系统的默认I/O操作都是缓存I/O.在Linux的缓存I/O机制中,数据先从磁盘复制到内核空间的缓冲区,然后从内核空间缓 ...

  3. Java基础——Java IO详解

    一.概述 1.Java IO Java IO即Java 输入输出系统.不管我们编写何种应用,都难免和各种输入输出相关的媒介打交道,其实和媒介进行IO的过程是十分复杂的,这要考虑的因素特别多,比如我们要 ...

  4. java 测试磁盘io,详解三种Linux测试磁盘IO性能的方法总结,值得收藏

    概述 在磁盘测试中我们一般最关心的几个指标分别为:iops(每秒执行的IO次数).bw(带宽,每秒的吞吐量).lat(每次IO操作的延迟). 当每次IO操作的block较小时,如512bytes/4k ...

  5. 17、文件IO详解及实例

    上篇文章已经讲过了文件系统的一些基本的概念,这里首先对文件IO进行详细的学习,文件IO也称为系统调用IO,是操作系统为"用户态"运行的进程和硬件交互提供的一组接口,即操作系统内核留 ...

  6. java中的IO详解(下)

    BufferedReader的小例子 注意: BufferedReader只能接受字符流的缓冲区,因为每一个中文需要占据两个字节,所以需要将System.in这个字节输入流变为字符输入流,采用: 1  ...

  7. java中的IO详解(上)

    Java中的IO整理完整版(一) [案例1]创建一个新文件 1 import java.io.*; 2 class hello{ 3     public static void main(Strin ...

  8. java 网络io详解_Java网络socket编程详解

    或许有点长 但是一步步教你 我想你也愿意看7.2面向套接字编程 我们已经通过了解Socket的接口,知其所以然,下面我们就将通过具体的案例,来熟悉Socket的具体工作方式7.2.1使用套接字实现基于 ...

  9. java按照io流向基类_Java IO详解

    1 Java IO流的概念,分类 1.1 Java IO流的概念 java的IO是实现输入和输出的基础,可以方便的实现数据的输入和输出操作.在java中把不同的输入/输出源(键盘,文件,网络连接等)抽 ...

最新文章

  1. 最新大脑图谱研究表明,手部的运动区域也与整个身体相连
  2. windows2003权限如何配置
  3. 去掉a标签下划线_条码软件如何修改条码标签的字体格式
  4. libtool: line 990: g++: command not found的解决
  5. 网格系统常用的三种比例
  6. Kettle parameter方式实现循环
  7. 服务器系统怎么么安装手绘板驱动,wacom数位板如何使用?wacom数位板驱动安装教程!...
  8. 智能优化算法学习总结
  9. Mac系统安装consul
  10. markdown如何调整行距_Markdown基础语法
  11. 数学杂记(1)一些无处安放的数学推导
  12. html5中的td tr,html5 表格标签 table tr td
  13. Air Jordan 33 Performance Review
  14. 一个始乱没有终弃故事——leo看职场小说《做单》
  15. 多线程和事务之Workaround
  16. 《英雄联盟》——召唤师峡谷模式 游戏设计元素分析
  17. 传统中小企业对SEO的错误认识和偏见
  18. 转炉炼钢计算机仿真实验报告,计算机仿真冶炼运用(共4523字).doc
  19. EVP 签名和校验 Signing and Verifying
  20. Units are seconds since 1970.

热门文章

  1. 华为机试——翻译电话号码
  2. 刚子扯扯蛋:说下百度对网站原创文章的个人感受
  3. Centos7 添加新用户并赋予权限
  4. 如何解决MacOS Big Sur,打印错误:ERROR invalidcontent?
  5. python修改Jenkins job的参数默认值
  6. 算法导论第十五章:动态规划(一)
  7. Codeforces Round #470 (Div. 2) A Protect Sheep (基础)输入输出的警示、边界处理
  8. 优必选在 CES 上发布了一个真·家庭服务机器人
  9. k8s-nexus私库
  10. Python——SMTP发送邮件(发送不同格式、附件)