MLP(多层感知机)Pytorch底层+简洁代码实现【初学者】

1. 内容来源

10 多层感知机 + 代码实现 - 动手学深度学习v2_哔哩哔哩_bilibili10 多层感知机 + 代码实现 - 动手学深度学习v2共计4条视频,包括:感知机、多层感知机、代码实现等,UP主更多精彩视频,请关注UP账号。https://www.bilibili.com/video/BV1hh411U7gn/?spm_id_from=333.999.0.0&vd_source=f94822d3eca79b8e245bb58bbced6b77

2. 底层实现

2.1 数据集获取

本文依旧使用Fashion Mnist,数据下载源码详见本系列博客Softmax分类器一文

代码实现:

import torch
from torch import nn
from d2l import torch as d2l

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

2.2 模型参数初始化

MLP模型与线性回归以及Softmax分类不同在于使用多余1层的网络架构,中间层被称作隐藏层(Hidden Layer),并加入了非线性激活函数将网络转化成非线性网络(否则N层线性层可等价成单层线性层)

设置中间隐藏层神经元个数为256,则数据维数变化为784(输入)->256(隐藏层)->10(输出)

则参数初始化代码实现:

# Prameters

num_inputs, num_outputs, num_hiddens = 784, 10, 256

W1 = nn.Parameter(
    torch.randn(num_inputs, num_hiddens, requires_grad=True)
)
b1 = nn.Parameter(
    torch.zeros(num_hiddens, requires_grad=True))
W2 = nn.Parameter(
    torch.randn(num_hiddens, num_outputs, requires_grad=True)
)
b2 = nn.Parameter(
    torch.zeros(num_outputs, requires_grad=True))

params = [W1, b1, W2, b2]

2.3 模型构建

激活函数使用ReLU函数

代码实现:

def relu(X):
    a = torch.zeros_like(X)
    return torch.max(X, a)

第一层输出公式表示:

H = ReLU(X * W_1 + b _1)

其中,X,W_1,b_1分别为输入、第一层(输入层)的权重、偏置

第二层输出公式表示:

H * W_2 + b _2

其中,W_2,b_2分别为第二层(隐藏层)的权重和偏置

则代码实现:

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

Loss函数选用交叉熵(原始实现代码见本系列博客Softmax分类器一文)

代码实现:

loss = nn.CrossEntropyLoss()

2.4 模型训练

# Training
num_epochs, lr = 10, 0.01
updater = torch.optim.SGD(params, lr)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, updater)

结果:

其中Test Acc处于Train Acc下方,说明模型有一定的过拟合 

3. 简洁实现

3.1 模型构建

输入层和隐藏层使用torch.nn.Linear()表示

代码实现:

import torch
from torch import nn
from d2l import torch as d2l

# Model
net = nn.Sequential(
    nn.Flatten(), 
    nn.Linear(784, 256), 
    nn.ReLU(), 
    nn.Linear(256, 10)
    )

def init_weights(m):
    if type(m) == nn.Linear:
        nn.init.normal_(m.weight, std=0.1)
        

net.apply(init_weights)

模型展示:

Sequential(
  (0): Flatten(start_dim=1, end_dim=-1)
  (1): Linear(in_features=784, out_features=256, bias=True)
  (2): ReLU()
  (3): Linear(in_features=256, out_features=10, bias=True)
)

3.2 模型训练

# Training
batch_size, lr, num_epochs = 256, 0.1, 10
loss = nn.CrossEntropyLoss()
trainer = torch.optim.SGD(net.parameters(), lr=lr)

train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)

结果:

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云龙弓手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值