Mxnet Module API

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章