尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

PyTorch 2.0 CNN 图像分类实战:FashionMNIST 数据集 3 轮训练达 88% 准确率

PyTorch 2.0 CNN 图像分类实战:FashionMNIST 数据集 3 轮训练达 88% 准确率
📅 发布时间:2026/7/8 17:25:44

PyTorch 2.0 实战:3轮训练实现FashionMNIST图像分类88%准确率

当我们需要快速验证一个图像分类模型的有效性时,FashionMNIST数据集和PyTorch的组合往往能提供绝佳的实验平台。这个经典的服装分类数据集不仅体积小巧适合快速迭代,还保留了真实图像数据的核心特征。本文将展示如何用PyTorch 2.0构建一个精简但高效的CNN模型,仅用3个训练周期就达到88%的测试准确率。

1. 环境准备与数据加载

让我们从最基础的环境配置开始。确保已安装PyTorch 2.0或更高版本,这是体验最新性能优化的关键。虽然本文示例可以在CPU上运行,但如果有CUDA兼容的GPU,训练速度将显著提升。

import torch from torch import nn import torchvision from torchvision import datasets, transforms from torch.utils.data import DataLoader # 检查PyTorch版本和设备 print(f"PyTorch版本: {torch.__version__}") device = "cuda" if torch.cuda.is_available() else "cpu"

FashionMNIST数据集包含10类服装的灰度图像,每张28x28像素。PyTorch内置了这个数据集,我们可以直接下载并使用:

# 定义数据转换 transform = transforms.Compose([ transforms.ToTensor(), ]) # 下载并加载数据集 train_data = datasets.FashionMNIST( root="data", train=True, download=True, transform=transform ) test_data = datasets.FashionMNIST( root="data", train=False, download=True, transform=transform ) # 创建数据加载器 BATCH_SIZE = 32 train_loader = DataLoader(train_data, batch_size=BATCH_SIZE, shuffle=True) test_loader = DataLoader(test_data, batch_size=BATCH_SIZE, shuffle=False) # 查看类别名称 class_names = train_data.classes print(f"类别列表: {class_names}")

提示:将shuffle设为True可以防止模型学习到数据顺序带来的偏差,这对训练效果至关重要。

2. CNN模型架构设计

我们的目标是构建一个足够简单但有效的CNN结构。这个模型将包含两个卷积块,每个块由卷积层、ReLU激活和最大池化组成,最后接全连接层进行分类。

