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), ))