训练笔记 Fine tune my first semantic segmentation model using mxnet [1] mxnet入门+个人总结

1. 关于mxnet的一些资料:

  • dmlc/mxnet-notebook: github上搜吧, mxnet作者们出的一个很好的可以用来当做tutorial的东西,用ipython notebook过一遍。
  • online document: http://mxnet.io/index.html 直接看API下的各种接口就可以了,但是严重不全...
  • github上各种issue,事实证明大家的问题各不一样,总的数量又很少,反正感觉自己遇到的都是新问题。。

2. Module API

http://mxnet.io/api/python/module.html

The most widely used module class is Module, which wraps a Symbol
and one or more Executors. We construct a module by specify:

  • symbol : the network Symbol
  • context : the device (or a list of devices) for execution
  • data_names : the list of data variable names
  • label_names : the list of label variable names

The module API provides an intermediate- and high-level interface for performing computation with neural networks in MXNet. A module is an instance of subclasses of BaseModule. The most widely used module class is simply called Module, which wraps a Symbol and one or more Executors. For a full list of functions, see BaseModule. Each subclass of modules might have some extra interface functions. In this topic, we provide some examples of common use cases. All of the module APIs are in the mxnet.module namespace, simply called mxnet.mod.

  • Module模块可以用来构建你的整个网络,比如mxnet.mod.Module(...)。除此之外,我们还要用fit()来指定输入(train, val)然后进行训练,可以执行predict(),score()等来得到输出,用set_params()等来将训练好的参数加载进网络, init_params()来初始化网络参数,可以选择不同的初始化方法,比如可以指定Xavier。总之对整个网络的各种设置、训练、初始化等都是由Module来wrap起来的。
  • fit()这个函数想特别说一下,它可以指定train_data和val_data来进行训练和交叉验证,两个变量都是迭代器类型,也就是 io API下定义的。不过val是可选项,还可以在这里指定optimizer和它的params,进行初始化等工作。
    fit
  • 另外想特别说的是bind(),因为在这里栽的挺惨的...bind的作用是得到一个真正可以跑的Executor,如果我们只是搭建了一个module,它是不可以用的,因为我们连内存都没有去申请。也就是说,bind之后才能fit。


    bind

    要注意的是,这个是module下的bind,我们只需要给出要输入网络的data和label就可以了,data_shapes和label_shapes分别是namedtuple类型,在这里我们需要知道他们的name和shape,并按照网络的组织一步步得到每一层的参数大小信息,利用这个去申请cpu或者gpu内存。注意module中的每一层都会有一个自己的名字。用module去bind之后,可以得到整个网络的大小。感兴趣的可以看一下mxnet/python/mxnet/module/module.py下的bind()函数,它进入到executor_group.py下的DataParallelExecutorGroup()中,可以得到网络的一组executor,注意每一块symbol (后面会说到symbol,这里先理解为组成网络的每一层或者每一块)是对应一个executor的,这也就是为什么每一个module网络其实有一组executor。bind_exec()中会把每一个executor都存在一个list里面,贴一下代码比较直观

  def bind_exec(self, data_shapes, label_shapes, shared_group):    
    """
    Bind executors on their respective devices.   
    Parameters    
    ----------    
    data_shapes : list    
    label_shapes : list    
    shared_group : DataParallelExecutorGroup    
    """    
    self.execs = []    
    for i in range(len(self.contexts)):
      self.execs.append(self._bind_ith_exec(i, data_shapes, label_shapes, shared_group))
  
  ............(以下省略一坨)

self._bind_ith_exec()最后一句是:

executor = self.symbol.bind(ctx=context, args=arg_arrays, args_grad=grad_arrays, aux_states=aux_arrays, grad_req=self.grad_req, shared_exec=shared_exec)

这里的symbol.bind和module.bind是不一样的,一开始我给混了,其实这个bind是针对每一个symbol的,想看懂symbol和executor的可以移步这里。一定要明白:只有bind之后才真正有了executor,看到网上有人这样说:

Executor申请所有需要的内存和临时变量来进行计算。一旦绑定好,Executor会一直同一段内存空间做计算输入和输出。在执行一个符号表达式前,需要对所有的自由变量进行赋值,执行完forward后softmax的输出。

3. Model API

使用方法很简单,具体参考http://mxnet.io/api/python/model.html#model-api-reference

4. Symbol API

MXNet使用多值输出的符号表达式来声明计算图。符号是由操作子构建而来。一个操作子可以是一个简单的矩阵运算“+”,也可以是一个复杂的神经网络里面的层,例如卷积层。

# Output may vary
net = mx.sym.Variable('data')
net = mx.sym.FullyConnected(data=net, name='fc1', num_hidden=128)
net = mx.sym.Activation(data=net, name='relu1', act_type="relu")
net = mx.sym.FullyConnected(data=net, name='fc2', num_hidden=10)
net = mx.sym.SoftmaxOutput(data=net, name='out')
mx.viz.plot_network(net, shape={'data':(100,200)})

上述代码摘自mxnet notebook,它构建了一个非常简单的网络。可以看出,我们在搭建网络层次的时候需要指明输入、symbol的名字和一些其他的因结构而异的参数。

网络示意图

我们可以使用mxnet提供的各种神经网络层的符号接口,比如dropout, convolution, deconvolution, softmax等来搭建自己的网络。通常来讲,搭建复杂网络的时候我们可以在mxnet的symbol上再自己进行一次封装,比如把conv, batchnorm, relu层一起构建为一个网络模块方便调用。每一个层的命名也决定了这一层参数的命名,比如fc2层的参数名称默认为fc2_weight和fc2_bias。当我们fine tune一个网络,拿到的.params参数文件就是依靠这些名字把参数fit进网络的,通常来讲比如我们用ImageNet上的pre-trained网络来做我们自己的任务,如果最后层是fully-connected层那么很可能维度不一致,比如我们只分10类,而pre-trained网络分1000类。这个时候为了让set_params()的时候最后一层的参数不fit进去,我们可以把已有的net的最后层的名字改掉,这样参数就不会fit进去了,只需要重新初始化再去fine tune就可以了。

5. IO API

mxnet提供了几种不同的数据输入方式,最基本的都是从DataIter继承而来。比较常用的有mxnet.io.NDArrayIter, mxnet.io.ImageRecordIter。数据迭代器需要有reset()以进行下一轮迭代, 并需要提供读入下一组batch的next()接口,provide_data()和provide_label()提供输入输出数据的维度。

一种用于图片分类的常用数据迭代器就是ImageRecordIter,使用这个迭代器需要给出图片list文件,进而用im2rec生成可以读入的文件。它的缺点是对单张图片只能用单个label或者几个label,对于parsing任务来说就不能用了,只能用NADarrayIter,但是这个迭代器缺少一些必要的对图片的预处理,比如对图片进行在线crop。如果需要实现这些,就要我们自己去实现一个迭代器,实现的时候可以参考mxnet下example/fcn-xs这个例子。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容