mxNet学习序列

2024-08-23 13:58
文章标签 学习 序列 mxnet

本文主要是介绍mxNet学习序列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1- linux下安装mxnet和python接口配置

mxnet可以安装到Linux、OSX和windows下。由于windows下配置相对较为复杂,故这里选择安装在linux下。 具体我的linux版本为64位的ubuntu14.04LTS,之前使用ubuntu15时发现不是很稳定。还有,这里我是在笔记本上安装的,因此没有安装CUDA、CUDNN之类的GPU管理程序。

mxnet支持在线安装,在终端中单步依次执行以下代码:

sudo apt-get update
sudo apt-get install -y build-essential git libatlas-base-dev libopencv-dev
git clone --recursive https://github.com/dmlc/mxnet
cd mxnet; make -j4
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

Python接口的配置: 
mxnet目前主要支持python、R和Julia这3种接口。我选择了相对熟悉的python。 
mxnet要求2.7及以上版本的python和numpy库,一般linux都自带python编译器,因此我们只需要再检查一下是否缺少numpy库。可以直接输入下面的numpy安装代码:

sudo apt-get install python-numpy 
  • 1
  • 1

上面处理完成之后可以尝试一下能否运行官方提供的一个案例:在mnist数据集上训练一个多层感知器MLP。

python mxnet/example/image-classification/train_mnist.py
  • 1
  • 1

如果之前配置过GPU(如何配置可以参考官方文档),可以尝试用GPU测试一下网络:

python mxnet/example/image-classification/train_mnist.py --network lenet --gpus 0
  • 1
  • 1

注意:上述过程完成后,直接在python中执行以下代码(如 import mxnet as mx)可能会提示“no module named ”,这可能是因为未添加路径导致的。可以通过单步依次执行下面代码解决:

// ~表示我的mxnet安装在home下面
export PYTHONPATH=~/mxnet/python
cp -r ~/mxnet/python/mxnet .
cp ~/mxnet/lib/libmxnet.so mxnet/
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

2- 如何将训练图片转换格式并送入网络

就好像在caffe中训练模型之前要现将训练图片转化为leveldb或者LMDB格式数据一样,mxnet在训练之前也要先将图片转化为REC格式的数据。

这里直接记录转换过程,后续会详细讲解REC数据格式的编码以及最终如何将REC格式数据再加载到网络当中。

linux下转换使用的工具是mxnet/bin下名为“im2rec”的可执行文件,该文件的源码可以查看mxnet/tools/im2rec.cc

首先,来说明以下im2rec这个转换工具有哪些输入参数:

首先是必须输入的3个参数,依次是

image_lst:  //保存图片和标签信息的文本的名字image_root_dir://图片的存放路径output_rec://转换后的.rec格式文件的存放路径
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

可选的输入参数有:


label_width://标签个数,默认为1,即每个图片只有一个标签resize: //默认为-1,即不调整图片尺寸。否则将图片的较短边的长度调整为resize大小,另一边按比例调整%%例如图片尺寸为300*200,resize=100,那么调整之后图片尺寸为150*100.quality: //JPEG编码质量,默认为80。输入范围为1-100.(mxnet转换数据时是编码存储的)center_crop: //默认为0,if(center_crop),则将图片以中心裁剪为正方形。注意:只有if(resize>0)成立时,该参数才有效。nsplit://默认为1,用于将部分图片进行转换,按照位置将image_lst中的图片分成nsplit个part%%注意,这里只是大概平分,例如12个训练图片,nsplit=3,实际分块为5+4+3,而不是预想中的4+4+4.(关于这一点我也还没搞明白)part: //默认为0,用于将部分图片进行转换。和nsplit结合使用,可以只转换nsplit中的第part个分块
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

这里举一个实际应用的例子 
(1)首先是保存图片和标签信息的文本,这里我的文件是train.txt.

编号 标签 图片名
1 0 FY2D1.bmp
2 1 FY2E1.bmp
3 0 FY2D2.bmp
4 1 FY2E2.bmp
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

(2)为了方便运行和调整参数,这里写了一个类似于windows批处理命令一样的可执行文件,来调用im2rec。这里我的可执行文件名为convert.sh,训练图片存储于data文件夹,转换后的结果保存到当前文件夹下,命名为train.rec

#!/bin/sh
/home/zfan/mxnet/bin/im2rec train.txt data/ train.rec quality=90 resize=1000
  • 1
  • 2
  • 1
  • 2

