深度學習第三課 多層感知機
阿新 • • 發佈:2018-11-11
多層感知機針對於中間有隱藏層的神經網路結構,對於資料的每一層傳遞都會相應的多一層[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結果: