从零开始学习MXnet(三)之Model和Module

  在我们在MXnet中定义好symbol、写好dataiter并且准备好data之后,就可以开开心的去训练了。一般训练一个网络有两种常用的策略,基于model的和基于module的。今天,我想谈一谈他们的使用。

一、Model

  按照老规矩,直接从官方文档里面拿出来的代码看一下:

  

 # configure a two layer neuralnetwork
    data = mx.symbol.Variable(‘data‘)
    fc1 = mx.symbol.FullyConnected(data, name=‘fc1‘, num_hidden=128)
    act1 = mx.symbol.Activation(fc1, name=‘relu1‘, act_type=‘relu‘)
    fc2 = mx.symbol.FullyConnected(act1, name=‘fc2‘, num_hidden=64)
    softmax = mx.symbol.SoftmaxOutput(fc2, name=‘sm‘)
# create a model using sklearn-style two-step way
#创建一个model
   model = mx.model.FeedForward(
         softmax,
         num_epoch=num_epoch,
         learning_rate=0.01)
#开始训练
    model.fit(X=data_set)

  具体的API参照http://mxnet.io/api/python/model.html。

  然后呢,model这部分就说完了。。。之所以这么快主要有两个原因:

    1.确实东西不多,一般都是查一查文档就可以了。

    2.model的可定制性不强,一般我们是很少使用的,常用的还是module。

二、Module

  Module真的是一个很棒的东西,虽然深入了解后,你会觉得“哇,好厉害,但是感觉没什么鸟用呢”这种想法。。实际上我就有过,现在回想起来,从代码的设计和使用的角度来讲,Module确实是一个非常好的东西,它可以为我们的网络计算提高了中级、高级的接口,这样一来,就可以有很多的个性化配置让我们自己来做了。

  Module有四种状态:

    1.初始化状态,就是显存还没有被分配,基本上啥都没做的状态。

    2.binded,在把data和label的shape传到Bind函数里并且执行之后,显存就分配好了,可以准备好计算能力。

    3.参数初始化。就是初始化参数

    3.Optimizer installed 。就是传入SGD,Adam这种optimuzer中去进行训练 

 先上一个简单的代码:

  

import mxnet as mx

    # construct a simple MLP
    data = mx.symbol.Variable(‘data‘)
    fc1  = mx.symbol.FullyConnected(data, name=‘fc1‘, num_hidden=128)
    act1 = mx.symbol.Activation(fc1, name=‘relu1‘, act_type="relu")
    fc2  = mx.symbol.FullyConnected(act1, name = ‘fc2‘, num_hidden = 64)
    act2 = mx.symbol.Activation(fc2, name=‘relu2‘, act_type="relu")
    fc3  = mx.symbol.FullyConnected(act2, name=‘fc3‘, num_hidden=10)
    out  = mx.symbol.SoftmaxOutput(fc3, name = ‘softmax‘)

    # construct the module
    mod = mx.mod.Module(out)

     mod.bind(data_shapes=train_dataiter.provide_data,
         label_shapes=train_dataiter.provide_label)

     mod.init_params()
     mod.fit(train_dataiter, eval_data=eval_dataiter,
            optimizer_params={‘learning_rate‘:0.01, ‘momentum‘: 0.9},
            num_epoch=n_epoch)

  分析一下:首先是定义了一个简单的MLP,symbol的名字就叫做out,然后可以直接用mx.mod.Module来创建一个mod。之后mod.bind的操作是在显卡上分配所需的显存,所以我们需要把data_shapehe label_shape传递给他,然后初始化网络的参数,再然后就是mod.fit开始训练了。这里补充一下。fit这个函数我们已经看见两次了,实际上它是一个集成的功能,mod.fit()实际上它内部的核心代码是这样的:

  

for epoch in range(begin_epoch, num_epoch):
             tic = time.time()
             eval_metric.reset()
             for nbatch, data_batch in enumerate(train_data):
                 if monitor is not None:
                     monitor.tic()
                 self.forward_backward(data_batch) #网络进行一次前向传播和后向传播
                 self.update()  #更新参数
                 self.update_metric(eval_metric, data_batch.label) #更新metric 

                 if monitor is not None:
                     monitor.toc_print() 

                 if batch_end_callback is not None:
                     batch_end_params = BatchEndParam(epoch=epoch, nbatch=nbatch,
                                                      eval_metric=eval_metric,
                                                      locals=locals())
                     for callback in _as_list(batch_end_callback):
                         callback(batch_end_params)

  正是因为module里面我们可以使用很多intermediate的interface,所以可以做出很多改进,举个最简单的例子:如果我们的训练网络是大小可变怎么办? 我们可以实现一个mutumodule,基本上就是,每次data的shape变了的时候,我们就重新bind一下symbol,这样训练就可以照常进行了。

  

  总结:实际上学一个框架的关键还是使用它,要说诀窍的话也就是多看看源码和文档了,我写这些博客的目的,一是为了记录一些东西,二是让后来者少走一些弯路。所以有些东西不会说的很全。。

  

