1. 程式人生 > >深度學習第三課 多層感知機

深度學習第三課 多層感知機

        多層感知機針對於中間有隱藏層的神經網路結構,對於資料的每一層傳遞都會相應的多一層[w,b],這中間使用的傳參函式稱之為啟用函式,如果啟用函式是線性的話,那麼就沒什麼意義,無論中間有多少層,其實和沒有隱藏層是一樣的,所以需要非線性的函式作為啟用函式。

        常使用的有sigmoid(),tanh(),Relu()等,sigmoid()函式在比較深的神經網路中容易出現梯度消失的情況,這是因為sigmoid在越遠離原點的位置梯度趨近於零,Relu()函式在輸入小於零時,會將資料轉化為零,會丟失一些資訊,不過影響不大,沒什麼關係,Relu()的優點主要是計算比較簡單。

        本次感知機的實現採用的啟用函式為Relu(),多層感知機手動實現:

%matplotlib inline
import gluonbook as gb
from mxnet import nd
from mxnet.gluon import loss as gloss

#引數初始化
batch_size = 256
train_iter,test_iter = gb.load_data_fashion_mnist(batch_size)
num_inputs,num_outputs,num_hiddens = 784,10,512

w1 = nd.random.normal(scale = 0.01,shape = (num_inputs,num_hiddens))
b1 = nd.zeros(num_hiddens)
w2 = nd.random.normal(scale = 0.01,shape = (num_hiddens,num_outputs))
b2 = nd.zeros(num_outputs)
params = [w1,b1,w2,b2]

for param in params:
    param.attach_grad()
    
#定義啟用函式Relu
def relu(x):
    return nd.maximum(x,0)
def net(x):
    x = x.reshape((-1,num_inputs))
    h = relu(nd.dot(x,w1)+b1)
    yhat = nd.dot(h,w2) + b2
    return yhat
#定義損失函式
loss = gloss.SoftmaxCrossEntropyLoss()   #直接使用了gluon庫中的Softmax運算和交叉熵損失計算的loss
#訓練模型
num_epochs , lr = 5,0.5
gb.train_ch3(net,train_iter,test_iter,loss,num_epochs,batch_size,params,lr)  #直接呼叫了gluonbook中的train_ch3函式,具體函式可看第二章的多層感知機
#通過改變隱藏層數發現,當增加隱藏層時,loss是減小的,而訓練精度和測試精度變化不大。

結果為:

1)maxinum()函式:

參考連結:https://blog.csdn.net/CSDN5529/article/details/79038544

多層感知機的gluon實現:

import gluonbook as gb
from mxnet import gluon,init
from mxnet.gluon import loss as gloss,nn

net = nn.Sequential()
net.add(nn.Dense(256,activation = 'relu'),nn.Dense(10))
net.initialize(init.Normal(sigma = 0.01))


#讀取資料,訓練模型
batch_size = 256
train_iter,test_iter = gb.load_data_fashion_mnist(batch_size)

loss = gloss.SoftmaxCrossEntropyLoss()
trainer = gluon.Trainer(net.collect_params(),'sgd',{'learning_rate':0.5})
num_epochs = 5
gb.train_ch3(net,train_iter,test_iter,loss,num_epochs,batch_size,None,None,trainer)

使用gluon結果: