尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

手写数字分类器:用 PyTorch 两层 MLP 完成 MNIST 识别的入门实战(NeetCode GPT 课程)

发布时间:2026/9/17 18:59:20

资讯中心
01
ARTICLE

手写数字分类器:用 PyTorch 两层 MLP 完成 MNIST 识别的入门实战(NeetCode GPT 课程)

手写数字分类器:用 PyTorch 两层 MLP 完成 MNIST 识别的入门实战(NeetCode GPT 课程)
手写数字分类器用 PyTorch 两层 MLP 完成 MNIST 识别的入门实战NeetCode GPT 课程【免费下载链接】leetcodeLeetcode solutions项目地址: https://gitcode.com/GitHub_Trending/leetcode1/leetcode手写数字分类器是深度学习的 Hello World将一张 $28 \times 28$ 的灰度图像展平为 784 维向量送入一个两层 MLP预测它属于 0-9 中的哪个数字。本文以当前仓库中的 handwritten-digit-classifier.md 为骨架结合仓库内同一 GPT 课程系列文档MLP 原理、PyTorch 基础、激活函数、Softmax完整讲解模型架构、逐层数据流、nn.Module标准写法、随机种子与损失函数选择等关键细节。读完本文你将掌握 PyTorch 构建分类模型的核心模式——在__init__中定义层、在forward中串联计算——这套模式也是后续搭建 GPT 等一切模型的通用骨架。前置知识在动手实现之前需要先熟悉三个基础PyTorchnn.Module在__init__中定义层在forward中串联它们这是所有 PyTorch 模型的标准写法。相关基础操作tensor 的 reshape、mean、cat 与损失函数可参考仓库文章 basics-of-pytorch.md。MLP 架构理解线性层、激活函数和 dropout 如何组合成一个分类器。线性层计算 $h xW b$若没有激活函数多层线性变换会坍缩成单层$W_2(W_1xb_1)b_2 W_2W_1x W_2b_1 b_2$ 仍是线性的因此层间必须插入非线性激活详见 mlp-from-scratch.md。图像即向量一张 $28 \times 28$ 的灰度图展平后是 784 维向量每个像素就是一个输入特征。把 2D 图像 reshape 成 1D 向量正是 basics-of-pytorch.md 中反复强调的用法。核心概念为什么用它入门深度学习手写数字分类器输入展平后的 $28 \times 28 784$ 维 MNIST 图像输出该图像属于哪个数字0-9。它是理解从像素到语义这一整个过程的最小完整示例。本问题采用的架构是一个两层 MLP前向传播依次经过 5 个操作Linear$784 \to 512$把高维像素空间投影到一个 512 维的学习表示空间ReLU引入非线性使网络能够学习数字之间弯曲的决策边界Dropout$p 0.2$训练时随机将 20% 的激活值置零强制网络把信息分散到更多神经元上而不是依赖少数神经元评估阶段 dropout 自动关闭Linear$512 \to 10$投影到 10 个类别分数每个数字一个Sigmoid把每个分数压缩到 $(0, 1)$ 区间。Dropout 为什么必要Dropout 是一种正则化手段。本模型参数量超过 40 万$784 \times 512 512 \times 10$没有正则化时极易死记硬背训练集。加入 dropout 后网络必须学到能够扛得住随机神经元缺失的鲁棒特征从而提升泛化能力。能达到什么精度尽管架构简单这个 MLP 在 MNIST 上能达到97% 以上的准确率。更复杂的架构如 CNN可以把它推到 99% 以上但 MLP 路线足以教会你核心模式。解决方案直觉定义一个 PyTorchnn.Module包含两个线性层、ReLU、dropout 和 sigmoid。forward方法把这些层按顺序串联把 784 维输入变换成 10 个类别概率。实现import torch import torch.nn as nn from torchtyping import TensorType class Solution(nn.Module): def __init__(self): super().__init__() torch.manual_seed(0) self.first_linear nn.Linear(784, 512) self.relu nn.ReLU() self.dropout nn.Dropout(p0.2) self.projection nn.Linear(512, 10) self.sigmoid nn.Sigmoid() def forward(self, images: TensorType[float]) - TensorType[float]: torch.manual_seed(0) x self.first_linear(images) # (batch, 784) - (batch, 512) x self.relu(x) x self.dropout(x) x self.projection(x) # (batch, 512) - (batch, 10) x self.sigmoid(x) return torch.round(x, decimals4)几个值得注意的细节TensorType来自torchtyping库仅用于类型标注帮助 IDE 与静态检查理解张量语义不改变运行时行为nn.Dropout(p0.2)的默认行为是训练模式下随机置零 20% 并将剩余激活放大 $1/(1-p) 1.25$ 倍以保证期望值不变model.eval()时 dropout 自动失效输出用torch.round(x, decimals4)统一保留 4 位小数保证结果可复现、可比对。逐层数据流Walkthrough对一张展平后的 $28 \times 28$ 图像784 个值各层形状变化如下层输入形状运算输出形状Linear 1$(1, 784)$$xW_1 b_1$$(1, 512)$ReLU$(1, 512)$$\max(0, x)$$(1, 512)$Dropout$(1, 512)$置零 20%其余放大 $1.25$ 倍$(1, 512)$Linear 2$(1, 512)$$xW_2 b_2$$(1, 10)$Sigmoid$(1, 10)$$1/(1e^{-x})$$(1, 10)$输出是 10 个值每个代表模型对某个数字的置信度取最大值对应的下标即为预测类别。关于激活函数的数学含义sigmoid 的饱和区与梯度消失、ReLU 的稀疏性与死亡 ReLU问题可参考仓库文章 sigmoid-and-relu.md。时间与空间复杂度时间单样本两次矩阵乘法$O(784 \times 512 512 \times 10)$空间两份权重矩阵$O(784 \times 512 512 \times 10)$。常见陷阱忘记设置随机种子不调用torch.manual_seed(0)权重初始化和 dropout 的掩码都是随机的导致输出不确定、测试无法通过# 错误非确定性的初始化 def __init__(self): super().__init__() self.first_linear nn.Linear(784, 512) # 正确确定性初始化 def __init__(self): super().__init__() torch.manual_seed(0) self.first_linear nn.Linear(784, 512)注意本实现不仅要在__init__里设置种子还在forward开头再次调用torch.manual_seed(0)——这是为了保证 dropout 掩码在多次前向推理时也保持一致从而让输出严格可复现。用 Softmax 代替 SigmoidSoftmax 产生的是总和为 1的耦合概率分布Sigmoid 为每个类别产生相互独立的概率。本题明确要求 sigmoid# 错误softmax 使各输出耦合、总和为 1 x nn.functional.softmax(x, dim-1) # 正确sigmoid 给出每个类别独立的概率 x self.sigmoid(x)两者不可互换的原因在 softmax.md 中有详细推导softmax 的指数放大效应会让大 logit 赢家通吃而 sigmoid 每个输出独立于其他类别——这决定了它们分别适用于互斥多分类输出层与独立多标签置信度两类场景。从本课程后续内容看softmax 出现在 GPT 的词汇表概率输出中sigmoid 则用于更简单的分类模型二者定位完全不同。在 GPT 项目中的位置本文对应的实现将成为课程中foundations/digit_classifier.py。GPT 本身并不做图像分类但这个题目教会了 PyTorchnn.Module的核心模式——层定义在__init__、计算写在forward——这一模式贯穿课程后续每一个模型。把这一点放到更大的课程脉络里看mlp-from-scratch.md 指出Transformer 块内部的 FFN前馈网络本质就是一个两层 MLP先上投影把维度扩大 4 倍过 ReLU再下投影回原维度——与本文的 $784 \to 512 \to 10$ 结构同构sigmoid-and-relu.md 确认GPT 每个隐藏层使用 ReLU在 FFN 内部而 sigmoid 出现在更简单的模型情感分类器、数字分类器中train-your-gpt.md 展示的训练循环前向 → 交叉熵损失 → 反向传播 → AdamW 更新同样建立在nn.Module之上。也就是说理解本文这个 5 层小模型就理解了后续所有模型的组织方式。关键要点带 dropout 的两层 MLP 在 MNIST 上即可取得强结果证明简单架构也能解决真实问题Dropout 正则化通过迫使网络学习分布式表示而非依赖个别神经元来防止过拟合nn.Module模式__init__定义层、forward执行计算是 PyTorch 模型的标准结构从本文开始的每个问题都会用到它。【免费下载链接】leetcodeLeetcode solutions项目地址: https://gitcode.com/GitHub_Trending/leetcode1/leetcode创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。