matlab实现神经网络检测手写数字

一、要求

1.计算sigmoid函数的梯度;

2.随机初始化网络权重;

3.编写网络的代价函数。

二、算法介绍

神经网络结构:

不正则化的神经网络的代价函数:

正则化:

S型函数求导:

反向传播算法:

step1:初始化 ,然后使用前向传播算法计算

step2:计算第三层的误差

step3:对于第二层 

step4:使用公式 累积这个例子的所有的梯度!注意你需要跳过或者移除

step5:通过将之前累积的梯度除以m得到没有正则化的神经网络代价函数的梯度;

三、过程记录

1.可视化数据集

导入数据集后,通过displayData函数将数据集显示出来,由于数据集数据较大,随机选取100个数据点进行显示,结果如下:

图1 显示数据集

2.模型表示

构造的神经网络包含输入层,隐含层,输出层,由于图像大小为20×20,所以设定输入层大小为400,设定隐藏层大小为25,标签一共10个。

3.前馈与成本函数

将标签重新编码为只包含0和1的向量,在标签向量y中找到标签号对应的位置,在将新的向量中放入处理后的值,处理的要求是将一维标签号i改为十维向量,其中第i个位置为1其余为0,如3处理后为[0 0 1 0 0 0 0 0 0 0]

接下来再正则化成本函数

导入θ1和θ2的参数集,θ1不参与正则化,对相应参数进行处理然后通过公式计算得出

当lambda设定为0时,结果如下:

图2 lambda=0代价值

Lambda为1时:

图3 lambda=1代价值

4.反向传播

该部分需要用到sigmoid函数,在之前实验已经成功编写,通过如下语句可以在sigmoidGradient中实现对sigmoid函数梯度的计算:

给出示例进行测试:

结果如下:

图4 验证sigmoid梯度函数

接下来初始化θ的权重,通过随机选取[-0.12 0.12]范围内的值以确保参数保持较小使学习有效,初始化函数randInitializeWeights中代码如下:

完成后进行调用:

然后完成正则化反向传播算法,通过循环对不同示例进行处理,每一次需要完成四个步骤:将输入层的值设置为第t个训练示例、对于输出层每个单元k进行处理、对于隐藏层进行设置、累计梯度。最后将累计梯度除以示例的个数m得到神经网络的代价函数梯度。

完成上述之后通过checkNNGradients函数检查梯度,该函数将创造一个小的神经网络和数据集进行测试,结果如下:

图5 梯度检查结果

从图中可以看出左右两边梯度值非常相似,最终计算出来的相对差异也小于1e-9,说明梯度计算正确。

5.使用函数fmincg来优化学习参数

设置最大迭代次数为50次,lambda=1,通过fmincg函数训练迭代寻找得到最佳的参数θ

训练部分过程如下:

图6 训练过程

可以看出代价值在不断减小,寻找最佳的状态

6.预测并计算准确率

通过predict函数实现预测的功能,其中代码如下:

将θ1和θ2以及预测样本传入函数中得到p即为预测值,再与训练集真实值进行比较得到准确率如下:

图7 训练集准确率

7.可视化隐藏层

为了理解神经网络在学习什么,通过displayData函数将其可视化:

结果如下:

图8 可视化隐藏层

图中一共有25个单元,每个单元对应网络中的一个隐藏单元。

8.修改参数进一步实验

为了更深入地了解神经网络的性能如何随正则化参数λ和训练步骤数而变化的,对程序中的参数进行修改并观察结果:

图9 λ=0.5

图10 λ=0.01

图11 λ=10

图12 λ=100

图13 迭代次数为100

图14 迭代次数为500

四、结果分析

    通过上述实验分析可知,实验中构造的反向传播神经网络能够较为准确的识别出数据集中的手写数字。在实验过程中由成本函数和梯度等一些计算中以及优化参数的过程中,正则化参数和迭代次数的设定对实验的结果有一定的影响,通过进一步探究发现,正则化参数值减小,训练集精度会有一定的增大如图9与图10,而若正则化参数增大则训练集精度可能会减小如图11和图12所示。可知,正则化可以防止过拟合,正则化参数太小容易产生过拟合,太大容易产生欠拟合,在无法增加样本数量或增加样本数量的成本过高时,正则化是一种行之有效的方法。又由于优化参数的过程是一个迭代寻优的过程,成本函数的值会不断降低,迭代次数增大后训练集精度有显著上升,如图13和图14所示。

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

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

相关文章

【Linux】Linux工具学习之git

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 文章目录 前言一、账号注册1.1 GitHub与Gitee 二、构建仓库三、安装git 四、配置git五、克…

详解库和程序运行过程

我最近开了几个专栏,诚信互三! > |||《算法专栏》::刷题教程来自网站《代码随想录》。||| > |||《C专栏》::记录我学习C的经历,看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

lvgl 窗口 windows lv_port_win_visual_studio 版本 已解决

不知道的东西,不知道lvgl窗口。一切从未知开始 lv_port_win_visual_studio 主分支 对应的分支 v7版本更新git submodule update --init --recursive同步 lvgl代码随后打开 visualSudio 打开.sln 文件 编译 release模式 允许 一切正常代码部分

perl:获取同花顺数据--业绩预告,送股派息

perldoc LWP::UserAgent 如果没有安装,则安装模块,运行 cpanm LWP::UserAgent 。 编写 get_yjyg_10jqka.pl 如下 #!/usr/bin/perl # perl 获取同花顺数据--业绩预告 use LWP::UserAgent; use Encode qw(decode encode); use POSIX; use Data::Dump…

JavaWeb——Servlet

