新闻详情

新闻详情

首页 / 资讯中心 / 详情

AI-For-Beginners 实验指南:用自建神经网络框架完成 MNIST 手写数字分类

发布时间:2026/10/1 8:39:24来源:尧图网络
AI-For-Beginners 实验指南:用自建神经网络框架完成 MNIST 手写数字分类
教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载本篇技术指南面向 AI-For-Beginners 课程第 04 课《多层级感知机Multi-Layered Perceptron》配套实验室任务讲解如何利用课程中亲手构建的微型神经网络框架在 MNIST 手写数字数据集上分别训练 1 层、2 层与 3 层感知机并回答激活函数、网络深度与过拟合等核心问题。读完本文你将掌握从数据加载、框架组装到训练循环与结果分析的一整套可复现流程并能结合仓库源码理解每一行代码背后的梯度下降与反向传播原理。实验背景从课程框架出发本实验建立在课程主干笔记本 OwnFramework.ipynb 的基础之上。在该笔记本中我们逐步用纯 NumPy 实现了一个模块化神经网络框架其核心构件为Linear全连接层负责线性变换z x·Wᵀ bSoftmax把网络输出归一化为各类别的概率分布CrossEntropyLoss交叉熵损失量化预测概率分布与真实标签之间的差异Tanh层间非线性激活函数使多层线性层组合后具备更强的表达能力Net容器类将各层按顺序叠加并统一调度前向传播、反向传播与参数更新。课程正文 README.md 明确指出单层网络只能处理线性可分的问题将多个线性层与非线性激活函数组合后模型能够分离非线性可分的类别。本实验就是把这一框架迁移到 MNIST 手写数字10 分类任务上用 1、2、3 层感知机实测其性能差异。任务目标依据实验室任务文档translations/bg/lessons/3-NeuralNetworks/04-OwnFramework/lab/README.md英文原版见 lessons/3-NeuralNetworks/04-OwnFramework/lab/README.md本实验要求使用 1 层、2 层和 3 层感知机解决 MNIST 手写数字分类问题并复用课堂上开发的神经网络框架。实验的起点笔记本为 MyFW_MNIST.ipynb。完成实验后需要回答四个关键问题层间激活函数是否影响网络性能该任务是否需要 2 层或 3 层网络随着层数增加训练是否遇到问题训练过程中网络的权重如何变化可绘制权重的最大绝对值随 epoch 的变化曲线来理解其关系数据准备加载 MNIST 数据集实验室笔记本 MyFW_MNIST.ipynb 给出了完整的数据加载代码。仓库的data/目录下已提供数据集文件 data/mnist.pkl.gz解压后为mnist.pkl通过 Pythonpickle模块直接读取import pickle with open(mnist.pkl,rb) as f: MNIST pickle.load(f) labels MNIST[Train][Labels] data MNIST[Train][Features]读取后可以查看数据形状训练集特征矩阵为(42000, 784)——即 42000 个样本每个样本是 28×28 的灰度像素图展开为 784 维向量。随后使用 Scikit-Learn 划分训练集与测试集from sklearn.model_selection import train_test_split features_train, features_test, labels_train, labels_test train_test_split( data, labels, test_size0.2 ) print(fTrain samples: {len(features_train)}, test samples: {len(features_test)})按test_size0.2划分后得到 33600 个训练样本与 8400 个测试样本。依赖环境方面实验需要numpy、scikit-learn、matplotlib以及 Jupyter Notebook均包含在仓库根目录 requirements.txt 与 binder/requirements.txt 所列依赖中也可通过 binder/environment.yml 搭建 Binder 环境。框架源码精读每个类都在做什么在动手训练之前先深入理解框架中每个类的实现源码位于 OwnFramework.ipynb这将直接影响你在实验中调整结构、诊断问题的能力。Linear线性层与参数初始化class Linear: def __init__(self, nin, nout): self.W np.random.normal(0, 1.0/np.sqrt(nin), (nout, nin)) self.b np.zeros((1, nout)) self.dW np.zeros_like(self.W) self.db np.zeros_like(self.b) def forward(self, x): self.x x return np.dot(x, self.W.T) self.b def backward(self, dz): dx np.dot(dz, self.W) dW np.dot(dz.T, self.x) db dz.sum(axis0) self.dW dW self.db db return dx def update(self, lr): self.W - lr * self.dW self.b - lr * self.db要点权重初始化W从均值为 0、标准差为1/sqrt(nin)的正态分布中采样这一缩放系数可避免输入维度增大时激活值方差过大偏置b初始化为 0。forward缓存输入x反向传播时计算dW dzᵀ·x需要用到前向输入这是实现梯度计算的关键状态保存。批量计算forward/backward均基于整个 minibatch 矩阵运算。如笔记本所述Δx Δz × W、ΔW Δzᵀ × x、Δb Σdz其中输入x ∈ ℝ^(minibatch × nclass)。update按梯度下降公式W ← W − lr·dW、b ← b − lr·db更新参数。Softmax把输出变成概率class Softmax: def forward(self, z): self.z z zmax z.max(axis1, keepdimsTrue) expz np.exp(z - zmax) Z expz.sum(axis1, keepdimsTrue) return expz / Z def backward(self, dp): p self.forward(self.z) pdp p * dp return pdp - p * pdp.sum(axis1, keepdimsTrue)forward中先减去每行最大值zmax再取指数是保证数值稳定性的常用技巧避免大数溢出。Softmax 输出可解释为类别上的概率分布q σ(z_c) p̂(c|x)且每行概率之和恰好为 1。MNIST 是 10 分类任务因此输出层神经元数量应设置为 10。CrossEntropyLoss交叉熵损失class CrossEntropyLoss: def forward(self, p, y): self.p p self.y y p_of_y p[np.arange(len(y)), y] log_prob np.log(p_of_y) return -log_prob.mean() def backward(self, loss): dlog_softmax np.zeros_like(self.p) dlog_softmax[np.arange(len(self.y)), self.y] - 1.0/len(self.y) return dlog_softmax / self.p交叉熵损失通过p[np.arange(len(y)), y]取出每个样本真实类别对应的预测概率p_c损失即−log(p_c)的均值。其含义是当网络以概率 1 预测正确类别时损失为 0真实类别的预测概率越接近 0损失越大理论上可趋向无穷大。笔记本特别强调损失函数必须对整个数据集或 minibatch 返回一个标量因此要对各样本的损失取平均.mean()。Net层容器与统一调度class Net: def __init__(self): self.layers [] def add(self, l): self.layers.append(l) def forward(self, x): for l in self.layers: x l.forward(x) return x def backward(self, z): for l in self.layers[::-1]: z l.backward(z) return z def update(self, lr): for l in self.layers: if update in l.__dir__(): l.update(lr)Net按添加顺序执行前向传播按逆序self.layers[::-1]执行反向传播——这正是“从损失函数出发、沿着计算图往回传播误差”的反向传播backpropagation思想。update遍历所有实现了update方法的层用update in l.__dir__()判断统一更新参数。Tanh层间非线性激活class Tanh: def forward(self, x): y np.tanh(x) self.y y return y def backward(self, dy): return (1.0 - self.y**2) * dytanh的导数为1 − y²反向传播实现简洁。笔记本明确指出两个线性层之间必须插入非线性激活函数如tanh否则多个线性层的复合仍是线性函数表达力与单层等价。数学上多层感知机可写作z₁ W₁ × x b₁z₂ W₂ × α(z₁) b₂f σ(z₂)其中α是非线性激活函数σ是 softmax。利用链式法则梯度可逐层回传∂L/∂W₂ (∂L/∂σ)(∂σ/∂z₂)(∂z₂/∂W₂)∂L/∂W₁ (∂L/∂σ)(∂σ/∂z₂)(∂z₂/∂α)(∂α/∂z₁)(∂z₁/∂W₁)注意到各表达式最左端完全相同因此可以高效地从损失函数出发、沿计算图逐层回传——这正是反向传播得名的由来。计算图结构可参考课程图片 ComputeGraph.png 与 ComputeGraphGrad.png。组装与训练从单层到三层构建网络在 MyFW_MNIST.ipynb 的 Instructions 中实验步骤明确为将课程框架代码粘贴进本笔记本或更好的方式单独封装为 Python 模块定义并训练单层感知机训练过程中同时观察训练准确率与验证准确率判断是否发生过拟合并调整层参数以提升准确率对 2 层和 3 层感知机重复上述步骤尝试在不同层之间使用不同的激活函数回答实验文档中的四个分析问题。构建 1 层感知机MNIST 输入 784 维输出 10 类net Net() net.add(Linear(784, 10)) net.add(Softmax()) loss CrossEntropyLoss()构建 2 层感知机引入隐藏层与 tanh 激活net Net() net.add(Linear(784, 100)) # 隐藏层784 - 100 net.add(Tanh()) net.add(Linear(100, 10)) # 输出层100 - 10 net.add(Softmax()) loss CrossEntropyLoss()3 层感知机则在此基础上再叠加一组LinearTanh例如784 → 100 → 100 → 10。注意隐藏层宽度如 100属于可调的超参数笔记本也提示“没有关于需要多少层或多少参数的唯一配方最好的方式是实验”。训练循环与评估课程笔记本给出了可复用的训练工具函数def get_loss_acc(x, y, lossCrossEntropyLoss()): p net.forward(x) l loss.forward(p, y) pred np.argmax(p, axis1) acc (pred y).mean() return l, acc def train_epoch(net, train_x, train_labels, lossCrossEntropyLoss(), batch_size4, lr0.1): for i in range(0, len(train_x), batch_size): xb train_x[i:ibatch_size] yb train_labels[i:ibatch_size] p net.forward(xb) # 前向计算输出 l loss.forward(p, yb) # 前向计算损失 dp loss.backward(l) # 反向损失梯度 dx net.backward(dp) # 反向逐层回传 net.update(lr) # 更新参数一个训练 epoch 即完整遍历一遍数据集内部按batch_size切分 minibatch。每次迭代执行一次完整的两阶段过程前向传播forward pass对给定 minibatch 计算损失函数值反向传播backward pass把损失沿计算图分布回模型参数实现误差最小化。在课程的小型二维分类示例中单 epoch 即可把准确率从约 50% 提升到 80% 左右OwnFramework.ipynb 中的运行结果验证了这套框架的有效性。应用到 MNIST 时可以据此扩展为多 epoch 循环并逐 epoch 记录get_loss_acc的训练/验证损失与准确率绘制训练进度曲线。超参数速查参数课程默认值说明batch_size4minibatch 大小越大梯度越稳定、单次迭代计算越重learning_rate (lr)0.1可视化时用 0.005~0.01学习率过大易震荡过小收敛慢隐藏层宽度10课程示例/ 自选MNIST隐藏神经元数量属于“容量”超参数激活函数tanh层间非线性实验中可替换为其他函数对比test_size0.2训练/测试划分比例得 33600 / 8400实验结果的分析视角实验文档提出的四个问题恰好对应训练深度模型的四个观察维度1. 层间激活函数是否影响性能可以分别用tanh、线性无激活以及其余候选激活训练同样结构的网络对比。理论依据是没有非线性多层等价于单层表达能力不会随深度提升引入非线性后2 层模型理论上可分类任意凸集3 层模型几乎可分类任意集合OwnFramework.ipynb 中的论述。2. 需要 2 层或 3 层网络吗MNIST 数字分类属于高度非线性的 10 分类任务单层感知机只能学线性决策面准确率存在明显上限引入隐藏层后准确率应有显著提升。但更深并不总是更好需要结合验证集准确率判断。3. 层数增加遇到什么问题网络越深梯度链越长训练更易出现收敛缓慢甚至失效。这正是问题 4 的观察动机。4. 权重如何随训练变化实验建议绘制“权重最大绝对值 vs. epoch”曲线深度网络中靠近输入的层其梯度回传路径更长权重增长速度与波动往往不同异常暴涨或剧烈震荡的曲线提示学习率偏大或训练不稳定。该分析能帮助判断深层网络是否出现训练困难。过拟合为什么不是层数越多越好多层模型更强大但为何不总是使用深层模型答案是过拟合overfitting。课程笔记本OwnFramework.ipynb给出了清晰的对照线性单层模型训练损失较高欠拟合但训练损失与验证损失大致相当对新数据的泛化通常较好复杂多层模型训练损失很低模型能很好地近似训练数据但验证损失可能远高于训练损失甚至随训练继续而上升——模型“记住”了训练点而丢失了整体规律。由此得出本实验可直接套用的结论Takeaways参数少的简单模型低容量更不容易过拟合复杂模型高容量容易过拟合需要持续监控验证误差确保它不随训练上升复杂模型需要更多数据来训练解决过拟合的两条路径简化模型或增加训练数据量**偏差-方差权衡bias-variance trade-off**提醒我们在模型能力与数据量之间、过拟合与欠拟合之间寻找折中。在 MNIST 实验中当训练准确率接近 100% 而验证准确率停滞或下降时即可判定发生了过拟合此时应减小隐藏层宽度、减少层数或引入更多训练数据。相关资源索引实验室任务说明英文lessons/3-NeuralNetworks/04-OwnFramework/lab/README.md实验室任务说明保加利亚语译文即本文依据文档translations/bg/lessons/3-NeuralNetworks/04-OwnFramework/lab/README.md实验起始笔记本translations/bg/lessons/3-NeuralNetworks/04-OwnFramework/lab/MyFW_MNIST.ipynb框架构建笔记本本实验全部框架源码所在lessons/3-NeuralNetworks/04-OwnFramework/OwnFramework.ipynb课程章节说明lessons/3-NeuralNetworks/04-OwnFramework/README.mdMNIST 数据集data/mnist.pkl.gz依赖环境requirements.txt、binder/requirements.txt建议按“阅读章节 → 运行 OwnFramework 理解框架 → 打开实验笔记本加载数据 → 组装 1/2/3 层网络 → 对照四个问题分析结果”的顺序完成整个实验闭环。赞分享教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载相关推荐AI for Beginners 实验指南用自研神经网络框架完成 MNIST 手写数字分类AI for Beginners 实验指南用自研神经网络框架完成 MNIST 手写数字分类 本篇技术指南围绕 AI for Beginners 课程12 周教程人工智能机器学习深度学习使用PyTorch构建第一个神经网络MNIST手写数字分类实战使用PyTorch构建第一个神经网络MNIST手写数字分类实战 前言 在机器学习领域MNIST手写数字数据集堪称Hello World级别的入门项目。本示例工程机器学习深度学习教程AI-For-Beginners 实验指南用 PyTorch / TensorFlow 全连接网络完成 Iris 与 MNIST 分类AI For Beginners 实验指南用 PyTorch / TensorFlow 全连接网络完成 Iris 与 MNIST 分类 本篇技术指南以 AI教程人工智能机器学习深度学习上一篇KH Coder完全指南3步掌握免费文本挖掘工具的实战应用下一篇March7thAssistant 使用指南崩坏星穹铁道全自动助手的部署、日常任务与完整配置解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

