动手学习深度学习2-1多层感知机

多层感知机在单层神经网络的基础上引入了一到多个隐藏层(hidden layer)。隐藏层位于输入层和输出层之间

从联立后的式子可以看出,虽然神经网络引入了隐藏层,却依然等价于一个单层神经网络:其中输出层权重参数为 ,偏差参数为 。不难发现,即便再添加更多的隐藏层,以上设计依然只能得到仅含输出层的单层神经网络。 

激活函数: 

上述问题的根源在于全连接层只是对数据做仿射变换(affine transformation),而多个仿射变换的叠加仍然是一个仿射变换。解决问题的一个方法是引入非线性变换,例如对隐藏变量使用按元素操作的非线性函数进行变换,然后再作为下一个全连接层的输入。这个非线性函数被称为激活函数(activation function)。

RELU函数:

ReLU 函数只保留正数元素,并将负数元素清零。

小结:

  • 多层感知机在输出层与输入层之间加入了一个或多个全连接隐藏层,并通过激活函数对隐藏层输出进行变换。
  • 常用的激活函数包括 ReLU 函数、sigmoid 函数和 tanh 函数。
%matplotlib inline
import gluonbook as gb
from mxnet import nd
from mxnet.gluon import loss as gloss

#使用 Fashion-MNIST 数据集。我们将使用多层感知机对图像进行分类
batch_size=256
# train_iter, test_iter = gb.load_data_fashion_mnist(batch_size)
train_iter,test_iter=gb.load_data_fashion_mnist(batch_size)
# Fashion-MNIST 数据集中图像形状为  28×28 ,类别数为 10。
# 本节中我们依然使用长度为28×28=784  的向量表示每一张图像。
# 因此,输入个数为 784,输出个数为 10。实验中,我们设超参数隐藏单元个数为 256。


# 定义模型参数
num_inputs,num_outputs,num_hiddens=784,10,256
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()#attach.grad()就是为参数梯度开辟空间,以助于参数更新的时候进行访问
    


#定义激活函数
def relu(X):
    return nd.maximum(X, 0)

#定义模型
# 同 softmax 回归一样,我们通过reshape函数将每张原始图像改成长度为num_inputs的向量。
# 然后我们实现上一节多层感知机的计算表达式

def net(X):
    X = X.reshape((-1, num_inputs))
    H = relu(nd.dot(X, W1) + b1)
    return nd.dot(H, W2) + b2

#定义损失函数
# 更好的数值稳定性,我们直接使用 Gluon 提供的包括 softmax 运算和交叉熵损失计算的函数。
loss = gloss.SoftmaxCrossEntropyLoss()

#训练模型
# 训练多层感知机的步骤和之前训练 softmax 回归的步骤没什么区别。我们直接调用gluonbook包中的train_ch3函数
num_epochs,lr=5,0.5
# gb.train_ch3(net,train_iter,test_iter,loss,num_epochs,batch_size,params,lr)
gb.train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size,params, lr)

多层感知机gluon实现

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

# 定义模型
# 和 softmax 回归唯一的不同在于,我们多加了一个全连接层作为隐藏层。
# 它的隐藏单元个数为 256,并使用 ReLU 作为激活函数。
net=nn.Sequential()
net.add(nn.Dense(256,activation='relu'),
       nn.Dense(10))
net.initialize(init.Normal(sigma=0.01))
# 我们使用和训练 softmax 回归几乎相同的步骤来读取数据并训练模型
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)

猜你喜欢

转载自blog.csdn.net/qq_36666756/article/details/83268496
今日推荐