MXNet符號編程

構成符號:html

符號對咱們想要進行的計算進行了描述, 下圖展現了符號如何對計算進行描述. 下圖定義了符號變量A, 符號變量B, 生成了符號變量C, 其中, A, B爲參數節點, C爲內部節點mxnet.symbol.Variable能夠生成參數節點, 用於表示計算時的輸入.node

一個Symbol具備的屬性和方法以下圖所示:python

對神經網絡進行配置:linux

一個Symbol的list_argument()屬性能夠用來檢查計算圖的輸入參數; list_output()屬性能夠返回此Symbol的全部輸出! 輸出的自動命名遵循了必定的規則,具體見下面的程序!網絡

input = mx.sym.Variable('data')  # 生成一個符號變量,名字是能夠隨便取的
fc1 = mx.sym.FullyConnected(data=input, num_hidden=128,name='fc1')  # 全鏈接層
act1 = mx.sym.Activation(fc1, act_type='relu')  # 激活

type(fc1) # mxnet.symbol.Symbol, act1的類型也是這個!!!
fc1.list_outputs() # ['fc1_output'],自動在輸入name屬性名的後面加上"_output"做爲本節點名稱
fc1.list_arguments() # ['data','fc1_weight','fc1_bias'],自動生成fc1_weight,fc1_bias兩個參數節點

act1.list_outputs() # ['actvation0_output'] 這個名字就不是隨便起的了!!!
act1.list_arguments() # ['data','fc1_weight','fc1_bias'

mxnet.symbol.Symbol.infer_shape(self, *args, **kwargs): 推測輸入參數和輸出參數的shape, 返回一個list of tuple;
函數

a = mx.sym.Variable('A')
b = mx.sym.Variable('B')
c = (a + b) / 10
d = c + 1
input_shapes = {'A':(10,2), 'B':(10,2)}   # 定義輸入的shape
d.infer_shape(**input_shapes) # ([(10L, 2L), (10L, 2L)], [(10L, 2L)], [])
arg_shapes, out_shapes, aux_shapes = d.infer_shape(**input_shapes)
In [1]: arg_shapes
Out[1]: [(10L, 2L), (10L, 2L)]

In [2]: out_shapes
Out[2]: [(10L, 2L)]

In [3]: aux_shapes
Out[3]: []

多輸入網絡實例:優化

下面的圖對一個多輸入神經網絡進行配置:spa

綁定以及執行Symbol:code

當須要對符號圖進行執行時,咱們須要調用綁定函數(bind function:*.bind)來綁定NDArrays(下圖中的a/b/d)參數節點(argument nodes: A/B/D,不是內部節點C/E),從而得到一個執行器(Executor)htm

而後,調用Executor.Forward 即可以獲得輸出結果.

A = mx.sym.Variable('A')
B = mx.sym.Variable('B')
C = A * B
D = mx.sym.Variable('D')
E = C + D
a = mx.nd.empty(1)  # 生成一個維度爲1的隨機值
b = mx.nd.ones(1)    # b等於1
d = mx.nd.ones(1)
executor = E.bind(ctx=mx.cpu(), args={'A':a, 'B':b, 'D':d})
type(executor)  # mxnet.executor.Executor
executor.arg_dict  # {'A': <NDArray 1 @cpu(0)>, 'B': <NDArray 1 @cpu(0)>, 'D': <NDArray 1 @cpu(0)>}
executor.forward()  # [<NDArray 1 @cpu(0)>]
executor.outputs[0]  # <NDArray 1 @cpu(0)>, 值呢? 仍是看不到值啊???
executor.outputs[0].asnumpy() # array([ 1.], dtype=float32)

 

一個Executor具備的屬性和方法以下圖所示:

綁定多個輸出:

咱們可使用mx.symbol.Group([])來將symbols進行分組,而後將它們進行綁定: 下圖中,A/B/D爲參數節點,C/E爲內部節點,將E/C綁定爲G,這樣,E和C的計算結果均可以獲得! 可是建議若是咱們只須要E的計算結果的話,建議只綁定E本身,這樣更加優化!

梯度計算:

在綁定函數中,能夠指定NDArrays來保存梯度,在Executor.forward()的後面調用Executor.backward()能夠獲得相應的梯度值.

神經網絡的簡單綁定接口:

有時,將一大推的NDArrays傳遞給綁定函數是很繁瑣的,Symbol.simple_bind()這個函數能夠幫助咱們簡化這個過程,你僅僅須要指定輸入數據的大小(shape),這個函數能夠定位到這個參數並將其綁定爲Executor.

輔助變量:

 

參考文獻:

[1] Symbolic Configuration and Execution in Pictures: http://mxnet-bing.readthedocs.io/en/latest/supported_languages/python/symbol_in_pictures.html

[2] MXNet實戰: http://www.linuxeden.com/html/news/20160413/165698.html

相關文章
相關標籤/搜索