RAG知识库实战:从混合检索到私有化部署,WeKnora全面解析 2026/10/2 4:46:48

RAG知识库实战:从混合检索到私有化部署,WeKnora全面解析

前阵子做企业级知识库选型,我把GitHub上几个热门的开源项目翻了个遍:Dify、RAGFlow、MaxKB、FastGPT,每个都有人吹。真到自己服务器上跑两圈,痛点就很具体了——界面好看的检索不准,检索准的权限太弱,权限能…

阅读更多 →
AI日报系统设计:人机协同的高确定性内容流水线 2026/10/2 4:46:48

AI日报系统设计:人机协同的高确定性内容流水线

1. 项目概述:这不是一份新闻简报,而是一套可复用的AI内容生产流水线“AI 日报(2026年9月28日)”——看到这个标题,第一反应不是点开看资讯,而是立刻在脑子里拆解:谁在发?为什么是这一…

阅读更多 →
Keepalived实战:基于VRRP实现虚拟IP漂移与高可用故障切换 2026/10/2 4:46:48

Keepalived实战:基于VRRP实现虚拟IP漂移与高可用故障切换

生产环境里最怕什么?不是流量大,也不是业务复杂,而是某个核心服务半夜悄悄挂了,等用户发现的时候已经在群里炸锅了。我前几年被这种单点故障坑过好几次,后来把所有关键服务都做了高可用改造,用到的核心工具…

