Module API, 定义在module包里面, 提供了一个中间和高-level的接口, 对于用符号运算。
可以把module想像成为一个能够执行由symbol来定义的一个程序。
比如 mod = mx.mod.Module(out), 这个out是前面的symbol计算的最终,可以理解为神经网络出来的结果。
神经网络到此基本上完成'计算图'的构建, 后面要给数据,初始化。。。。
在此基础上可以进行以下操作
mod.bind()
mod.init_params()
然后开始执行计算时有两种
一种是中间的
mod.forward()
mod.backward()
mod.update()
另外一种是高-level的接口
mod.fit(nd_iter, num_poch=10,....)
预测话就
mod.predict(new_nd_iter) # 在新的数据上预测。
BaseModule class:
这个是重点。BaseModule class 是其他module class的base class.
一个module有几个states:
1. initial state
此时内存还没有被分配, 所以这时候module还没有准备好计算
2. binded
输入,输出,参数的shapes都已经知道, 内存也分配好了,这时候module准备好了计算
3.parameters are initialized
对于一个有参数的modules,如果在计算之前没有初始化参数的话,可能会导致没有定义的输出
4. optimizer are installed
优化器可以安装到module, 这样的话,module中的参数可以根据这个优化器来进行更新参数,前提是当梯度计算完成后。
为了一个module和其他的进行interact, 它得能够在ininital state 阶段report下面的信息:
data_names:这是一个string类型的列表, 是用来表明需要的数据的名字
output_names:这也是一个string类型的列表, 来表明需要输出的结果的名字。
在binding之后, module应该能够report 下面的信息:
1.state information:
它包括 binded: bool (是否内存被分配)
for_training: (是否这个module 是用来training)
params_initialized : bool(是否module's 参数已经被初始化)
optimizer_initialized: bool(是否优化器被定义和初始化)
inputs_need_grad: bool (关于input data的数据是否需要。)
input/output information:
它包括: data_shapes : [(name, shape)]
label_shapes: [(name, shape)]
output_shapes: [(name, shape)]
parameters:
它包括: get_params(): 返回的是 (arg_params, aux_params)其中每一个都是一个字典,这个字典的key 是 name, value是ndarray类型的
set_params(arg_params, aux_params): 指定做计算所用的参数
init_params(...) : 一个更灵活的接口用来指定和初始参数。
setup:
这里面包括:
bind(): 准备计算环境
init_optimizer(): 安装优化器准备参数更新
prepare(): 根据当前的data batch 准备module
computation:
forward(data_batch)
backward()
update() : 根据 优化器来更新参数
get_outputs() : 获得前向计算的输出
get_input_grads(): 获得之前在后向计算时关于inputdata的梯度
update_metric(metric, labels): 根据之前前向计算的结果,更新performance metric
一些常用函数
- forward_backward(data_batch) : 可用来同时calls forward和backward
- score(eval_data, eval_metric, num_batch, .....)
意思是在eval_data上根据选择的模型评价 eval_metric来评价这个performance
比如
metric = mx.metric.Accuracy()
mod.score(val_dtaiter, metric)
也可以
mod.score(val_dataiter, ['mse', 'acc'])
- iter_predict(eval_data, num_batch=None, .....)
比如
for pred, i_batch, batch in module.iter_predict(eval_data):
- predict(eval_data, num_batch=None,merge_batches=True)
这个返回的是预测结果。如果想转化为numpy的话,可以.asnumpy()
比如mod.predict(eval_data= val_dataiter, num_batch=10)
- fit(train_data, eval_data=None, eval_metric='acc',....., optimizer='sgd', optimizer_params=(('learning_rage', 0.01)))
Initialize memory
BaseModule.bind(data_shapes, label_shapes=None, for_traing=True, inputs_need_grad=False, ....)
主要作用是bind symbols to construct executors.
这一步是非常有必要的在用module来计算之前。
比如可以这样
mod.bind(data_shapes=[('data', (1, 10, 10))])
或者当训练数据已经在的时候,
mod.bind(data_shapes=train_iter.provide_data, label_shapes=train_iter.provide_label)
init_optimizer :install and initializers 优化器
常用的参数是
mod.init_optimizer(optimizer='sgd', optimizer_params=(('learning_rate', 0.005), ))