class FashionMNIST_CNN(nn.Module): def __init__(self, input_shape: int, hidden_units: int, output_shape: int): super().__init__() self.conv_block_1 = nn.Sequential( nn.Conv2d(in_channels=input_shape, out_channels=hidden_units, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2) ) self.conv_block_2 = nn.Sequential( nn.Conv2d(in_channels=hidden_units, out_channels=hidden_units, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2) ) self.classifier = nn.Sequential( nn.Flatten(), nn.Linear(in_features=hidden_units*7*7, # 为什么是7*7?两次池化后28x28→14x14→7x7 out_features=output_shape) ) def forward(self, x): x = self.conv_block_1(x) x = self.conv_block_2(x) x = self.classifier(x) return x # 初始化模型 model = FashionMNIST_CNN(input_shape=1, # 灰度图单通道 hidden_units=10, output_shape=len(class_names)).to(device)

这个架构虽然简单,但包含了CNN的核心要素:

  • 局部感受野:3x3卷积核捕捉局部特征
  • 非线性激活:ReLU引入非线性表达能力
  • 下采样:最大池化减少计算量同时保持特征不变性
  • 全连接分类:最后将特征映射到10个类别

3. 训练流程实现

训练循环是深度学习的核心引擎。我们将定义损失函数、优化器,并实现完整的训练和测试步骤。

# 设置损失函数和优化器 loss_fn = nn.CrossEntropyLoss() optimizer = torch.optim.SGD(params=model.parameters(), lr=0.1) # 定义准确率计算函数 def accuracy_fn(y_true, y_pred): correct = torch.eq(y_true, y_pred).sum().item() acc = (correct / len(y_pred)) * 100 return acc # 训练步骤 def train_step(model: nn.Module, data_loader: DataLoader, loss_fn: nn.Module, optimizer: torch.optim.Optimizer, accuracy_fn, device: torch.device = device): train_loss, train_acc = 0, 0 model.train() for batch, (X, y) in enumerate(data_loader): X, y = X.to(device), y.to(device) # 前向传播 y_pred = model(X) # 计算损失 loss = loss_fn(y_pred, y) train_loss += loss train_acc += accuracy_fn(y_true=y, y_pred=y_pred.argmax(dim=1)) # 优化器清零梯度 optimizer.zero_grad() # 反向传播 loss.backward() # 参数更新 optimizer.step() # 计算平均损失和准确率 train_loss /= len(data_loader) train_acc /= len(data_loader) print(f"训练损失: {train_loss:.5f} | 训练准确率: {train_acc:.2f}%") # 测试步骤 def test_step(model: nn.Module, data_loader: DataLoader, loss_fn: nn.Module, accuracy_fn, device: torch.device = device): test_loss, test_acc = 0, 0 model.eval() with torch.inference_mode(): for X, y in data_loader: X, y = X.to(device), y.to(device) # 前向传播 test_pred = model(X) # 计算损失和准确率 test_loss += loss_fn(test_pred, y) test_acc += accuracy_fn(y_true=y, y_pred=test_pred.argmax(dim=1)) # 计算平均损失和准确率 test_loss /= len(data_loader) test_acc /= len(data_loader) print(f"测试损失: {test_loss:.5f} | 测试准确率: {test_acc:.2f}%\n")

4. 模型训练与性能评估

现在让我们启动训练流程,仅用3个epoch观察模型表现:

# 设置随机种子保证可重复性 torch.manual_seed(42) # 训练3个epoch epochs = 3 for epoch in range(epochs): print(f"Epoch {epoch+1}\n--------") train_step(model=model, data_loader=train_loader, loss_fn=loss_fn, optimizer=optimizer, accuracy_fn=accuracy_fn, device=device) test_step(model=model, data_loader=test_loader, loss_fn=loss_fn, accuracy_fn=accuracy_fn, device=device)

典型输出结果可能如下:

Epoch 1 -------- 训练损失: 0.58912 | 训练准确率: 78.67% 测试损失: 0.42601 | 测试准确率: 84.62% Epoch 2 -------- 训练损失: 0.38710 | 训练准确率: 86.10% 测试损失: 0.37610 | 测试准确率: 86.45% Epoch 3 -------- 训练损失: 0.34572 | 训练准确率: 87.47% 测试损失: 0.35821 | 测试准确率: 87.72%

从结果可以看到,仅用3个训练周期,模型在测试集上的准确率就达到了接近88%的水平。这种快速收敛的特性使得这个配置非常适合作为更复杂模型的基准参考。

5. 关键参数与调优建议

虽然我们的基础模型已经表现不错,但理解关键参数的影响对进一步优化至关重要:

参数当前值调整建议预期影响
学习率0.10.01-0.1过高可能导致震荡,过低收敛慢
批量大小3232-256越大训练越稳定,但需要更多内存
隐藏单元1032-128增加模型容量,可能提升表现
优化器SGDAdam通常收敛更快,但可能泛化稍差
卷积核3x33x3或5x5更大的核能捕捉更大范围特征
# 示例:增强版模型架构 class Enhanced_CNN(nn.Module): def __init__(self): super().__init__() self.conv1 = nn.Conv2d(1, 32, 3, padding=1) self.conv2 = nn.Conv2d(32, 64, 3, padding=1) self.pool = nn.MaxPool2d(2, 2) self.dropout = nn.Dropout(0.25) self.fc1 = nn.Linear(64*7*7, 128) self.fc2 = nn.Linear(128, 10) def forward(self, x): x = self.pool(F.relu(self.conv1(x))) x = self.pool(F.relu(self.conv2(x))) x = self.dropout(x) x = x.view(-1, 64*7*7) x = F.relu(self.fc1(x)) x = self.dropout(x) x = self.fc2(x) return x

这个增强版引入了Dropout正则化和更多的卷积通道,通常能获得更好的表现,但训练时间也会相应增加。

相关新闻

  • UE5载具游戏开发:零基础入门到原型实现
  • WorkshopDL:一站式解决Steam创意工坊下载难题的终极工具
  • 【Bug已解决】Anthropic Console billing / Usage tracking errors — Claude Code 计费与用量追踪异常解决方案

最新新闻

  • 3分钟告别蓝奏云下载烦恼:PHP直链解析工具使用全攻略
  • 如何用MoocDownloader轻松下载中国大学MOOC课程,实现离线学习自由
  • 5个理由告诉你为什么BiliBili-UWP是Windows上最好的B站播放器客户端
  • 2024真实可用的代码大模型选型实战指南
  • OpenClaw本地AI工作流配置:飞书集成与技能调度实战指南
  • 2024年Anaconda安装指南:构建可复现的AI工程基线

日新闻

  • PROPKA 3深度解析:蛋白质pKa预测的实战指南与算法原理
  • 微信小程序 globalData 监听:基于 Object.defineProperty 的 3 种实现方案对比
  • MySQL 8.0 数据清洗实战:3类异常值识别与 UPDATE/DELETE 批量处理

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号