分类问题与多层感知机

发布于:2025-07-14 ⋅ 阅读:(15) ⋅ 点赞:(0)

大家好呀,我又来了😊😊😊
源码在这里

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()
)

参数解析:

  1. 数据存放位置'data/'
  2. 训练/测试集train=True/False
  3. 预处理transform=ToTensor() 🌟
  4. 下载选项download=True

1.3 ToTensor转换器作用

  1. 将输入转换为张量
  2. 规范图片格式为 Channel × Height × Width
  3. 归一化像素值到[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
)

四大功能:

  1. 乱序操作shuffle=True
  2. 批次采样batch_size控制批次大小
  3. 并行加速num_workers指定子进程数
  4. 批处理转换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 np

plt.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作为隐藏层激活函数,注意学习率设置以避免神经元死亡问题

通过本笔记,已掌握:

  1. 使用torchvision加载和处理MNIST数据集 ✅
  2. 理解DataLoader的核心功能 ✅
  3. 实现多种激活函数并理解其特性 ✅
  4. 构建多层感知机的基础知识 ✅

网站公告

今日签到

点亮在社区的每一天
去签到