《基于神经网络实现手写数字分类》

news2025/4/19 12:32:27

《基于神经网络实现手写数字分类》

一、主要内容

   1、通过B站陈云霁老师的网课,配合书本资料,了解神经网络的基本组成和数学原理。

   2、申请云平台搭建实验环境

   3、基于5个不同的实验模块逐步理解实验操作步骤,并实现不同模块代码的补全

   4、实验运行阶段,在MobaXterm上进行实验运行,并根据显示的准确率的高低调整实验参数的大小。

  二、实验部分:

(一)模型的搭建

在B站系统的学习完《智能计算系统》对应章节的网课的后,对于神经网络的组成我有了更清晰的了解。从机器学习到神经网络的过渡,掌握了从单变量线性回归到多变量线性回归,再到感知机、神经元、激活函数,偏置等概念的深度挖掘,对于深度学习这块知识的了解有了比较明晰的轮廓。

   再到后来对于不同具体组成的了解过程中,基于数学公式,对于正向传播、激活函数、损失函数、反向传播等不同概念,掌握了从数学分析的角度出发,对于不同过程中对于不同类常用激活函数和损失函数的优缺点领会深刻。

   在领会底层数学原理后,基于已有代码的引导,我进行了对于layers_1.py文件当中的不同函数的代码完善,实现FullyConnectedLayer,ReLULayer,SoftmaxLossLayer代码搭建,分别对应了神经网络中的全连接层、激活层、Softmax 损失层的搭建,实现了三层神经网络的底层逻辑。

   然后在mnist_mlp_cpu.py文件中,我首先填补了load_mnist 读取和预处理 MNIST 中训练数据和测试数据的对应代码

图(1)

   图(2):对于图(1)代码的补全

再进行了基于layer_1.py类函数对于多层感知机模型的搭建

图(3)

图(4):对于图(3)代码的补全

二、基于准确率对于模型的优化

在完成模型的搭建后,我对于整个模型进行了一些优化,比如说设计了学习率递减的训练模式,不过在后续验证过程中发现这对于模型准确率的影响不大,准确率依旧维持在90%,后来又设计了提取损失函数最小值的模型参数进行保存的函数,对于准确率有3个百分点的提升,最后在参数的设计上,我先是将两个全连接层的神经元个数由32、16提升到128、128,发现准确率的起伏不超过一个点,后来我修改了batch_size,也就是一次训练的样板个数,从100缩减到10-20这个区间内,准确率才再次提高了5个百分点左右,并逐步稳定在97—98%这个范围内,最后我将两个全连接层的神经元个数进行削减,削减到64、32左右,在对于准确率影响不大的基础上加快了训练速度。

在这个阶段的学习中,我额外地了解到了过拟合和正则化的概念,比如利用bagging或者Dropout方法进行正则化,提高模型的泛化能力。同时我也明白了对于数据集而言,和训练集的高度拟合并不一定意味着效果更好,而是意味着模型的泛化能力可能会变差甚至降低许多。在整个实验过程中,我在训练模型的时候有出现过损失函数为0的情况,但实际展现出来的准确率并不是最好的。

图(5)

如图(1)所示,在调整参数的情况下,使模型对于训练集数据完全拟合,但在测试集当中,并没有展现出100%的准确率。并且在后续的学习过程中,有时候损失函数的值极低,但并未等于0的情况下,对于训练集的准确率,反而有提高的趋势。如图(2)所示,该图的损失函数值为0.000001

图(6)

三、基于不同方法对于模型性能的评估

除此之外,我也对于模型精度的评估有了一定的了解,知道了不同模型适合的评估方法,比如留一法交叉验证或者是k-折交叉验证,这些模型的验证方法是从评估该模型的性能的同时考虑泛化性的角度提出的。不过这个实验操作过程中的模型评估方法只是单纯地依靠测试数据集进行准确率的计算。

四、总结

在这段学习过程中,通过B站的网课,我对于深度学习的底层概念,神经网络组成等方面有一个明确地认知。最大的感受其实是深度学习的局限性。在陈老师的课程中,在他讲完基础的人工智能发展历程,从行为主义到符号主义,再到连接主义的这个历史进程中。他提到了当下的主流是连接主义,不可避免地讲到了深度学习的一些问题。即泛化能力差,缺乏推理能力,缺乏可解释性,鲁棒性欠佳。在后续的学习过程中慢慢就会发觉,这些问题其实涵盖了整个学习过程中的不同方面,由问题产生了解决方法,然后再进一步对于深度学习的过程进行优化。

   比如泛化能力差,训练模型对于训练集的拟合程度是根据损失函数值的大小进行评估的,而在具体情况中,可能体现为全连接层的层数过多,或者全连接层当中的神经元个数过多,导致高度拟合的情况出现,此时损失函数的值过小,容易导致该训练模型对于训练集过于拟合,也就是过拟合的概念的产生,在过拟合的这个问题上,对应产生了正则化的概念,可以通过适当的忽略一些神经元参数,生成子神经网络,提高模型的泛化性等方法进行优化。