阅读更多 →
计算机组成原理:微程序设计核心概念、微指令编码与控制器设计全解析 2026/10/2 4:46:47

计算机组成原理:微程序设计核心概念、微指令编码与控制器设计全解析

学计算机组成原理的人大多有同一种体验:前面学数据表示、运算器、存储系统都还觉得能跟上,一到控制器这一章就开始发懵。尤其是“微程序设计”这几个字出现之后,微指令、微操作、控制存储器、微地址、微程序入口……一堆“微”字辈概念砸过来…

阅读更多 →
游戏逆向工程在反作弊攻防中的实战路径:从静态分析到行为建模 2026/10/2 4:46:47

游戏逆向工程在反作弊攻防中的实战路径:从静态分析到行为建模

我这两年做游戏安全防护,最大的感受是:游戏逆向工程这件事,真正拉开差距的从来不是会不会用IDA,而是能不能看懂攻击者脑子里的那张攻防地图。很多人一听到"逆向"就觉得是破解、是外挂制作,但在反作弊攻防这个…

阅读更多 →
Vue数据大屏实战:手写数字滚动与翻牌器组件,解决路由与打包兼容问题 2026/10/2 4:46:28

Vue数据大屏实战:手写数字滚动与翻牌器组件,解决路由与打包兼容问题

Vue项目实战:手写数字滚动和翻牌器组件,让数据大屏真正“动”起来如果你做过数据可视化大屏,一定遇到过这样的需求:页面上那几个核心指标数字,不能干巴巴地直接刷出来,领导要的是“有科技感”——数字刷新时…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