深度学习第三课 多层感知机

        多层感知机针对于中间有隐藏层的神经网络结构,对于数据的每一层传递都会相应的多一层[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结果:

猜你喜欢

转载自blog.csdn.net/dake13/article/details/83117523