请求转发是一次转发请求转发URL地址不会发生变化,会保留当前Servlet的资源访问路径共享同一个Request作用域,可用于多页面之间传递数据 getServletContext() 返回一个ServletContext()对象 获取请求头信息 getHeader(String key)根据key获取value 例如 r…

Element UI el-dialog自由拖动功能

1.创建drag .js文件 /*** 拖拽移动* param {elementObjct} bar 鼠标点击控制拖拽的元素* param {elementObjct} target 移动的元素* param {function} callback 移动后的回调*/ export function startDrag(bar, target, callback) {var params {top: 0,left: 0,currentX: …

学习资料记录

http://interview.wzcu.com/Golang/%E4%BB%A3%E7%A0%81%E8%80%83%E9%A2%98.html map底层 https://zhuanlan.zhihu.com/p/616979764 go修养 https://www.yuque.com/aceld/golang/ga6pb1#4b19dba5 https://golang.dbwu.tech/performance/map_pre_alloc/ https://juejin.cn/pos…

C++11新特性:sizeof... 运算符

在 C11 及其后续版本中,引入了一项新的语言特性——sizeof...运算符,这是一个与模板编程紧密相关的特性。 你没看错,sizeof 后面是三个点:sizeof... sizeof...运算符用于计算变参模板(variadic template)…

考研数学基础差,跟宋浩?

宋浩老师的课程我大一的时候听过,是我大一高数的救命恩人! 不过,考研的针对性很强,基础差听宋浩老师的课程不如直接听汤家凤老师的课程,因为汤家凤老师的课程是专门为考研数学设计的,针对性很强。 汤家凤老…

K8S之DaemonSet控制器

DaemonSet控制器 概念、原理解读、应用场景概述工作原理典型的应用场景介绍DaemonSet 与 Deployment 的区别 解读资源清单文件实践案例 概念、原理解读、应用场景 概述 DaemonSet控制器能够确保K8S集群所有的节点都分别运行一个相同的pod副本; 当集群中增加node节…

Django之Celery篇(一)

一、介绍 Celery是由Python开发、简单、灵活、可靠的分布式任务队列,是一个处理异步任务的框架,其本质是生产者消费者模型,生产者发送任务到消息队列,消费者负责处理任务。 Celery侧重于实时操作,但对调度支持也很好,其每天可以处理数以百万计的任务。特点: 简单:熟悉…

监控系统Prometheus--入门

文章目录 Prometheus特点易于管理监控服务的内部运行状态强大的数据模型强大的查询语言PromQL高效可扩展易于集成可视化开放性 Prometheus架构Prometheus 生态圈组件架构理解 Prometheus的安装安装Prometheus Server上传安装包解压安装包修改配置文件 prometheus.yml 安装Pushg…

Halcon 3D 平面拟合(区域采样、Z值过滤、平面拟合、平面移动)

Halcon 3D 平面拟合(区域采样、Z值过滤、平面拟合、平面移动) 链接:https://pan.baidu.com/s/1UfFyZ6y-EFq9jy0T_DTJGA 提取码:ewdi * 1.读取图片 ****************

ThreadLocal的主要特点:

ThreadLocal的主要特点: ThreadLocal是Java中的一个类,它提供了线程局部变量的实现机制。ThreadLocal的实例可以为每个使用该变量的线程提供单独的变量副本,每个线程可以独立地改变自己的副本,而不会影响其他线程的副本。这种机制…

面试问答:能聊一聊MySQL聚簇索引和非聚簇索引吗?

文章目录 🐒个人主页:信计2102罗铠威🏅JavaEE系列专栏📖前言:🎀啥叫聚簇索引和非聚簇索引?🐕如果按特点来说:🐕如果按存储引擎来说: &#x1f415…

【CSS】实现文字描边

通过 -webkit-text-stroke 即可实现文字描边&#xff0c;这个复合属性接收两个参数&#xff0c;分别为描边宽度&#xff0c;以及描边颜色。 需要注意的是&#xff0c;-webkit-text-stroke是一个非标准属性&#xff0c;兼容性会出现问题。 <!DOCTYPE html> <html lang…

安卓Java面试题 196- 200

196. 简述Android Window的更新过程 ?说到Window的更新过程,个人认为其实也就是Window里面View的更新过程了,和创建/删除过程一样,最后照样也是到了WindowManagerGlobal里 面执行具体的操作了,具体来讲的话就是执行updateViewLayout方法了, 这个方法里面做了以下几件事:…

What is case-based reasoning (CBR)? 基于案例的推理

这个方向其实挺小众的&#xff0c;然后其实也很直觉&#xff0c;所以你可能其实一直在用这个技术&#xff0c;只不过你不知道这个技术有一个专业的名字《基于案例的推理》而已。 有人说&#xff0c;不知道名字有啥的&#xff0c;反正大家都会用&#xff0c;不需要学它叫什么名…

数组三(冒泡排序、二分查找)

目录 冒泡排序算法 冒泡排序的基础算法 冒泡排序的优化算法 二分法查找 冒泡排序算法 冒泡排序是最常用的排序算法&#xff0c;在笔试中也非常常见&#xff0c;能手写出冒泡排序算法可以说是 基本的素养。 冒泡排序的基础算法 冒泡排序算法重复地走访过要排序的数列&#…

eUICC鉴权的一般步骤

eUICC&#xff08;嵌入式通用集成电路卡&#xff09;的鉴权过程涉及多个步骤&#xff0c;主要目的是确保eUICC的安全操作和用户的身份验证。以下是eUICC鉴权过程的一般步骤&#xff1a; 1. **初始化**&#xff1a;当用户启动设备或尝试连接到移动网络时&#xff0c;eUICC会开始…