然后是推理能力和可解释性的缺乏,模型基于不同的初始化参数进行训练,对于具体的图像,它是通过数学分析的方法进行概率的计算,并作出推测。这个实验的模型是多层感知机(MLP),主要是基于全连接层。而MLP的神经元网络由于是以全连接层为基础,所以每个全连接层的神经元都和上一个全连接层或者是输入层的所有神经元相连接。这也就意味着MLP主要侧重于对于图像数据的整体特征的一个提取,图像的每个像素点后都有一个神经元对应连接。

而卷积网络模型(CNN)是利用卷积核对于图像数据的特征进行提取,基于卷积核的大小样式的不同,提出的特征也会不同,与MLP不同,CNN更侧重对于局部特征的提取,这些局部特征包括图像边缘细节,这是MLP不擅长的。而在提取到图像不同位置的特征后,CNN再通过全连接层对于各类特征的进行拼图实的操作,最后计算出概率。

再者是鲁棒性欠佳,这个问题主要和正向传播与反向传播过程中的激活函数和损失函数的选择有关。在陈老师的课程中主要提到的是一些激活函数的输出值为非0均值,比如sigmoid函数,这类函数在计算的时候会导致w计算时梯度都是正的,影响神经网络的收敛。而且如果输入的实数过大的时候,sigmoid的输出无限接近于1,梯度下降十分不明显,造成梯度消失的情况的出现。所以为了提高模型的鲁棒性,可以考虑一些带负值输出的函数,比如课程里讲到的tanh函数或者leaky-Relu函数作为激活函数,以此增强代码的健壮性。

五、建议

这个学习阶段是承接了书本上一个学习阶段的一些学习结果进行的。所以其实是在一定基础上对于原来学习的深度学习知识在底层实现上有了更系统化的认知。没有什么过多的学习建议,因为基于底层的一些学习,是基于数学知识的一些推理理解。认真细致地慢慢学完就可以。正如陈云霁老师在课程中讲到的一段话,每有一个数学公式或符号的出现,就意味可能会有一部分人会因为看不懂而退走。好好学完就行,就这样。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2337288.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1 cline 提示词工程指南-架构篇

cline 提示词工程指南-架构篇 本篇是 cline 提示词工程指南的学习和扩展,可以参阅: https://docs.cline.bot/improving-your-prompting-skills/prompting 前言 cline 是 vscode 的插件,用来在 vscode 里实现 ai 编程。 它使得你可以接入…

代理模式简述

目录 一、主要角色 二、类型划分 三、静态代理 示例 缺点 四、动态代理 JDK动态代理 示例 缺点 CGLib动态代理 导入依赖 示例 五、Spring AOP 代理模式是一种结构型设计模式,通过代理对象控制对目标对象的访问,可在不改变目标对象情况下增强…

【Docker】运行错误提示 unknown shorthand flag: ‘d‘ in -d ----详细解决方法

使用docker拉取Dify的时候遇到错误 错误提示 unknown shorthand flag: d in -dUsage: docker [OPTIONS] COMMAND [ARG...]错误原因解析 出现 unknown shorthand flag: d in -d 的根本原因是 Docker 命令格式与当前版本不兼容,具体分为以下两种情况: 新…

【AI插件开发】Notepad++ AI插件开发实践:实现对话窗口功能

引言 之前的文章已经介绍实现了AI对话窗口,但只有个空壳,没有实现功能。本次将集中完成对话窗口的功能,主要内容为: 模型动态切换:支持运行时加载配置的AI模型列表交互式输入处理:实现多行文本输入与Ctrl…

在激烈竞争下B端HMI设计怎样打造独特用户体验?

在当今数字化高度发展的时代,B 端市场竞争愈发激烈。对于 B 端 HMI(人机界面)设计而言,打造独特的用户体验已成为在竞争中脱颖而出的关键因素。B 端用户在复杂的工作场景中,对 HMI 设计有着独特的需求和期望&#xff0…

【Netty篇】Handler Pipeline 详解

目录 一、 Handler & Pipeline——流水线上的“特种部队”与“生产线”1、 ChannelHandler —— 流水线上的“特种兵”👮‍♂️2、 ChannelPipeline —— 生产线上的“接力赛跑”🏃‍♀️🏃‍♂️ 二、 代码实例1、 服务端代码示例2、 客…

16-算法打卡-哈希表-两个数组的交集-leetcode(349)-第十六天

1 题目地址 349. 两个数组的交集 - 力扣(LeetCode)349. 两个数组的交集 - 给定两个数组 nums1 和 nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1:输入:nu…

java + spring boot + mybatis 通过时间段进行查询

前端传来的只有日期内容&#xff0c;如&#xff1a;2025-04-17 需要在日期内容的基础上补充时间部分&#xff0c;代码示例&#xff1a; /*** 日志查询&#xff08;分页查询&#xff09;* param recordLogQueryDTO 查询参数对象* return 日志列表*/Overridepublic PageBean<…

