[Pytorch框架] 5.3 从Fashion MNIST到实战:构建高效CNN分类器的关键步骤

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

1. 从“Hello World”到实战:为什么选择Fashion MNIST?

如果你刚开始接触深度学习,尤其是图像分类,那你一定听说过MNIST手写数字数据集。它就像编程界的“Hello World”,简单直接,能让你快速跑通一个模型。但说实话,MNIST太“干净”了,数字的笔画结构相对固定,模型很容易就能达到99%以上的准确率,这容易给人一种“深度学习不过如此”的错觉。等你真正去处理现实中的图片,比如识别猫狗、区分商品,就会发现根本不是一回事。

所以,我们今天的主角是 Fashion MNIST。它可以说是MNIST的“升级版”或“实战预演版”。它包含了10个类别的时尚单品灰度图像,比如T恤、裤子、外套、凉鞋等,每张图片也是28x28像素。听起来好像只是换了个内容?差别可大了。

我刚开始用它的时候,就踩过坑。用MNIST上表现很好的简单模型,直接套到Fashion MNIST上,准确率可能连85%都不到。为什么?因为时尚单品的图像复杂度高多了。一件“衬衫”(Shirt)和一件“外套”(Coat)在轮廓上可能很像;一个“手提包”(Bag)在图片里可能只占一小块区域,特征不明显。这些挑战,才是你未来在真实项目中会遇到的。

因此,用Fashion MNIST来学习构建卷积神经网络(CNN),是一个绝佳的起点。它既保留了数据规整、易于加载的优点,又引入了足够的真实世界复杂性,迫使你去思考网络设计、调参和优化。通过PyTorch这个框架,我们可以一步步地把数据变成模型,再把模型训练成一个可靠的“时尚品鉴师”。整个过程,你会清晰地看到每个环节的作用,这才是真正“上手”的感觉,而不是仅仅复制粘贴代码。

接下来,我们就从零开始,手把手构建一个高效的CNN分类器。我会分享我在这个过程中总结的关键步骤和容易翻车的地方,保证你跟着做一遍,不仅能跑通代码,更能理解背后的“所以然”。

2. 数据准备:不仅仅是加载,更是理解

万事开头难,但好的开始是成功的一半。在深度学习里,“好的开始”就是处理好你的数据。对于Fashion MNIST,我们首先要把它“请”到我们的代码环境里,并以一种PyTorch“喜欢”的方式喂给模型。

2.1 获取与初探数据

Fashion MNIST数据集非常友好,你可以直接从Kaggle官网下载,或者更简单,利用PyTorch内置的torchvision.datasets模块来在线获取。我强烈推荐后者,因为它帮你处理好了下载、解压等一系列琐事。

import torch
import torchvision
import torchvision.transforms as transforms

# 定义数据预处理转换:将图像数据转换为Tensor,并做归一化
transform = transforms.Compose([
    transforms.ToTensor(), # 将PIL图像或numpy数组转换为Tensor,并自动缩放到[0,1]
    transforms.Normalize((0.5,), (0.5,)) # 对单通道灰度图进行归一化,使其分布接近均值为0,标准差为1
])

# 下载并加载训练集和测试集
train_dataset = torchvision.datasets.FashionMNIST(root='./data', train=True, download=True, transform=transform)
test_dataset = torchvision.datasets.FashionMNIST(root='./data', train=False, download=True, transform=transform)

运行上面几行代码,数据就自动下载到./data目录下了。这里的transform是关键。ToTensor()不仅转换格式,还把像素值从0-255压缩到0-1之间,这是神经网络训练的常规操作。Normalize则进一步将数据分布调整到均值为0、标准差为1附近,这能大大加速模型的收敛速度。你可以把它想象成给数据“瘦身”和“标准化”,让模型学习起来更轻松。

数据加载进来后,别急着往模型里塞。先看看它长什么样,心里有个数。

import matplotlib.pyplot as plt
import numpy as np

# 数据集的类别标签
classes = ('T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
           'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot')

