分类问题与多层感知机
大家好呀,我又来了😊😊😊
源码在这里
文章目录
- PyTorch学习笔记:多层感知机与MNIST分类实战 🚀
- 1. `torchvision`库与内置数据集加载 📚
- 1.1 `torchvision`库介绍
- 1.2 MNIST数据集加载
- 1.3 `ToTensor`转换器作用
- 1.4 `DataLoader`核心功能
- 1.5 数据形状分析
- 1.6 数据可视化(代码示例)
- 2. 多层感知机(MLP)🧠
- 2.1 核心结构
- 2.2 核心公式
- 3. 激活函数 🔥
- 3.1 ReLU(修正线性单元)
- 3.2 Sigmoid
- 3.3 Tanh(双曲正切)
- 3.4 LeakyReLU
- 4. 关键知识点总结 📌
PyTorch学习笔记:多层感知机与MNIST分类实战 🚀
1. torchvision
库与内置数据集加载 📚
1.1 torchvision
库介绍
- 核心功能:处理图像和视频的PyTorch辅助库
- 主要组件:
- 常用数据集(MNIST, CIFAR等)
- 预训练模型(ResNet, VGG等)
- 图像转换函数
- 重要类:
torch.utils.data.Dataset
:所有数据集的基础类torch.utils.data.DataLoader
:批量加载数据的关键工具
import torchvision
from torchvision.transforms import ToTensor
1.2 MNIST数据集加载
train_ds = torchvision.datasets.MNIST('data/', train=True, transform=ToTensor(),download=True
)
test_ds = torchvision.datasets.MNIST('data/', train=False, transform=ToTensor()
)
参数解析:
- 数据存放位置:
'data/'
- 训练/测试集:
train=True/False
- 预处理:
transform=ToTensor()
🌟 - 下载选项:
download=True
1.3 ToTensor
转换器作用
- 将输入转换为张量
- 规范图片格式为
Channel × Height × Width
- 归一化像素值到[0,1]范围
1.4 DataLoader
核心功能
train_dl = torch.utils.data.DataLoader(train_ds, batch_size=64, shuffle=True
)
test_dl = torch.utils.data.DataLoader(test_ds, batch_size=64
)
四大功能:
- 乱序操作:
shuffle=True
- 批次采样:
batch_size
控制批次大小 - 并行加速:
num_workers
指定子进程数 - 批处理转换:
collate_fn
实现批次数据转换
1.5 数据形状分析
imgs, labels = next(iter(train_dl))
print(imgs.shape, labels.shape) # 输出: torch.Size([64, 1, 28, 28]), torch.Size([64])
- 每批次包含64张图片
- 图片格式:1通道 × 28高度 × 28宽度
- 标签格式:64个数字标签
1.6 数据可视化(代码示例)
import matplotlib.pyplot as plt
import numpy as npplt.figure(figsize=(10, 1))
for i, img in enumerate(imgs[:10]):npimg = img.numpy().squeeze()plt.subplot(1, 10, i+1)plt.imshow(npimg, cmap='gray')plt.axis('off')
plt.show()
👉 输出示例:显示10个手写数字图像及其对应标签
print(labels[:10]) # 输出示例: tensor([5, 0, 4, 1, 9, 2, 1, 3, 1, 4])
2. 多层感知机(MLP)🧠
2.1 核心结构
- 输入层 → 隐藏层 → 输出层
- 全连接:每层神经元与下一层所有神经元相连
- 深度:可包含多个隐藏层
2.2 核心公式
输出 = 激活函数(权重 · 输入 + 偏置)
3. 激活函数 🔥
3.1 ReLU(修正线性单元)
input = torch.randn(2)
output = torch.relu(input)
print(input, output) # 示例: tensor([-0.5, 1.5]) → tensor([0., 1.5])
特点:
- 计算高效:max(0, x)
- 缓解梯度消失
- 稀疏激活:约50%神经元激活
3.2 Sigmoid
output = torch.sigmoid(input)
print(input, output) # 示例: tensor([0., -2.]) → tensor([0.5000, 0.1192])
特点:
- 输出范围(0,1)
- 概率解释
- 梯度消失问题:两端饱和区梯度接近0
3.3 Tanh(双曲正切)
output = torch.tanh(input)
print(input, output) # 示例: tensor([0., 1.]) → tensor([0., 0.7616])
特点:
- 输出范围(-1,1)
- 零中心化
- 比sigmoid梯度更强
3.4 LeakyReLU
m = nn.LeakyReLU(0.1) # 负斜率=0.1
output = m(input)
print(input, output) # 示例: tensor([-1.0, 0.5]) → tensor([-0.1000, 0.5000])
特点:
- 解决"死亡ReLU"问题
- 负值区小梯度
- 需要手动设置负斜率
4. 关键知识点总结 📌
概念 | 要点 | 应用场景 |
---|---|---|
ToTensor | 归一化/格式标准化 | 图像预处理 |
DataLoader | 批处理/乱序/并行 | 高效数据加载 |
ReLU | 计算高效/缓解梯度消失 | 隐藏层首选 |
Sigmoid | 概率输出/二分类 | 输出层(二分类) |
Tanh | 零中心化 | RNN/LSTM |
LeakyReLU | 解决神经元死亡 | 深度网络 |
💡 经验法则:优先使用ReLU作为隐藏层激活函数,注意学习率设置以避免神经元死亡问题
通过本笔记,已掌握:
- 使用
torchvision
加载和处理MNIST数据集 ✅ - 理解
DataLoader
的核心功能 ✅ - 实现多种激活函数并理解其特性 ✅
- 构建多层感知机的基础知识 ✅