mxnet,gluon構建網絡的區別

學習資料參考李沐gluon講義。

mxnet,gluon構建網絡的區別體現在4方面。下面以簡單的drop out爲例一一對比說明。

1 構建dropout

ndarray:

def dropout(X, drop_prob):
    assert 0 <= drop_prob <= 1
    keep_prob = 1 - drop_prob
    # 這種情況下把全部元素都丟棄。
    if keep_prob == 0:
        return X.zeros_like()
    mask = nd.random.uniform(0, 1, X.shape) < keep_prob
    return mask * X / keep_prob

gluon:

from mxnet import nn
 
drop_prob = 0.2
nn.Dropout(drop_prob)

 

2 構建網絡

ndarray:

input dim要定義(i.e.  num_inputs), net的dim在param裏定義,net列出包含activation functions的linear計算表達式即可

num_inputs, num_outputs, num_hiddens1, num_hiddens2 = 784, 10, 256, 256
 
def net(X):
    X = X.reshape((-1, num_inputs))
    H1 = (nd.dot(X, W1) + b1).relu()
    if autograd.is_training():  # 只在訓練模型時使用丟棄法。
        H1 = dropout(H1, drop_prob1)  # 在第一層全連接後添加丟棄層。
    H2 = (nd.dot(H1, W2) + b2).relu()
    if autograd.is_training():
        H2 = dropout(H2, drop_prob2)  # 在第二層全連接後添加丟棄層。
    return nd.dot(H2, W3) + b3

gluon:

from mxnet.gluon import nn
net = nn.Sequential()
net.add(nn.Dense(256, activation="relu"),
        nn.Dropout(drop_prob1),  # 在第一個全連接層後添加丟棄層。
        nn.Dense(256, activation="relu"),
        nn.Dropout(drop_prob2),  # 在第二個全連接層後添加丟棄層。
        nn.Dense(10))

3 構建參數

ndarray:

手動每一層w,b 初始化,並attach_grad

num_inputs, num_outputs, num_hiddens1, num_hiddens2 = 784, 10, 256, 256
 
W1 = nd.random.normal(scale=0.01, shape=(num_inputs, num_hiddens1))
b1 = nd.zeros(num_hiddens1)
W2 = nd.random.normal(scale=0.01, shape=(num_hiddens1, num_hiddens2))
b2 = nd.zeros(num_hiddens2)
W3 = nd.random.normal(scale=0.01, shape=(num_hiddens2, num_outputs))
b3 = nd.zeros(num_outputs)
 
params = [W1, b1, W2, b2, W3, b3]
for param in params:
    param.attach_grad()

gluon:

net.initialize(init.Normal(sigma=0.01))

4 更新參數

ndarray:

需要手動更新,如sgd(params, lr, batch_size)

def sgd(params, lr, batch_size):
    """Mini-batch stochastic gradient descent."""
    for param in params:
        param[:] = param - lr * param.grad / batch_size

gluon:

from mxnet import gluon
 
lr = 0.1
batch_size = 256
trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': lr})
 
'''then in the data feeding loop'''
trainer.step(batch_size)

From: mxnet和gluon學習筆記二——mxnet,gluon構建網絡的區別

 

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