(3)打开终端,cd到convert.sh所在文件夹,输入 ./convert.sh 回车。运行提示如下:

[15:44:19] tools/im2rec.cc:54: New Image Size: Short Edge 1000
[15:44:19] tools/im2rec.cc:76: Write to output: train.rec
[15:44:19] tools/im2rec.cc:78: Output: train.rec
[15:44:19] tools/im2rec.cc:86: JPEG encoding quality: 90
[15:44:19] tools/im2rec.cc:160: Total: 4 images processed, 0.166033 sec elapsed
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

迭代器-将转换后的数据送入网络:

总体来说,开始一项训练,需要3个部分:训练参数、网络模型和训练数据。在上一小节,我已经详细介绍了如何将原始图片数据转化为mxnet可以接受的REC格式数据。但是,实际训练的时候我们还需要一个工具来将REC数据送入我们的训练网络中。这个工具就是“迭代器”-iterator

mxnet为我们提供了快速构建迭代器的函数ImageRecordIter,该函数位于python/mxnet/io.py中,其返回一个迭代器对象。或者可以在python命令窗中键入以下命令来获取io函数的位置以及说明:

import mxnet as mx
help(mx.io)
#或者输入help(mx.io.ImageRecordIter)来直接查看迭代器的参数说明
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

接下来说明ImageRecordIter的几个常用参数:(更多的参数可以通过上面的help查看)


path_imgrec:rec图像数据的存储路径;string型数据;默认为'./data/imgrec.rec'data_shape:迭代器产生的每一个实例的形状,即图片数据的形状;元组型数据;必选参数mean_img:图像均值文件的存放路径;string型数据;默认为空batch_size:batch的大小;int型数据;必选参数shuffle:是否打乱数据;布尔型数据;默认为False;mirror:是否对图片执行镜像操作;布尔型数据;默认为False;rand_mirror:是否随机地对图片执行镜像操作;布尔型数据;默认为False;rand_crop:是否随机地对图片执行剪切操作;布尔型数据;默认为False;label_width:图片的标签个数;int型数据;默认为1mean_r、 mean_g、 mean_b:3个颜色通道的均值;float型数据;默认为0num_parts:将训练数据分为几份;int型数据;默认为1part_index:第几部分数据将会被读取;int型数据;默认为0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

接下来以实例来说明怎样构建迭代器,该例子位于example/image-classification/train_imagenet.py中

#分别为训练数据和验证数据各构建一个迭代器
def get_iterator(args, kv):train = mx.io.ImageRecordIter(path_imgrec = args.data_dir + "train.rec",mean_img    = args.data_dir + "mean.bin",data_shape  = data_shape,batch_size  = args.batch_size,rand_crop   = True,rand_mirror = True,num_parts   = kv.num_workers,part_index  = kv.rank)val = mx.io.ImageRecordIter(path_imgrec = args.data_dir + "val.rec",mean_img    = args.data_dir + "mean.bin",rand_crop   = False,rand_mirror = False,data_shape  = data_shape,batch_size  = args.batch_size,num_parts   = kv.num_workers,part_index  = kv.rank)return (train, val)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

3- 构建一个网络模型

一个网络模型是一层一层连接器来的,因此想要构建一个网络模型,首先我们得知道mxnet中都有哪些可以用的层。(以下按照使用频率来排序) 
下面介绍一些比较常用的层,更多的层大家可以在python命令窗执行以下代码来查询

import mxnet as mx
help(mx.symbol)
  • 1
  • 2
  • 1
  • 2

(1)Activation:激活函数

   data: 输入数据,symbol型变量act_type: {'relu', 'sigmoid', 'tanh'}, 可选的3种激活函数
  • 1
  • 2
  • 1
  • 2

(2)Convolution:卷积层

data:输入数据,symbol型变量
weight:权重矩阵,symbol型变量
bias:偏置,symbol型变量
kernal:卷积核的尺寸(y,x),二维tuple型变量
stride:卷积步长(y,x),二维tuple型变量,默认为(1,1)
pad:卷积的填补量(y,x),二维tuple型变量,默认为(0,0)
num_filter :卷积滤波器(通道)个数,int型变量
no_bias :是否取消偏置,布尔型变量,默认为False
num_group:groups划分的个数,int型变量,默认为1.该选项不被CUDNN所支持, you can use SliceChannel to num_group,apply convolution and concat instead to achieve the same need.
workspace:卷积的Tmp工作空间的大小MB。long型变量,默认为512
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

