欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mxnet (5):多层感知机(multilayer perceptron,MLP)

程序员文章站 2024-03-14 09:43:10
...

在softmax回归的基础上实现,将模型网络换成多层感知机。

1.数据

数据跟softmax回归一样使用Fashion-MNIST图像分类数据集。

from d2l import mxnet as d2l
from mxnet import gluon, np, npx, autograd, init
from plotly.offline import plot, init_notebook_mode
import plotly.graph_objs as go
init_notebook_mode(connected=True)
npx.set_np()
ctx = npx.gpu() if (npx.num_gpus()) > 0 else mx.cpu()

batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)

2. 创建模型参数

  • 输入同样是28×28=784,输出同样是10个种类,这里添加一个具有256个隐藏单元的隐藏层。
  • 对于每一层都要有一个权重矩阵和一个偏差向量
num_inputs = 28*28
num_hiddens = 256
num_outputs = 10

W1 = np.random.normal(scale=0.01, size=(num_inputs, num_hiddens), ctx=ctx)
b1 = np.zeros(num_hiddens, ctx=ctx)
W2 = np.random.normal(scale=0.01, size=(num_hiddens, num_outputs), ctx=ctx)
b2 = np.zeros(num_outputs, ctx=ctx)
params = [W1, b1, W2, b2]

for param in params:
    param.attach_grad()

3.创建**函数

通过使用maximum函数模拟ReLU**函数

def relu(X):
    return np.maximum(X, 0)

4. 模型

因为我们不考虑空间结构,所以我们将reshape每个二维图像变成一个长度为long的平面向量num_inputs。

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

5.损失函数

利用高级API的集成函数来计算softmax和交叉熵损失

loss = gluon.loss.SoftmaxCrossEntropyLoss()

6.优化函数

适用sgd,学习效率0.1

lr = 0.1
def updater(batch_size):
    return d2l.sgd(params, lr, batch_size)

7. 训练

  • 训练10个epochs
  • 使用完成softmax时使用的训练模型
num_epochs = 10
result = train(net, train_iter, test_iter, loss, num_epochs, updater)
  • 可视化结果
draw_graph(result)

Mxnet (5):多层感知机(multilayer perceptron,MLP)

8. 简化

与softmax的模型设置基本相同,就是在网络中添加一个256个隐藏单元的隐藏层。mxnet允许在神经层中指定**函数,这点pytorch不同

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

8.1 trainer

trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': lr})

8.2 训练

训练30个epochs

num_epochs=30
result = train(net, train_iter, test_iter, loss, num_epochs, trainer)
draw_graph(result)

Mxnet (5):多层感知机(multilayer perceptron,MLP)

可以看出训练准确率一直在增加,而测试准确率之后20epoch之后趋平,甚至有下降趋势,这个是应为模型训练过渡会出现过拟合的现象。

9. 参考

https://d2l.ai/chapter_multilayer-perceptrons/mlp-concise.html

10. 代码

github