helm账号密码加密

1、安装工具 sudo apt update sudo apt install gnupg -y wget https://github.com/getsops/sops/releases/download/v3.10.2/sops-v3.10.2.linux.amd64 mv sops-v3.10.2.linux.amd64 /usr/local/bin/sops chmod x /usr/local/bin/sops2、生成加密文件 gpg --full-generate-…

Flink 编程基础:Scala 版 DataStream API 入门

大家好&#xff01;我是心海 流处理技术在大数据时代正变得越来越重要&#xff0c;而 Apache Flink 作为领先的流处理引擎&#xff0c;凭借其高性能、低延迟和丰富的 API 受到了广泛关注。本文将以 Scala 语言为例&#xff0c;详细讲解 Flink DataStream API 的基本编程模型&am…

HTML5好看的水果蔬菜在线商城网站源码系列模板5

文章目录 1.设计来源1.1 主界面1.2 关于我们1.3 商品服务1.4 果蔬展示1.5 联系我们1.6 商品具体信息1.7 登录注册 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#…

宜搭与金蝶互通——连接器建立

一、 进入连接器工厂 图1 连接器入口 二、 新建连接器 图2 新建连接器第一步 1、 连接器显示名,如图2中①所示; 2、 图2中②域名,是金蝶系统API接口里面的“完整服务地址”com之前的信息,不含“https”,如图3中①所示; 3、 Base Url通常为“/”,如图2…

SP7733:HPYNOS - Happy Numbers I(参考我之前的文章,哈希)

题目大意 我们定义“破坏”整数的过程是对其每一位上的数字的平方求和成为一个新数&#xff0c;如果一个数在经过若干次“破坏”以后变成了 1&#xff0c;那么这个数就是一个高兴的数字&#xff0c;输出变化次数&#xff0c;否则如果永远不会变成 1&#xff0c;输出 −1。 例如…

【JavaWeb】详细讲解 HTTP 协议

文章目录 一、HTTP简介1.1 概念1.2 特点 二、协议2.1 HTTP-请求协议&#xff08;1&#xff09;GET方式&#xff08;2&#xff09;POST方式&#xff08;3&#xff09;GET和POST的区别&#xff1a; 2.2 HTTP-响应协议&#xff08;1&#xff09;格式&#xff08;2&#xff09;响应…

“星睿O6” AI PC开发套件评测 - Windows on Arm 安装指南和性能测评

引言 Radxa联合此芯科技和安谋科技推出全新的"星睿O6"迷你 ITX 主板。该系统搭载了 CIX P1&#xff08;CD8180&#xff09;12 核 Armv9 处理器&#xff0c;拥有高达30T算力的NPU和高性能的GPU&#xff0c;最高配备64GB LPDDR内存&#xff0c;并提供了如 5GbE、HDMI …

Python 调用 YOLOv11 ONNX

Python 调用 YOLO ONNX 1 下载ONNX文件2 Python代码 1 下载ONNX文件 ONNX下载地址 2 Python代码 import cv2 from ultralytics import YOLOdef check(yolo:str, path:str):# 加载 YOLOv11model YOLO(yolo)# 读取图片img cv2.imread(path)# 推理&#xff08;可以传文件路径…

数据通信学习笔记之OSPF路由汇总

区域间路由汇总 路由汇总又被称为路由聚合&#xff0c;即是将一组前缀相同的路由汇聚成一条路由&#xff0c;从而达到减小路由表规模以及优化设备资源利用率的目的&#xff0c;我们把汇聚之前的这组路由称为精细路由或明细路由&#xff0c;把汇聚之后的这条路由称为汇总路由或…

ASP.NET Core Web API 配置系统集成

文章目录 前言一、配置源与默认设置二、使用步骤1&#xff09;创建项目并添加配置2&#xff09;配置文件3&#xff09;强类型配置类4&#xff09;配置Program.cs5&#xff09;控制器中使用配置6&#xff09;配置优先级测试7&#xff09;动态重载配置测试8&#xff09;运行结果示…

如何判断单片机性能极限?

目录 1、CPU 负载 2、内存使用情况 3、实时性能 4、外设带宽 5、功耗与温度 在嵌入式系统设计中&#xff0c;当系统变得复杂、功能增加时&#xff0c;单片机可能会逐渐逼近其性能极限。及时识别这些极限点对于保证产品质量、稳定性和用户体验至关重要。 当你的嵌入式系统…

AI在多Agent协同领域的核心概念、技术方法、应用场景及挑战 的详细解析

以下是 AI在多Agent协同领域的核心概念、技术方法、应用场景及挑战 的详细解析&#xff1a; 1. 多Agent协同的定义与核心目标 多Agent系统&#xff08;MAS, Multi-Agent System&#xff09;&#xff1a; 由多个独立或协作的智能体&#xff08;Agent&#xff09;组成&#xff…