ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

使用 PyTorch/TensorFlow 构建全连接网络:Iris 与 MNIST 分类实验全解析(AI for Beginners)

使用 PyTorch/TensorFlow 构建全连接网络:Iris 与 MNIST 分类实验全解析(AI for Beginners) 教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载本文是 AI for Beginners 课程《神经网络框架》章节配套实验的完整技术指南。实验要求读者使用 PyTorch 或 TensorFlow 搭建单层与多层全连接网络分别解决鸢尾花Iris三分类与 MNIST 手写数字分类两个问题并通过调整网络架构系统地观察过拟合现象。读完本文你将掌握从数据加载、归一化、标签编码、训练/测试集划分到模型定义、训练与精度观测的完整流程并能在实际实验中复现并规避过拟合。实验概览任务、目标与课程定位本实验是课程第 3 部分神经网络第 5 课《Frameworks》的作业官方英文说明位于 lessons/3-NeuralNetworks/05-Frameworks/lab/README.md实验的起始 Notebook 为 LabFrameworks.ipynb本指南的希腊语翻译版位于 translations/el/lessons/3-NeuralNetworks/05-Frameworks/lab/README.md内容与英文版一致。实验包含两项任务[Iris 鸢尾花分类]表格型数据的经典分类示例传统机器学习即可胜任。目标是根据 4 个数值参数花萼长、花萼宽、花瓣长、花瓣宽将鸢尾花分为 3 个类别setosa、versicolor、virginica。[MNIST 手写数字分类]前序章节已经接触过的 0~9 手写数字图像识别问题。实验的核心教学目的并非刷精度而是尝试不同的网络架构追求尽可能高的准确率并在这个过程中亲眼观察过拟合行为。正如 Notebook 结尾的 Takeaway 所强调的神经网络可以用于传统机器学习任务但在很多情况下它过于强大、容易过拟合本作业要求你观察过拟合并尝试避免它。环境准备框架选择与依赖安装框架选型课程在第 5 课中同时提供 TensorFlow 与 PyTorch 两套内容框架章节说明 中给出两者关系层级TensorFlowPyTorch底层 APITensorFlowPyTorch高层 APIKerasPyTorch Lightning底层 API允许构建计算图computational graph支持在 GPU/TPU 等专用计算单元上并行执行并自动对计算图求导以获得梯度。高层 API将神经网络视为层的序列构造多数网络更加便捷训练时通常只需准备数据并调用fit函数。两种 API 可以混用既可以用底层 API 自定义网络层再放入高层 API 训练的更大网络中也可以用高层 API 定义网络再用底层训练循环做优化。仓库根目录的 requirements.txt 中列出本课程所需依赖与本实验直接相关的包括tensorflow2.17.0、keras3.13.2、torchinfo1.8.0、seaborn0.13.2、pandas2.2.2、tensorboard2.17.1等。若使用 PyTorchIntroPyTorch.ipynb 建议通过官方渠道安装pip install torch torchvision或使用 condaconda install pytorch -c pytorch实验前建议先浏览两个入门 Notebook 熟悉 APIKeras 入门 Notebook 与 PyTorch 入门 Notebook它们与本实验同目录覆盖了实验所需的所有 API 细节。Part 1Iris 鸢尾花分类1.1 获取数据集Iris 数据集内置于 Scikit Learn可直接加载。Notebook 中给出的代码会输出特征名与类别名from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split iris load_iris() features iris[data] labels iris[target] class_names iris[target_names] feature_names iris[feature_names] print(fFeatures: {feature_names}, Classes: {class_names})运行结果为Features: [sepal length (cm), sepal width (cm), petal length (cm), petal width (cm)], Classes: [setosa versicolor virginica]该数据集共 150 条记录、3 个类别每条记录含 4 个数值参数是典型的简单到无需强大神经网络的数据集。1.2 可视化数据在建模前先可视化数据确认各类别是否可分能帮助我们判断能否构建出好的分类模型。由于特征数量不多可以借助seaborn生成两两组合的 2D 散点图pair plot用不同颜色区分类别import seaborn as sns import pandas as pd df pd.DataFrame(features,columnsfeature_names).join(pd.DataFrame(labels,columns[Label])) df sns.pairplot(df,hueLabel)从散点图中可以直观看到setosa 类与其他两类在多个特征维度上明显分离而 versicolor 与 virginica 存在部分重叠这预示着后续分类任务并不困难但两个重叠类别需要网络具备一定的非线性表达能力。1.3 数据归一化与标签编码为神经网络准备数据时需要将输入归一化到[0, 1]区间。这可以用纯numpy操作完成也可以使用 Scikit Learn 的预处理方法。归一化的直观原因课程会在后文深入讨论希望流经网络的值不会过大或过小权重以接近 0 的小随机数初始化信号也应保持在相近的量级。归一化时需用训练集计算 min 与 range再用同一组 min/range 归一化测试/验证集——因为真实场景中我们只能接触到训练集新输入值偶尔落在 [0, 1] 之外也无妨train_x_norm (train_x-np.min(train_x,axis0)) / (np.max(train_x,axis0)-np.min(train_x,axis0)) test_x_norm (test_x-np.min(train_x,axis0)) / (np.max(train_x,axis0)-np.min(train_x,axis0))上述代码取自 IntroKeras.ipynb供实验中的归一化步骤参考。标签编码方面你需要决定目标标签是否采用 one-hot 编码。PyTorch 和 TensorFlow 都允许以整数类别号0 到 N-1或 one-hot 向量两种方式输入标签定义网络结构时必须据此选择对应的损失函数整数表示对应sparse categorical crossentropyone-hot 编码对应categorical crossentropy。one-hot 编码既可以用 sklearn 的OneHotEncoder也可以用下面这段代码完成n_values np.max(labels) 1 labels_onehot np.eye(n_values)[labels]1.4 划分训练集与测试集由于 Iris 没有现成的 train/test 划分需要借助 sklearn 的train_test_split手动划分from sklearn.model_selection import train_test_split # 具体划分比例可自行指定例如 70/30Notebook 在 Split the data 单元中预留了实现位置。后续 MNIST 部分则无需手动划分因为 Keras/PyTorch 均内置了训练集与测试集。1.5 定义并训练神经网络准备好数据后即可导入所选框架定义网络并开始训练同时观察训练集与验证集准确率的变化。以 Keras 为例网络通常被定义为层的序列。最简的单层网络3 个神经元等于类别数可这样构建model keras.models.Sequential() model.add(keras.Input(shape(4,))) # Iris 有 4 个特征 model.add(keras.layers.Dense(3)) # 3 个输出神经元 3 个类别 model.add(keras.layers.Activation(keras.activations.softmax)) model.summary()训练前需要先compile模型即指定三要素损失函数多分类问题使用categorical crossentropyone-hot 标签或sparse categorical crossentropy整数标签优化器最简单的sgd随机梯度下降或更高级的adam评估指标分类任务常用Accuracy可简写为acc。例如取自 IntroKeras.ipynbmodel.compile(optimizerkeras.optimizers.SGD(learning_rate0.2), losscategorical_crossentropy, metrics[acc])随后调用fit进行训练常用参数包括x、y训练数据的特征与标签validation_data验证数据元组指定后每个 epoch 都会执行验证epochs训练轮数batch_size小批量大小也可以先手动分批数据此时无需该参数。model.fit(xtrain_x_norm, ytrain_labels_onehot, validation_data(test_x_norm, test_labels_onehot), epochs10, batch_size1)PyTorch 侧的等效做法同样取自 IntroPyTorch.ipynb是使用torch.nn.Sequential定义网络、torch.optim.Adam定义优化器再手写训练循环optim.zero_grad()→loss.backward()→optim.step()。1.6 观察训练曲线fit会返回history对象其中记录了每个 epoch 的损失与指标可绘制训练/验证准确率曲线hist model.fit(...) plt.plot(hist.history[acc]) plt.plot(hist.history[val_acc])代码取自 IntroKeras.ipynb 的Plotting the training graphs部分。这是观察过拟合的关键手段训练准确率与验证准确率的背离正是过拟合的直接信号。1.7 架构实验体会过拟合完成基线训练后请尝试以下网络架构并对比结果单层网络3 个神经元等于类别数两层网络小/中/大不同规模的隐藏层使用更多层数。Notebook 明确提示请务必在使用包含大量神经元参数的丰富模型时观察过拟合。当模型参数远多于训练样本时网络会记住训练集而非学到其背后的规律具体机理见下文观察过拟合一节。Part 2MNIST 手写数字分类2.1 加载内置数据集Keras 与 PyTorch 都内置了 MNIST 数据集几行代码即可加载且同时提供训练集与测试集无需手动划分Keraskeras.datasets.mnistPyTorchtorchvision.datasets.MNIST参见 PyTorch 官方数据集文档Notebook 中有对应链接。2.2 归一化、定义与训练加载后重复与 Iris 相同的流程确认/完成数据归一化MNIST 通常已经预处理定义并训练网络。MNIST 输入为 28×28 的灰度图像作为全连接网络输入时需要展平为 784 维向量输出为 10 个类别最后一层用 softmax损失函数同样根据标签形式在 categorical / sparse categorical crossentropy 之间选择。PyTorch 版本可在 IntroPyTorch.ipynb 的 Task 2 中找到提示使用cross_entropy_with_logits作为损失函数。由于 MNIST 任务规模远大于 Iris此时网络宽度的选择对过拟合的影响更加明显可以系统地对比小隐藏层与超大隐藏层在验证集上的表现差异。观察过拟合本实验的核心教学目标本实验最重要的学习成果是观察过拟合并尝试避免它。框架章节在实验说明之后专门对过拟合做了系统讲解见 lessons/3-NeuralNetworks/05-Frameworks/README.md。什么是过拟合考虑用模型拟合 5 个散点图中以x表示的问题线性模型2 个参数非线性模型7 个参数训练误差 5.3训练误差 0验证误差 5.1验证误差 20左图线性模型是一条很好的直线近似。参数数量与问题匹配模型把握住了数据分布背后的规律右图过拟合模型过于强大只有 5 个点却有 7 个参数模型可以调整自身恰好穿过所有点使训练误差降为 0但这使其无法理解数据背后的正确模式验证误差因而非常高。在模型丰富度参数数量与训练样本数量之间取得正确平衡至关重要。左图与右图分别对应本课程 images 目录下的 overfit1.jpg 与 overfit2.jpg。过拟合产生的原因训练数据不足模型过于强大参数过多输入数据中噪声过多。如何检测过拟合如上面的对比图所示过拟合可以通过极低的训练误差 很高的验证误差来识别。正常训练过程中训练误差与验证误差起初都会下降随后验证误差可能停止下降并开始上升——这就是过拟合的信号提示我们应该在此停止训练或至少为模型做一个快照如何预防过拟合检测到过拟合时可以采取以下措施之一增加训练数据量降低模型复杂度使用正则化技术regularization例如 Dropout课程后续章节会介绍。过拟合与偏差-方差权衡过拟合实际上是统计学中更一般问题——偏差-方差权衡Bias-Variance Tradeoff——的特例。模型误差的来源有两种偏差误差Bias算法无法正确捕捉训练数据之间的关系源于模型能力不足欠拟合方差误差Variance模型拟合了输入数据中的噪声而非有意义的规律过拟合。训练过程中偏差误差随模型学习拟合数据而下降方差误差则不断上升。因此重要的是在合适时机停止训练——手动检测到过拟合时或自动引入正则化——以防止过拟合。框架 API 深度补充Keras 与 PyTorch 对照为了让实验代码真正可写、可跑下面补充两个入门 Notebook 中与本实验直接相关的关键 API均出自 IntroKeras.ipynb 与 IntroPyTorch.ipynb。分类问题损失函数速查表分类类型标签格式激活函数损失函数二分类第 1 类概率sigmoidbinary crossentropy二分类one-hot2 个输出softmaxcategorical crossentropy多分类one-hotsoftmaxcategorical crossentropy多分类类别号softmaxsparse categorical crossentropy多标签one-hotsigmoidcategorical crossentropyIris 与 MNIST 均属于多分类问题可据此确定最后一层的神经元个数类别数、softmax 激活以及对应的交叉熵损失。PyTorch 的网络定义方式PyTorch 中torch.nn.Module用于表示神经网络有两种定义方式Sequential直接指定层的列表适合标准的前馈结构net torch.nn.Sequential(torch.nn.Linear(2,5), torch.nn.Sigmoid(), torch.nn.Linear(5,1))继承torch.nn.Module的类更灵活可表达任意复杂架构只需将各层定义为类成员Module会自动收集参数供优化器使用class MyNet(torch.nn.Module): def __init__(self, hidden_size10, functorch.nn.Sigmoid()): super().__init__() self.fc1 torch.nn.Linear(2, hidden_size) self.func func self.fc2 torch.nn.Linear(hidden_size, 1) def forward(self, x): x self.fc1(x) x self.func(x) x self.fc2(x) return x训练循环的标准套路是optim.zero_grad()清零梯度 →loss.backward()反向传播 →optim.step()更新参数。PyTorch 还提供TensorDatasetDataLoader组合来自动完成小批量切分。若想进一步简化可升级为 PyTorch Lightningpl.LightningModuleTrainerNotebook 中有完整示例。实验参数调优提示来自 Keras 入门 Notebook 的经验总结直接适用于本实验batch_size过大或不指定可能导致训练不稳定低维数据下小批量能提供每个样本更精确的梯度方向学习率过高可能导致过拟合或结果不稳定过低则需要更多 epoch 才能收敛可以连续多次调用fit继续训练若想从头开始需要重新运行模型定义的单元。实验总结与关键收获完成本实验后你应当带走以下三点认识与 Notebook 的 Takeaway 一致神经网络可以用于传统机器学习任务但在很多情况下它过于强大容易过拟合——Iris 这类小数据集就是最好的演示场景本作业最重要的是观察过拟合行为并尝试避免——通过调整架构宽度/深度对比训练与验证曲线直观理解参数数量 vs 训练样本数量的平衡使用 Keras 等框架训练网络往往非常直接几行代码完成定义与训练但你必须理解背后发生了什么——这正是课程坚持从底层 API 讲起、再进入高层 API的原因参见 OwnFramework.ipynb 中手动实现反向传播的练习。继续深入学习可参考框架章节的 README.md、IntroKerasTF.ipynb 以及后序计算机视觉章节中的 TrainingTricks.md正则化技巧详解。赞分享教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载相关推荐AI for Beginners 实验指南用 PyTorch/TensorFlow 全连接网络完成 Iris 与 MNIST 分类AI for Beginners 实验指南用 PyTorch/TensorFlow 全连接网络完成 Iris 与 MNIST 分类 本篇技术指南围绕 AI f教程人工智能机器学习深度学习AI for Beginners 实验指南用 PyTorch/TensorFlow 全连接网络完成 Iris 与 MNIST 分类AI for Beginners 实验指南用 PyTorch/TensorFlow 全连接网络完成 Iris 与 MNIST 分类 导读 本文是 AI for教程人工智能机器学习深度学习AI-For-Beginners 实验指南用 PyTorch / TensorFlow 全连接网络完成 Iris 与 MNIST 分类AI For Beginners 实验指南用 PyTorch / TensorFlow 全连接网络完成 Iris 与 MNIST 分类 本篇技术指南以 AI教程人工智能机器学习深度学习上一篇MongoDB Router Role API 深度解析CollectionRouter 路由框架与 Scatter-Gather 命令分发机制下一篇Envoy CVE-2019-15225 与 CVE-2019-15226 安全事件复盘正则匹配栈溢出与 HeaderMap O(n²) 拒绝服务漏洞的根因与修复创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表