当前位置: 首页 > news >正文

Tensflow学习第T1周打卡

  • 🍨本文为🔗365天深度学习训练营中的学习记录博客
  • 🍖原作者:K同学啊

MNIST 手写数字识别(PyTorch)学习笔记

这次练习主要是用PyTorch 搭建一个简单的卷积神经网络(CNN),完成MNIST 手写数字分类任务。MNIST 数据集是深度学习中非常经典的入门数据集,每张图片都是28×28 的灰度图像,内容是手写数字 0–9。

整个代码大致可以分为几个步骤:导入库 → 加载数据 → 构建模型 → 训练模型 → 测试模型 → 可视化结果


1. 导入库并设置运行设备

首先导入 PyTorch、torchvision 和 matplotlib 等库。

import torch import torch.nn as nn import matplotlib.pyplot as plt import torchvision

然后通过下面这段代码判断是否有 GPU:

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

如果电脑有 GPU 就会使用 GPU 训练,否则就使用 CPU。
我的运行结果显示是:

device(type='cpu')

说明当前是在 CPU 上训练模型。


2. 加载 MNIST 数据集

接下来使用torchvision.datasets.MNIST加载数据集:

train_ds = torchvision.datasets.MNIST(...) test_ds = torchvision.datasets.MNIST(...)

这里有几个关键参数:

  • train=True表示训练集

  • train=False表示测试集

  • download=True表示如果本地没有数据就自动下载

  • transform=ToTensor()用来把图片转换为Tensor

之所以要转换成 Tensor,是因为神经网络只能处理数值张量数据

转换之后,每张图片的形状是:

(1, 28, 28)

其中:

  • 1 表示通道数(灰度图)

  • 28 表示图片高度

  • 28 表示图片宽度


3. 使用 DataLoader 生成批数据

为了方便训练,我们使用DataLoader把数据分成小批次。

batch_size = 32 train_dl = DataLoader(train_ds, batch_size=32, shuffle=True) test_dl = DataLoader(test_ds, batch_size=32)

这里设置batch_size = 32,表示每次训练使用 32 张图片。

训练集一共有 60000 张图片,所以大概会被分成:

60000 / 32 ≈ 1875 个 batch

另外训练集设置了shuffle=True,这样每个 epoch 都会随机打乱数据,避免模型学习到固定顺序。


4. 查看数据的结构

为了确认数据格式,我们取出一个 batch:

imgs, labels = next(iter(train_dl)) print(imgs.shape)

输出结果是:

torch.Size([32, 1, 28, 28])

这个 shape 的含义是:

(batch_size, channel, height, width)

也就是:

  • 32 张图片

  • 1 个通道

  • 28×28 像素


5. 可视化部分图片

为了看看数据长什么样,我们把前 20 张图片画出来。

步骤是:

  1. 把 Tensor 转换成 numpy

  2. 去掉通道维度

  3. 使用 matplotlib 显示

最终会得到一张图,里面是 20 个手写数字,例如:

7 4 9 3 1 7 5 2 6 0

这样可以确认数据确实是手写数字。


6. 构建卷积神经网络模型

接下来开始定义 CNN 模型:

class Model(nn.Module):

这个模型主要由两层卷积层 + 两层全连接层组成。

模型结构大致是:

输入图片 (1×28×28) ↓ Conv2d (1 → 32) ↓ ReLU ↓ MaxPool ↓ Conv2d (32 → 64) ↓ ReLU ↓ MaxPool ↓ Flatten ↓ Linear (1600 → 64) ↓ Linear (64 → 10)

最后输出 10 个类别,对应数字0–9


7. 查看模型参数

使用:

summary(model)

可以看到模型参数统计:

Total params: 121,930

说明整个模型大约有12 万个参数需要训练


8. 定义损失函数和优化器

分类任务使用:

CrossEntropyLoss

作为损失函数。

优化器使用:

SGD (随机梯度下降)

学习率设置为:

0.01

9. 训练模型

训练过程主要包括以下步骤:

前向传播(模型预测)

