從零開始學習MXnet(三)之Model和Module

來源:互聯網
上載者:User

標籤:cte   eset   角度   提高   poc   需要   ons   狀態   epo   

  在我們在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,這樣訓練就可以照常進行了。

  

  總結:實際上學一個架構的關鍵還是使用它,要說訣竅的話也就是多看看源碼和文檔了,我寫這些部落格的目的,一是為了記錄一些東西,二是讓後來者少走一些彎路。所以有些東西不會說的很全。。

 

  

從零開始學習MXnet(三)之Model和Module

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.