Fashion-MNIST实战:从数据加载到模型评估的完整流程
1. 为什么选择Fashion-MNIST作为入门项目如果你刚开始接触深度学习中的图像分类任务Fashion-MNIST绝对是最佳选择之一。这个数据集包含了10类时尚单品的灰度图片每张图片都是28x28像素大小。相比经典的MNIST手写数字数据集Fashion-MNIST的分类难度稍高但数据量依然控制在合理范围训练集6万张测试集1万张普通笔记本电脑也能轻松处理。我第一次用这个数据集时最直观的感受就是它既保留了MNIST的简洁特性又增加了真实世界物品的分类挑战。比如区分衬衫和T恤就比区分数字1和7困难得多这对初学者理解模型的实际表现很有帮助。另一个优势是数据集已经做好了标准化的标注省去了自己收集和标注数据的麻烦。提示虽然现在很多模型在MNIST上能达到99%以上的准确率但Fashion-MNIST上70%-90%的准确率更为常见这让我们更容易观察不同模型架构和训练技巧的效果差异。2. 环境准备与数据加载2.1 安装必要的工具包在开始之前我们需要准备好Python环境和必要的库。推荐使用Anaconda创建虚拟环境然后安装以下包conda create -n fashion-mnist python3.8 conda activate fashion-mnist pip install torch torchvision matplotlib这里我建议固定torchvision版本因为不同版本的预处理方式可能有细微差别。我在实际项目中遇到过因为版本更新导致的数据归一化不一致问题pip install torchvision0.10.02.2 下载并探索数据集使用torchvision加载数据非常简单几行代码就能完成import torch from torchvision import datasets, transforms transform transforms.ToTensor() train_data datasets.FashionMNIST( root./data, trainTrue, downloadTrue, transformtransform ) test_data datasets.FashionMNIST( root./data, trainFalse, downloadTrue, transformtransform )第一次运行时会自动下载数据集到指定目录约60MB。下载完成后我们可以检查数据的结构和内容print(f训练集样本数: {len(train_data)}) print(f测试集样本数: {len(test_data)}) print(f单张图片形状: {train_data[0][0].shape}) # 输出示例 # 训练集样本数: 60000 # 测试集样本数: 10000 # 单张图片形状: torch.Size([1, 28, 28])3. 数据预处理与可视化3.1 理解数据格式Fashion-MNIST中的图片都是单通道灰度图经过ToTensor转换后像素值范围从0-255压缩到0.0-1.0数据维度变为(C, H, W)格式通道×高度×宽度数据类型转换为torch.float32我们可以可视化几个样本看看import matplotlib.pyplot as plt labels_map { 0: T-shirt, 1: Trouser, 2: Pullover, 3: Dress, 4: Coat, 5: Sandal, 6: Shirt, 7: Sneaker, 8: Bag, 9: Ankle boot } figure plt.figure(figsize(8, 8)) for i in range(9): img, label train_data[i] ax figure.add_subplot(3, 3, i1) ax.set_title(labels_map[label]) ax.axis(off) plt.imshow(img.squeeze(), cmapgray) plt.show()3.2 构建数据加载器直接使用整个数据集训练效率很低我们需要创建DataLoader进行批量处理from torch.utils.data import DataLoader batch_size 64 train_loader DataLoader(train_data, batch_sizebatch_size, shuffleTrue) test_loader DataLoader(test_data, batch_sizebatch_size, shuffleFalse)这里有几个实用技巧训练集建议设置shuffleTrue打乱顺序避免模型学习到数据顺序测试集保持shuffleFalse便于结果分析batch_size根据显存大小调整普通笔记本建议32-128之间4. 构建卷积神经网络模型4.1 基础CNN架构设计针对28x28的小尺寸图像我们可以设计一个轻量级CNNimport torch.nn as nn import torch.nn.functional as F class FashionCNN(nn.Module): def __init__(self): super().__init__() self.conv1 nn.Conv2d(1, 32, 3, padding1) self.pool nn.MaxPool2d(2, 2) self.conv2 nn.Conv2d(32, 64, 3, padding1) 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 x.view(-1, 64*7*7) x F.relu(self.fc1(x)) x self.fc2(x) return x model FashionCNN()这个架构的特点是两层3x3卷积每层后接ReLU激活和2x2最大池化最终展平后接两个全连接层参数量约20万非常适合快速实验4.2 模型训练与验证准备好损失函数和优化器后就可以开始训练import torch.optim as optim criterion nn.CrossEntropyLoss() optimizer optim.Adam(model.parameters(), lr0.001) epochs 10 for epoch in range(epochs): model.train() running_loss 0.0 for images, labels in train_loader: optimizer.zero_grad() outputs model(images) loss criterion(outputs, labels) loss.backward() optimizer.step() running_loss loss.item() # 每个epoch结束后验证 model.eval() correct 0 total 0 with torch.no_grad(): for images, labels in test_loader: outputs model(images) _, predicted torch.max(outputs.data, 1) total labels.size(0) correct (predicted labels).sum().item() print(fEpoch {epoch1}, Loss: {running_loss/len(train_loader):.3f}, fTest Acc: {100*correct/total:.2f}%)训练过程中有几个关键点需要注意每个batch前要执行optimizer.zero_grad()清空梯度训练和验证模式要用model.train()和model.eval()切换验证时要用torch.no_grad()禁用梯度计算5. 模型评估与改进5.1 基础模型表现分析完成10个epoch训练后基础CNN通常能达到88%-90%的测试准确率。我们可以进一步分析错误样本from sklearn.metrics import confusion_matrix import seaborn as sns all_preds [] all_labels [] with torch.no_grad(): for images, labels in test_loader: outputs model(images) _, preds torch.max(outputs, 1) all_preds.extend(preds.numpy()) all_labels.extend(labels.numpy()) cm confusion_matrix(all_labels, all_preds) plt.figure(figsize(10,8)) sns.heatmap(cm, annotTrue, fmtd, cmapBlues, xticklabelslabels_map.values(), yticklabelslabels_map.values()) plt.xlabel(Predicted) plt.ylabel(Actual) plt.show()常见的混淆情况包括衬衫被误分类为T恤或套衫套衫与外套容易混淆凉鞋和运动鞋有时分错5.2 模型优化技巧基于基础模型我们可以尝试以下改进数据增强增加随机旋转、水平翻转等变换train_transform transforms.Compose([ transforms.RandomHorizontalFlip(), transforms.RandomRotation(10), transforms.ToTensor() ])学习率调度使用ReduceLROnPlateau动态调整学习率scheduler optim.lr_scheduler.ReduceLROnPlateau( optimizer, modemax, factor0.5, patience2 )正则化在全连接层添加Dropoutself.dropout nn.Dropout(0.5) x self.dropout(F.relu(self.fc1(x)))更深的网络尝试ResNet等更复杂架构from torchvision import models model models.resnet18(pretrainedFalse) model.conv1 nn.Conv2d(1, 64, kernel_size7, stride2, padding3, biasFalse)经过这些优化模型准确率通常能提升2-5个百分点。但要注意避免过拟合可以通过早停法Early Stopping来控制训练轮数。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2441947.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!