(markdown是用jupypter notebook生成)


mxnet为的提高IO效率, 不会直接读取图片文件, 而是先将图片列表和标签转换为RecordIO格式的二进制文件, 训练时就可以顺序读取数据, 大大提高了IO速率.
# 如何将图片列表与标签转换为RecordIO?
mxnet直接提供了mnist与cifar数据集的recordIO格式, 但为了熟悉这个过程, 我决定自己手动来一遍: 将mnist数据的原始二进制格式转换为recordIO格式.
## 如何将mnist ubyte文件转换成image 文件与lst?
从[Yan Lecun](http://yann.lecun.com/exdb/mnist/index.html)网站上下载下来的原始数据由以下四部分组成

!ls ../dataset/mnist
t10k-images-idx3-ubyte	train-images-idx3-ubyte
t10k-labels-idx1-ubyte train-labels-idx1-ubyte

怎样读取训练数据?

train images和labels两个文件分别训练数据的图片与标签, 数量为50k. t10k images 和labels则是测试数据, 10k.

先写脚本读取训练数据, 生成im2rec需要的图片文件与lst文件. train-images-idx3-ubyte文件的数据格式为:

# The labels values are 0 to 9.
# TRAINING SET IMAGE FILE (train-images-idx3-ubyte):
# [offset] [type] [value] [description]
# 0000 32 bit integer 0x00000803(2051) magic number
# 0004 32 bit integer 60000 number of images
# 0008 32 bit integer 28 number of rows
# 0012 32 bit integer 28 number of columns
# 0016 unsigned byte ?? pixel
# 0017 unsigned byte ?? pixel
# ........
# xxxx unsigned byte ?? pixel
import sys;
file_path = '../dataset/mnist/';
train_images_ubyte = file_path + 'train-images-idx3-ubyte';
train_labels_ubyte = file_path + 'train-labels-idx1-ubyte';
test_images_ubyte = file_path + 'test-images-idx3-ubyte';
test_labels_ubyte = file_path + 'test-labels-idx1-ubyte'; train_images = [];
train_labels = [];
def readInt(f, n = 4):
"""从mnist二进制文件中读取整数"""
return int(f.read(n).encode('hex'), 16);
def readImage(f):
"""从mnist二进制文件中读取图片"""
n = 28*28;
img = [0]*n;
for i in xrange(n):#这样一个一个字节地读取会很慢
img[i] = readInt(f, 1);
return img; # 读取图片
with open(train_images_ubyte, 'r') as f:
magic = readInt(f);
num_img = readInt(f);
num_rows = readInt(f);
num_cols = readInt(f); for i in range(num_img):
train_images.append(readImage(f));

train-labels-idx1-ubyte的数据格式如下:

#  TRAINING SET LABEL FILE (train-labels-idx1-ubyte):
# [offset] [type] [value] [description]
# 0000 32 bit integer 0x00000801(2049) magic number (MSB first)
# 0004 32 bit integer 60000 number of items
# 0008 unsigned byte ?? label
# 0009 unsigned byte ?? label
# ........
# xxxx unsigned byte ?? label
#
def readLabel(f):
"""从mnist二进制文件中读取label"""
return readInt(f, 1); # 读取标签
with open(train_labels_ubyte, 'r') as f:
magic = readInt(f);
num_items = readInt(f); for i in xrange(num_items):
train_labels.append(readLabel(f));

可视化一下读取出来的数据

没什么实质性的功能, 就为了看看读出来的数据是怎样的.

import matplotlib.pyplot as plt;
import numpy as np;
%matplotlib inline def list2img(arr):
return np.reshape(arr, (28, 28));
# 显示几张图片及其对应对手写数字;
num = 10
for i in range(num):
img = list2img(train_images[i]);
plt.subplot(1,num,i+1);
plt.imshow(img, cmap='gray')
plt.axis('off')
plt.title(train_labels[i]) # 画一张条形图看看数字的分布
plt.figure()
plt.hist(train_labels, range(11));

可以看出, 每个数字的分布还是挺均匀的.

导出图片, 并生成lst文件

#导出图片
import cv2
import os
file_dir = '/home/dengdan/dataset/mnist/raw/train/images/';
if not os.path.exists(file_dir) or not os.path.isdir(file_dir):
os.makedirs(file_dir);
file_name = 'mnist_train_{0}.jpg';
n = len(train_images)
for i in xrange(n):
img = list2img(train_images[i]);
#cv2.imwrite(file_dir + file_name.format(i), img) #需要生成图片时将注释去掉

lst 文件用于将图片文件与它的label对应起来. 每一行为一条记录, 格式为:

integer_image_index \t label_index \t path_to_image
895099  464     n04467665_17283.JPEG
10025081 412 ILSVRC2010_val_00025082.JPEG
74181 789 n01915811_2739.JPEG
10035553 859 ILSVRC2010_val_00035554.JPEG
10048727 929 ILSVRC2010_val_00048728.JPEG
94028 924 n01980166_4956.JPEG
1080682 650 n11807979_571.JPEG
972457 633 n07723039_1627.JPEG
7534 11 n01630670_4486.JPEG
1191261 249 n12407079_5106.JPEG
# 生成lst 文件
def rec(idx, label):
"""生成第idx张图片的记录"""
name = file_name.format(idx);
return '{0} \t {1} \t {2}'.format(idx, label, name) lst_path = '/home/dengdan/dataset/mnist/mxnet/'
if not os.path.exists(lst_path) or not os.path.isdir(lst_path):
os.makedirs(lst_path);
lst = lst_path + 'train.lst';
with open(lst, 'w') as f:
for i in xrange(len(train_labels)):
record = rec(i, train_labels[i]);
f.write(record + '\n');

现在, 图片也有了, lst文件也有了, 可以利用im2rec工具生成recordio文件了

! ~/github/mxnet/bin/im2rec ~/dataset/mnist/mxnet/train.lst  ~/dataset/mnist/raw/train/images/   ~/dataset/mnist/mxnet/train.bin
[16:28:31] tools/im2rec.cc:96: Keep origin image size
[16:28:31] tools/im2rec.cc:107: Encoding is .jpg
[16:28:31] tools/im2rec.cc:153: Write to output: /home/dengdan/dataset/mnist/mxnet/train.bin

...

[16:28:35] tools/im2rec.cc:251: 55000 images processed, 4.04441 sec elapsed

[16:28:35] tools/im2rec.cc:251: 56000 images processed, 4.11869 sec elapsed

[16:28:35] tools/im2rec.cc:251: 57000 images processed, 4.1915 sec elapsed

[16:28:36] tools/im2rec.cc:251: 58000 images processed, 4.26273 sec elapsed

[16:28:36] tools/im2rec.cc:251: 59000 images processed, 4.3346 sec elapsed

[16:28:36] tools/im2rec.cc:251: 60000 images processed, 4.40678 sec elapsed

[16:28:36] tools/im2rec.cc:254: Total: 60000 images processed, 4.40682 sec elapsed


github: https://github.com/dengdan/deep-learning-with-mxnet/tree/master/io/mnist2rec.ipynb

mxnet(1)生成RecordIO与lst文件的更多相关文章

  1. 生成的API分析文件太大。我们无法在交付前验证您的API使用信息。这只是通知信息。

    这次使用了APICloud平台来开发移动APP, 发布的时候在api控制台云编译成ipa后,这次使用apple提供的Application Loader工具提交apa文件到iTunes上去,提交结束的 ...

  2. C# 调用WebService的3种方式 :直接调用、根据wsdl生成webservice的.cs文件及生成dll调用、动态调用

    1.直接调用 已知webservice路径,则可以直接 添加服务引用--高级--添加web引用 直接输入webservice URL.这个比较常见也很简单 即有完整的webservice文件目录如下图 ...

  3. myeclipse(2015)中创建简单的Maven项目的步骤(用于生成可执行jar文件)------》myeclipse2015

    利用MyEclipse的引导,可以很方便的创建简单的.用于生成可执行jar文件的Maven项目: 1.New -> Project... 选择 Maven Project, 点击Next > ...

  4. Java生成和操作Excel文件(转载)

    Java生成和操作Excel文件   JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该A ...

  5. 依据BOM和已经存在的文件生成其他种类的文件

    在BOM中记录中有物料编码,物料名称,物料规格等,而且依据BOM已经生成了一些的文件,如采购规格书,这个时候需要生成相应的检验规格书模板,可以使用下面的VBA代码,具体代码如下: Function I ...

  6. Java生成和操作Excel文件

    JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该API非Windows操作系统也可以通过 ...

  7. T4模版生成多个实体文件时,提示找不到 Host

    T4模版生成多个实体文件时,提示找不到 Host 使用以下方法,把hostspecific改为true就可以了 hostspecific:有效值true.false,默认为false.如果将此特性的值 ...

  8. PHP生成 excl、word文件

    PHP生成 excl.word文件 $time = time();   $filename = date("Y年m月d日h点m分s秒", $time).'问卷数据';  $rows ...

  9. DedeCMS生成首页html静态文件的教程

    http://www.mubanzhijia.com/jishujiaocheng/826.html 在dedecms后台点击"更新主页Html"时,发生了什么?dedecms生成 ...

随机推荐

  1. NOIP2003传染病控制[按层DFS]

    题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种传染病,难以准确判别病毒携带 ...

  2. Windows 批处理(bat)语法大全

    本文是学习bat整理的笔记,由于内容较多,建议结合右侧文章大纲查看. %~dp0[获取当前路径] %~dp0 “d”为Drive的缩写,即为驱动器,磁盘.“p”为Path缩写,即为路径,目录 cd % ...

  3. 在Flex4中嵌入字体

    如果要使用的字体不是系统字体,可以把字体嵌入到Flash中,然后引用该字体.不过字体文件一般都比较大,慎重使用该功能. 官方例子 http://help.adobe.com/en_US/flex/us ...

  4. QC学习一:Windows环境中Quality Center 9.0安装详解

    一.安装前准备 1.安装环境:windows XP.SQL Server2005 2.准备安装文件:Quality Center 9.0 (qc10以上,包括qc10,qc只支持安装在服务器操作系统上 ...

  5. Android之监听手机软键盘弹起与关闭

    背景: 在很多App开发过程中需要在Activity中监听Android设备的软键盘弹起与关闭,但是Android似乎没有提供相关的的监听API给我们来调用,本文提供了一个可行的办法来监听软键盘的弹起 ...

  6. HTML 学习笔记 CSS样式(边框)

    元素的边框(border)是围绕元素内容和内边距的一条或多条线 CSS border 属性允许你规定边框的样式 宽度和颜色 CSS 边框 在 HTML 中,我们使用表格来创建文本周围的边框,但是通过使 ...

  7. 如何用javac 和java 编译运行整个Java工程 (转载)【转】在Linux下编译与执行Java程序

    如何用javac 和java 编译运行整个Java工程 (转载)  http://blog.csdn.net/huagong_adu/article/details/6929817 [转]在Linux ...

  8. C# 内存信息

      Process proc = Process.GetCurrentProcess();                 Console.Write("专用工作集内存:");   ...

  9. 监听grid行点击事件

  10. DEDECMS之七 如何实现文章推荐排行榜

    经常可以看到各种排行榜,这些文章列表的标题之前加了序号,前三条还有显眼样式 1.实现效果 2.实现方法 <ul class="hotPh1"> {dede:arclis ...