(3)Deconvolution:反卷积层

参数同卷积层一致
  • 1
  • 1

(4)Dropout:

data:输入数据,symbol型变量
p : 训练时对输入数据进行dropped out的比例,float型变量,默认为0.5
  • 1
  • 2
  • 1
  • 2

(5)Flatten:将N维数据变为1维

data:输入数据,symbol型变量
name : string, optional. Name of the resulting symbol.
  • 1
  • 2
  • 1
  • 2

(6)FullyConnected:全连接层

data:输入数据,symbol型变量
weight:权重矩阵,symbol型变量
bias:偏置,symbol型变量
no_bias :是否取消偏置,布尔型变量,默认为False
num_hidden:输出隐藏节点的个数,int型变量
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

(7)LRN:

data:输入数据,symbol型变量
alpha : float, optional, default=0.0001.value of the alpha variance scaling parameter in the normalization formula
beta : float, optional, default=0.75.value of the beta power parameter in the normalization formula
knorm : float, optional, default=2.value of the k parameter in normalization formula
nsize : int (non-negative), required.normalization window width in elements.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

(8)Pooling

data:输入数据,symbol型变量
kernal:pooling核的尺寸(y,x),二维tuple型变量
stride:pooling步长(y,x),二维tuple型变量,默认为(1,1)
pad:pooling的填补量(y,x),二维tuple型变量,默认为(0,0)
pool_type : pooling的类型,可选的3种{'avg', 'max', 'sum'}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

(9)SoftmaxOutput:使用logloss进行BP

data:输入数据,symbol型变量
grad_scale : 为梯度乘以一个比例系数,float型变量,默认为1
multi_output : 布尔型变量,默认为False# If set to true, for a (n,k,x_1,..,x_n) dimensionalinput tensor, softmax will generate n*x_1*...*x_n output, eachhas k classes
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

(10)Variable:定义一个symbol型变量

name : 变量的名字,str型变量
attr : dict of string -> string.Additional attributes to set on the variable.
  • 1
  • 2
  • 1
  • 2

mxnet/example/image-classification文件夹下以symbol开头的几个.py文件都是定义好的网络模型。我们可以任意打开一个来具体了解一下如何构建一个网络。 
有一点需要注意的是:mxnet中通常要在卷积层和全连接层之间价加一个Flatten层用于衔接

4- 开始训练

首先,来总结一下我们现在都有了什么:保存网络模型的.py文件、REC格式的训练数据、将数据送入网络的迭代器。 
在此基础上,我们缺少的就只剩下网络训练的一些控制参数:如学习率、训练日志、GPU选择等等。 
在初期,我们往往可以先快速的拿来用,而不用在意其细节。那么,最简单的办法就是直接修改套用mxnet中的示例。示例主要集中在/example/image-classification和/tests/python当中。下面就简单的介绍如何快速开始训练: 
(1)新建一个文件夹,将/example/image-classification文件夹下find_mxnet.py、symbol_alexnet.py、train_imagenet.py和train_model.py这4个文件copy进来; 
(2)保持find_mxnet.py文件不变,在symbol_alexnet.py中按照里面Alexnet网络的构建方法来建立自己的网络。最后最好再把文件名改为自己的网络名,如mynet.py; 
(3)将train_imagenet.py最好也修改一下名字,如改为train_xx.py.将第40行代码中的’symbol’删除,否则你的网络文件就必须以‘symbol’开始命名,如symbol_mynet.py.

net = importlib.import_module('symbol_' + args.network).get_symbol(args.num_classes)
改为:
net = importlib.import_module(args.network).get_symbol(args.num_classes)
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

剩下的就是要在parser.add_argument中修改默认值了,否则你在调用mynet.py就必须准确的指定每一个参数。 
(4)写一个脚本文件,运行脚本文件就可以开始训练了。如

python train_xx.py --data-dir=xx --model-prefix==xx --gpus=0
# 如果想要在每次epoch结束时保存一个模型,那么model-prefix就不能为空
  • 1
  • 2
  • 1
  • 2

未完待续

这篇关于mxNet学习序列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1099579

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

uva 10131 最长子序列

题意: 给大象的体重和智商,求体重按从大到小,智商从高到低的最长子序列,并输出路径。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vect

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个