1. 程式人生 > >Mxnet入門2 - 認識Executor 和 Module

Mxnet入門2 - 認識Executor 和 Module

介紹

初看mxnet 對 基於module的mxnet非常費解,這裡首先根據本人摸索經驗,總結對於基於module入門的順序應該如下:

  1. 熟悉基於Symbol的網路設計
  2. 熟悉基於Executor的網路前傳反傳計算
  3. 熟悉基於Module的網路訓練

上面入門順序回答了深度學習開發者使用框架最關心的三個問題,同時也列出了對應的mxnet中面向這三個問題所設計的class,下面介紹 Moudle 和 Executor基於以下假設:

  • 假設您已經有相應的深度學習開發經驗,並且對基礎知識理解非常到位
  • 假設您已經理解mxnet基於symbol的計算圖設計(這個很多blog有介紹了,就不費時間再寫部落格,後面會加連結,選一個合適的blog)

Mxnet 入門剩下的只需要理解 ExecutorModule 這兩個類即可

熟悉深度學習框架有幾個非常重要的問題:

  1. 如何設計網路(上面所說的基於symbol網路設計)
  2. 如何進行前傳和反傳計算(Executor就為了解決這個問題
  3. 如何進行網路訓練(Module就為了解決這個問題

看別的blog入門,其中一個問題是那些入門例子中,mxnet.executor.Executormxnet.module.Module區分不清,有些會用Executor寫例子,有些會用Module,這樣產生的問題是,這兩個東西是一樣的嗎?

這blog可以回答這個問題 Mxnet 中 Executor 和 Module的區別(關係)

先看官方介紹:

Executor

class Executor(object):

"""Executor is the object providing efficient symbolic graph execution and optimization.

Executor 是一個 Object

Executor 的作用是提供高效的符號圖執行和優化,怎麼理解這個,看Executor 類 提供的API

API當中通過名字基本可以看出各個API的作用,其中最重要的是forward函式和backward函式,Deeplearning 最重要的兩個操作的定義就在這裡

Module

class BaseModule(object):
    """The base class of a module.
    A module represents a computation component. One can think of module as a computation machine.
    A module can execute forward and backward passes and update parameters in a model.

Module是BaseMoudle 的子類,主要的定義在BaseModule當中

從定義中可以看出,Module的作用有三個 forward,bakcward,update parameters 

重點是:比Executor多了一個更新引數的功能

Module的定義是面向模型訓練的,Executor的定義是面向模型計算的

而模型計算(forward,backward)都是模型訓練中必不可少的過程,因此Module的定義中必然引用到Executor

  • 首先從Module的成員引數中觀察,包含了如下的引數:
class Module(BaseModule):
''''''
    def __init__(self, symbol, data_names=('data',), label_names=('softmax_label',),
                 logger=logging, context=ctx.cpu(), work_load_list=None,
                 fixed_param_names=None, state_names=None, group2ctxs=None,
                 compression_params=None):  
        ''''''  
        self._exec_group = None

這個_exec_group是Executor的例項

  • 然後從Moudle.forward()看
class Module(BaseModule):
''''''
    def forward(self, data_batch, is_train=None):
       ''''''
       self._exec_group.forward(data_batch, is_train)

前面的都可以忽略,我也沒看懂,看最後一行,執行的是Executor的forward函式,呼叫Executor,backward也是一樣

總結

Moudle是一個比Executor更高層的封裝,Module中封裝有Executor

Module面向模型訓練,包含有模型計算過程

Executor面向模型計算