# 随机查看一些训练图片
figure = plt.figure(figsize=(8, 8))
cols, rows = 4, 4
for i in range(1, cols * rows + 1):
    sample_idx = torch.randint(len(train_dataset), size=(1,)).item()
    img, label = train_dataset[sample_idx]
    figure.add_subplot(rows, cols, i)
    plt.title(classes[label])
    plt.axis("off")
    # 注意:img是Tensor,形状为[C, H, W],显示前需要转换维度并取消归一化
    plt.imshow(img.squeeze(), cmap='gray')
plt.show()

这段代码会显示一个4x4的图片网格。多运行几次,你会发现同一个类别(比如“衬衫”)的图片,角度、款式、明暗都有差异。这就是我们模型要学习的“多样性”。同时,你也能直观感受到“衬衫”和“外套”确实容易混淆,这暗示了我们可能需要一个更有辨别力的网络。

2.2 构建数据管道:DataLoader的核心作用

有了数据集,我们还需要一个高效的数据供给管道。这就是torch.utils.data.DataLoader的用武之地。它负责三件大事:批处理(Batching)、打乱顺序(Shuffling)和多进程加载(Multiprocessing)

BATCH_SIZE = 64

train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True, num_workers=2)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=BATCH_SIZE, shuffle=False, num_workers=2)
  • batch_size: 这是最重要的超参数之一。它决定了一次喂给模型多少张图片。设得太小(比如4、8),模型更新频繁,但波动大,训练慢;设得太大,可能内存(GPU显存)扛不住,而且可能陷入局部最优。对于Fashion MNIST,64或128是个不错的起点。如果你的程序报“CUDA out of memory”错误,第一反应就是减小batch_size
  • shuffle=True: 只在训练集上使用。它会在每个epoch开始时,随机打乱数据的顺序。这非常重要,能防止模型学习到数据顺序带来的虚假规律,让训练更充分、泛化能力更强。测试集不需要打乱。
  • num_workers: 设置用于加载数据的子进程数。大于0可以加速数据从硬盘到内存的读取,尤其是在数据预处理复杂时。但也不是越大越好,通常设置为CPU核心数附近。

现在,数据就像流水线上的零件,被DataLoader整齐地分批、打包,准备送入模型的生产线。这个环节看似简单,但设置不当会直接影响训练效率和最终效果。我刚开始就曾因为shuffle

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