时间: 2024-10-27 05:40:54

从零开始学习MXnet(三)之Model和Module的相关文章

从零开始学习jQuery (三) 管理jQuery包装集

本系列文章导航 从零开始学习jQuery (三) 管理jQuery包装集 一.摘要 在使用jQuery选择器获取到jQuery包装集后, 我们需要对其进行操作. 本章首先讲解如何动态的创建元素, 接着学习如何管理jQuery包装集, 比如添加,删除,切片等. 二.前言 本系列的2,3篇上面列举了太多的API相信大家看着眼晕. 不过这些基础还必须要讲, 基础要扎实.其实对于这些列表大家可以跳过, 等以后用到时再回头看或者查询官方的API说明. 本章内容很少, 主要讲解动态创建元素和操作jQuery

从零开始学习MXnet(五)MXnet的黑科技之显存节省大法

写完发现名字有点拗口..- -# 大家在做deep learning的时候,应该都遇到过显存不够用,然后不得不去痛苦的减去batchszie,或者砍自己的网络结构呢? 最后跑出来的效果不尽如人意,总觉得自己被全世界针对了..遇到这种情况怎么办? 请使用MXnet的天奇大法带你省显存! 鲁迅曾经说过:你不去试试,怎么会知道自己的idea真的是这么糟糕呢? 首先是传送门附上 mxnet-memonger,相应的paper也是值得一看的 Training Deep Nets with Sublinea

从零开始学习MXnet(一)

一.MXnet数据预处理 整个数据预处理的代码都集成在了toosl/im2rec.py中了,这个首先要造出一个list文件,lst文件有三列,分别是index label 图片路径.如下图所示: 我这个label是瞎填的,所以都是0.另外最新的MXnet上面的im2rec是有问题的,它生成的list所有的index都是0,不过据说这个index没什么用.....但我还是改了一下.把yield生成器换成直接append即可. 执行的命令如下: sudo python im2rec.py --lis

从零开始学习Object-C---第三天

今天主要涉及Object-C中类,对象和方法的使用,这也是与C语言不同的地方,C语言被定义为过程性语言,而Object-C则像Java和C#一样是面向对象.一段代码开始新的学习,首先新建文件 main.m 主函数, NSObject+Fraction.h(如同java中定义接口)和NSObject+Fraction.m(如同java中接口实现类) // // NSObject+Fraction.h // Demo1 // // Created by lee on 14/10/28. // Cop

NHibernate 学习笔记(三)——模型(model)

1.模型的组成元素 模型的组成是由实体类型(Entity)和属性值(value object)组成的:比如:人是一个模型,人名是一个实体,人的名字又有 “姓” 和“名”,“姓”和"名"就是属性值: 2.实体的关系 实体的关系分为三种,一对一(one to one ) .一对多(many to many).多对多(many to many): 下面用几张图来说明关系: 2.1 一对一: 2.2一对多 2.3 多对多 2.4 完整的体现所有的实体关系图

oracle从零开始学习笔记 三

笔试题 设有关系EMP(ENO,ENAME,SALARY,DNO)其中各属性的含义依次为职工号.姓名.工资.所在部门号, 以及关系DEPT(DNO,DNAME,MANAGER)其中各含义依次为部门号.部门名称.部门经理的职工号 1.请通过SQL语句创建表EMP.DEPT. create table emp(eno number(5) primary key ,ename varchar2(5),salary number(8),dno number(3)); create table dept(

Redis从零开始学习教程三:key值的有效期

Redis 是一种存储系统,类似数据库,和缓存的差别是,缓存有有效期,而Redis默认无有效期,或者说,默认有效期为永久 但是Redis可以当做缓存使用.这时候需要针对各个key设置有效期. 有效期单位默认为S秒,如果有更加高的精度要求,可以设置为毫秒ms 1:设置失效期命令 expire 失效期: expire age 3600 默认为当前key age 3600秒以后失效. 2:查看key的剩余有效时间 ttl age 3:失效期设置口令,同一个key ,最新一次的设置将覆盖前面的设置时间

从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件

原文:从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件 本系列文章导航 从零开始学习jQuery (一) 开天辟地入门篇 从零开始学习jQuery (二) 万能的选择器 从零开始学习jQuery (三) 管理jQuery包装集 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式 从零开始学习jQuery (五) 事件与事件对象 从零开始学习jQuery (六) jQuery中的Ajax 从零开始学习jQuery (七) jQuery动画-让页面动起来! 从零

从零开始学习jQuery (十) jQueryUI常用功能实战

原文:从零开始学习jQuery (十) jQueryUI常用功能实战 本系列文章导航 从零开始学习jQuery (一) 开天辟地入门篇 从零开始学习jQuery (二) 万能的选择器 从零开始学习jQuery (三) 管理jQuery包装集 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式 从零开始学习jQuery (五) 事件与事件对象 从零开始学习jQuery (六) jQuery中的Ajax 从零开始学习jQuery (七) jQuery动画-让页面动起来! 从零开始