Dive-into-DL-PyTorch项目解析:从零实现多层感知机(MLP)

Dive-into-DL-PyTorch项目解析:从零实现多层感知机(MLP)

Dive-into-DL-PyTorch 本项目将《动手学深度学习》(Dive into Deep Learning)原书中的MXNet实现改为PyTorch实现。 Dive-into-DL-PyTorch 项目地址: https://gitcode.com/gh_mirrors/di/Dive-into-DL-PyTorch

引言

在深度学习领域,多层感知机(Multi-Layer Perceptron, MLP)是最基础也是最重要的神经网络结构之一。本文将基于Dive-into-DL-PyTorch项目中的实现,详细讲解如何从零开始构建一个MLP模型,并应用于Fashion-MNIST图像分类任务。

1. 准备工作

在开始实现MLP之前,我们需要导入必要的Python库:

import torch
import numpy as np
import sys
sys.path.append("..")
import d2lzh_pytorch as d2l

这里我们主要使用PyTorch作为深度学习框架,numpy用于数值计算,d2lzh_pytorch是一个辅助工具包,提供了数据加载和训练可视化等功能。

2. 数据准备

我们使用Fashion-MNIST数据集,这是一个包含10类时尚物品的灰度图像数据集,每张图片大小为28×28像素:

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

设置batch_size为256意味着每次训练时我们会同时处理256张图片,这有助于提高训练效率并利用GPU的并行计算能力。

3. 模型参数初始化

MLP的核心是权重矩阵和偏置项。对于我们的网络结构:

num_inputs, num_outputs, num_hiddens = 784, 10, 256

W1 = torch.tensor(np.random.normal(0, 0.01, (num_inputs, num_hiddens)), dtype=torch.float)
b1 = torch.zeros(num_hiddens, dtype=torch.float)
W2 = torch.tensor(np.random.normal(0, 0.01, (num_hiddens, num_outputs)), dtype=torch.float)
b2 = torch.zeros(num_outputs, dtype=torch.float)

这里我们:

  1. 将28×28的图像展平为784维向量作为输入
  2. 设置隐藏层大小为256个神经元
  3. 输出层对应10个分类类别
  4. 使用正态分布初始化权重,均值为0,标准差为0.01
  5. 偏置项初始化为0

4. 激活函数实现

激活函数为神经网络引入了非线性因素。这里我们实现ReLU(Rectified Linear Unit)函数:

def relu(X):
    return torch.max(input=X, other=torch.tensor(0.0))

ReLU函数的数学表达式为f(x)=max(0,x),它能够有效缓解梯度消失问题,且计算效率高。

5. 网络结构定义

完整的MLP前向传播过程如下:

def net(X):
    X = X.view((-1, num_inputs))  # 展平图像
    H = relu(torch.matmul(X, W1) + b1)  # 隐藏层计算
    return torch.matmul(H, W2) + b2  # 输出层计算

这个网络包含:

  1. 输入层:784个神经元
  2. 隐藏层:256个神经元,使用ReLU激活
  3. 输出层:10个神经元,对应10个分类

6. 损失函数选择

对于多分类问题,我们使用交叉熵损失函数:

loss = torch.nn.CrossEntropyLoss()

PyTorch的CrossEntropyLoss已经内置了softmax运算,因此我们不需要在网络的最后一层显式添加softmax。

7. 模型训练

训练过程使用随机梯度下降(SGD)优化器:

num_epochs, lr = 5, 100.0
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, params, lr)

这里有几个关键点需要注意:

  1. 学习率设置为100.0看起来很大,这是因为PyTorch的损失计算和原书实现有所不同
  2. 训练5个epoch(完整遍历训练集的次数)
  3. 使用辅助函数train_ch3来完成训练循环和评估

8. 训练结果分析

训练过程中输出的指标如下:

epoch 1, loss 0.0030, train acc 0.714, test acc 0.753
epoch 2, loss 0.0019, train acc 0.821, test acc 0.777
epoch 3, loss 0.0017, train acc 0.842, test acc 0.834
epoch 4, loss 0.0015, train acc 0.857, test acc 0.839
epoch 5, loss 0.0014, train acc 0.865, test acc 0.845

可以看到:

  1. 训练准确率从71.4%提升到86.5%
  2. 测试准确率达到84.5%,表明模型具有良好的泛化能力
  3. 损失值持续下降,说明学习过程是有效的

9. 实现要点总结

  1. 参数初始化:合理的初始化对训练成功至关重要,这里使用小随机数初始化权重
  2. 激活函数选择:ReLU是目前最常用的激活函数之一
  3. 损失函数:交叉熵损失适合多分类问题
  4. 学习率调整:需要根据框架特性调整学习率大小
  5. 批量训练:使用批量数据可以提高训练效率和稳定性

10. 扩展思考

虽然这个简单的MLP已经能取得不错的效果,但在实际应用中我们还可以考虑:

  1. 增加网络深度(更多隐藏层)
  2. 使用更先进的优化器(如Adam)
  3. 添加正则化技术(如Dropout)防止过拟合
  4. 使用批量归一化(BatchNorm)加速训练

通过这个从零实现的MLP,我们不仅理解了神经网络的基本工作原理,也为后续学习更复杂的模型打下了坚实基础。

Dive-into-DL-PyTorch 本项目将《动手学深度学习》(Dive into Deep Learning)原书中的MXNet实现改为PyTorch实现。 Dive-into-DL-PyTorch 项目地址: https://gitcode.com/gh_mirrors/di/Dive-into-DL-PyTorch

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

宋溪普Gale

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

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

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

打赏作者

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

抵扣说明:

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

余额充值