pred = model(X)

计算损失

loss = loss_fn(pred, y)

反向传播

loss.backward()

更新参数

optimizer.step()

同时记录每个 epoch 的loss 和 accuracy


10. 测试模型

测试阶段使用:

torch.no_grad()

这样可以关闭梯度计算,从而减少计算量。

测试时同样会计算:

  • 测试准确率

  • 测试损失


11. 训练结果

训练 5 个 epoch 后得到的结果:

EpochTrain AccTest Acc
178.5%93.5%
294.7%96.5%
396.5%96.7%
497.2%97.8%
597.7%98.0%

最终测试准确率大约是:

98%

说明模型已经能够比较准确地识别手写数字。


12. 可视化训练过程

最后画出了两张图:

Accuracy 曲线

显示:

  • 训练准确率

  • 测试准确率

可以看到随着 epoch 增加,准确率逐渐提高。


Loss 曲线

显示:

  • 训练 loss

  • 测试 loss

随着训练进行,loss 逐渐下降,说明模型在不断收敛。


总结

这次实验完整实现了一个基于 PyTorch 的 CNN 手写数字识别模型。主要流程包括:

  1. 加载 MNIST 数据集

  2. 使用 DataLoader 生成批数据

  3. 构建卷积神经网络

  4. 定义损失函数和优化器

  5. 进行模型训练和测试

  6. 可视化训练结果

最终模型在测试集上达到了约 98% 的准确率,说明卷积神经网络在图像识别任务中具有很好的效果。

http://www.jsqmd.com/news/478944/

相关文章:

  • test_1_2026
  • 基于单片机的蔬菜大棚数据采集系统的设计
  • 【day52】
  • 端侧AI 的定义与发展背景
  • 03.SpringAI 使用FunctionCalling实现智能客服
  • 基于单片机的土壤墒情监测系统的设计与实现
  • OpenClaw技术架构深度解析:原理、核心与源码全面解读
  • 2026年3月口碑好的压电式传感器厂家推荐TOP - 品牌推荐用户报道者
  • 【亲测】2026年OpenClaw(Clawdbot)零技术点几下秒级安装教程
  • 看不见的飓风:电动汽车如何重塑全球经济版图
  • 不平衡电网电压下 VSG 如何控制三相电流平衡
  • 【2026年最新600套毕设项目分享】springboot“校园淘”二手交易平台(14127)
  • 【2026年最新600套毕设项目分享】springboot数字博物馆系统(14128)
  • AI写论文必备,精选4款AI论文生成工具搞定各类学术论文!
  • 从硬件抽象到意图对齐:论 AI 时代操作系统演进的逻辑必然与 OpenClaw 的范式价值
  • 2026年高校AI率标准汇总:本科30%硕士15%博士10%怎么达标 - 还在做实验的师兄
  • 【调试心法】撕烂 printf 的虚伪面具!消灭“海森堡 Bug”,用 C++ 构建零开销的异步日志引擎 (Async Logger)
  • 【2026年最新600套毕设项目分享】基于SpringBoot的电力集团职称评定系统(14129)
  • 嘎嘎降AI双引擎到底是什么?和普通降AI工具有啥区别 - 还在做实验的师兄
  • 精通类器官培养
  • OpenClaw,如果我想让它帮我盯盘或抢购,该怎么设置?
  • 2026嘎嘎降AI实测:知网AIGC检测4.0算法下还能稳过吗? - 还在做实验的师兄
  • 实战案例七:Claude Code 构建完整的 Web 应用
  • 导师推荐 9个降AIGC平台:MBA降AI率必看测评与推荐
  • cookie机制 以及session和token
  • 【面试核心】Redis 深度面试核心考点全解析
  • 硕士论文AI率要求15%以下,用嘎嘎降AI一次过的经验 - 还在做实验的师兄
  • CO11N报工使用BAPI_PRODORDCONF_CREATE_TT时无法返回配置错误消息CK466
  • pycharm打包whl
  • 《ShardingSphere解读》01 从理论到实践:如何让分库分表真正落地?