Mxnet入门2 - 认识Executor 和 Module
介绍
初看mxnet 对 基于module的mxnet非常费解,这里首先根据本人摸索经验,总结对于基于module入门的顺序应该如下:
- 熟悉基于Symbol的网络设计
- 熟悉基于Executor的网络前传反传计算
- 熟悉基于Module的网络训练
上面入门顺序回答了深度学习开发者使用框架最关心的三个问题,同时也列出了对应的mxnet中面向这三个问题所设计的class,下面介绍 Moudle 和 Executor基于以下假设:
- 假设您已经有相应的深度学习开发经验,并且对基础知识理解非常到位
- 假设您已经理解mxnet基于symbol的计算图设计(这个很多blog有介绍了,就不费时间再写博客,后面会加链接,选一个合适的blog)
Mxnet 入门剩下的只需要理解 Executor 和 Module 这两个类即可
熟悉深度学习框架有几个非常重要的问题:
- 如何设计网络(上面所说的基于symbol网络设计)
- 如何进行前传和反传计算(Executor就为了解决这个问题)
- 如何进行网络训练(Module就为了解决这个问题)
看别的blog入门,其中一个问题是那些入门例子中,mxnet.executor.
Executor
和 mxnet.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面向模型计算