内容概要:本文系统介绍了物理信息神经网络(PINNs)在求解布洛赫-托雷(Bloch-Torrey)方程中的应用,结合PyTorch框架提供了完整的Python代码实现案例。文章深入阐述了如何将物理先验知识嵌入神经网络训练过程,通过构建复合损失函数,强制网络输出满足控制方程、初始条件边界条件,从而实现对布洛赫-托雷方程的无网格化、高精度求解。该方法突破了传统数值方法在高维、多尺度及复杂几何场景下的计算瓶颈,展现出优异的泛化能力计算效率,特别适用于医学成像、扩散磁共振等领域中复杂的物理场建模仿真任务。; 适合人群:具备深度学习偏微分方程理论基础,从事科学计算、生物医学工程、材料科学或相关交叉学科研究的研究生、科研人员及算法工程师。; 使用场景及目标:①应用于扩散磁共振成像(dMRI)等医学影像技术中的复杂扩散过程建模反演;②为高维偏微分方程的高效求解提供数据驱动的新范式,提升仿真精度计算速度;③作为PINNs在AI for Science领域中的典型实践案例,推动物理引导的深度学习方法在实际科研项目中的落地拓展。; 阅读建议:建议读者结合提供的完整代码资源(可通过公众号“荔枝科研社”或百度网盘获取),动手复现并调试模型,深入理解PINNs的架构设计、损失函数构建物理约束嵌入机制,同时可尝试将该方法迁移至其他类似物理系统的建模求解任务中进行创新性研究。
内容概要:本文围绕“基于多VSG独立微网的多目标二次控制MATLAB模型研究”展开,详细阐述了利用Simulink对多虚拟同步发电机(VSG)构成的独立微网系统进行建模仿真,实现频率调节、电压支撑有功无功功率均分等多目标协同优化的二次控制策略。研究引入先进的最优控制算法,解决微网在孤岛运行模式下的功率动态分配、频率电压恢复及系统稳定性问题,并通过MATLAB/Simulink平台构建完整仿真模型,验证所提控制策略在不同负载扰动下的有效性、鲁棒性动态响应性能。; 适合人群:具备电力系统分析、现代控制理论基础以及MATLAB/Simulink仿真能力的电气工程、自动化等相关专业的硕士研究生、科研人员及从事微网控制系统开发的工程技术人才。; 使用场景及目标:① 深入理解多VSG在独立微网中的并联运行机理协同控制架构;② 掌握基于Simulink的微网二次控制系统的建模方法仿真流程;③ 实现频率、电压功率分配的多目标优化控制仿真验证;④ 为微网控制系统的设计、算法优化及科研课题提供可靠的仿真依据和技术参考。; 阅读建议:建议读者结合文中控制策略,动手搭建Simulink模型,重点关注控制器参数整定对系统动态性能的影响,可通过对比不同工况下的仿真结果,进一步优化控制算法以提升系统鲁棒性响应精度。
【重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述中并未直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!
代码下载地址: https://pan.quark.cn/s/a4b39357ea24 编写程序,建立容量为n(建议n=8)的循环队列,完成以下程序功能。 输入字符#,执行一次出队操作,屏幕上显示出队字符;输入字符@,队列中所有字符依次出队并按出队次序在屏幕上显示各字符;输入其它字符,则输入的字符入队。 要求采用队头/队尾间隔至少一个空闲元素的方法来实现循环队列;空队执行出队操作及队满执行入队操作需显示提示信息。 ### 数据结构实验报告知识点 #### 实验背景目标 本次实验是关于数据结构中的队列基本操作算法。 队列是一种先进先出(FIFO)的数据结构,在计算机科学中有着广泛的应用,例如进程调度、任务队列等场景。 通过本实验,学生能够深入理解循环队列的概念,并熟练掌握其实现方法。 #### 实验要求内容 1. **实验内容**:要求编写一个程序来建立容量为 _n_ 的循环队列(推荐 _n_ = 8),并实现以下功能: - 输入字符 `#` 执行一次出队操作,并显示该出队字符; - 输入字符 `@`,将队列中的所有字符依次出队,并按照出队顺序在屏幕上显示这些字符; - 输入其他任意字符,则将该字符入队。 2. **特殊要求**: - 采用队头/队尾间隔至少一个空闲元素的方法实现循环队列,这样可以避免队列的物理连续性逻辑连续性的混淆,同时便于检测队列是否为空或满。 - 当队列为满时尝试执行入队操作,或者队列为时空执行出队操作时,需要给出相应的提示信息。 3. **注意事项**: - 在反复输入字符时,应妥善处理输入缓冲区中的回车键(即 `\n` 字符)的问题,避免因连续输入导致的错误行为。 #### 数据结构设计 为了实现上述要求,本实验采用了如下的数据结构设计: ...
内容概要:本文提出了一种基于数据驱动的Koopman算子递归神经网络(RNN)相结合的模型线性化方法,用于提升纳米定位系统的预测控制性能。该方法通过Koopman算子将复杂的非线性系统动态映射至高维线性空间,克服传统建模在强非线性条件下的局限性,再结合RNN强大的时序特征捕捉能力,实现对系统未来状态的高精度预测有效控制。整个框架完全基于数据驱动,无需精确物理建模,特别适用于原子力显微镜、半导体制造等对定位精度要求极高的应用场景,并通过Matlab代码实现了算法的完整仿真验证。; 适合人群:具备控制理论基础和Matlab编程能力,从事精密运动控制、智能算法开发、非线性系统建模预测控制研究的研究生、科研人员及工程技术开发者。; 使用场景及目标:①解决纳米级定位平台中存在的强非线性、迟滞、蠕变等复杂动态特性带来的控制难题;②为高精度机电系统提供一种可复现、易实现的数据驱动预测控制方案;③推动Koopman理论深度学习在先进制造智能控制领域的深度融合应用创新。; 阅读建议:建议读者结合提供的Matlab代码深入理解Koopman算子的数值实现流程RNN网络结构设计细节,重点关注模型在不同工况下的泛化能力、实时性表现及控制稳定性,可进一步将其拓展至其他高精度伺服控制系统的研究优化中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值