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面向模型计算

猜你喜欢

转载自blog.csdn.net/qq_25379821/article/details/84936835