当前位置: 首页 > news >正文

【实战项目】BP神经网络识别人脸朝向----MATLAB实现

  • (꒪ꇴ꒪ ),Hello我是祐言QAQ
  • 我的博客主页:C/C++语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍
  • 快上🚘,一起学习,让我们成为一个强大的攻城狮!
  • 送给自己和读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!
  • 作者水平很有限,如果发现错误,请在评论区指正,感谢🙏


一 、必备知识

1.2  BP神经网络简介

        BP(back propagation)神经网络是1986年由Rumelhar和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是应用最广泛的神经网络模型之一,它是一种多层前向网络,由输入层、输出层、隐含层(可以是一层或多层)构成,一种典型的三层BP神经网络模型如图1所示。反向传播算法的主要思想是把学习过程分为2个阶段:第1阶段(正向传播过程),输入信息从输入层开始逐层计算个单元的实际输出值,每一层神经元的状态只对下一层神经元的状态产生影响;第2阶段(反向传输过程),若在输出层未能够得到期望的输出值,则逐层递归计算实际输出与期望输出之间的差值,根据此误差修正前层权值使误差信号趋向最小。它通过连续不断地在相对于误差函数斜率下降的方向上计算网络权值和偏差变化而逐渐逼近目标。每次权值和误差的变化都与网络误差的影响成正比。

图1 经典三层BP网络模型图

1.2  实验要求

        利用BP神经网络的理论知识,对图像中人脸朝向判别进行实验研究。实验采用Matlab工具箱进行BP网络设计,实现对人脸角度方向的判别,讨论输入和目标向量设计BP神经网络结构的设计,以及网络参数和训练参数的设定等问题。最终实现BP神经网络可以根据输入图像的二值化等信息,对于给出的人脸图像中的人脸是朝向左、左前、前、右前或右进行识别。

二、实验原理

2.1  基本原理

人工神经网络无需事先确定输入输出之间映射关系的数学方程,仅通过自身的训练,学习某种规则,在给定输入值时得到最接近期望输出值的结果。作为一种智能信息处理系统,人工神经网络实现其功能的核心是算法。BP神经网络是一种按误差反向传播(简称误差反传)训练的多层前馈网络,其算法称为BP算法,它的基本思想是梯度下降法,利用梯度搜索技术,以期使网络的实际输出值和期望输出值的误差均方差为最小。

        基本BP算法包括信号的前向传播和误差的反向传播两个过程。即计算误差输出时按从输入到输出的方向进行,而调整权值和阈值则从输出到输入的方向进行。正向传播时,输入信号通过隐含层作用于输出节点,经过非线性变换,产生输出信号,若实际输出与期望输出不相符,则转入误差的反向传播过程。误差反传是将输出误差通过隐含层向输入层逐层反传,并将误差分摊给各层所有单元,以从各层获得的误差信号作为调整各单元权值的依据。通过调整输入节点与隐层节点的联接强度和隐层节点与输出节点的联接强度以及阈值,使误差沿梯度方向下降,经过反复学习训练,确定与最小误差相对应的网络参数(权值和阈值),训练即告停止。此时经过训练的神经网络即能对类似样本的输入信息,自行处理输出误差最小的经过非线形转换的信息。

        接下来详细了解下信号的前向传播过程以及误差的反向传播过程:

2.1  BP网络的特点

        BP网络总括起来,具有以下主要优点:

1)只要有足够多的隐含层和隐节点,BP网络可以逼近任意的非线性映射关系;

2BP网络的学习算法属于全局逼近的方法,因而它具有较好的泛化能力。

        它的主要缺点是:

1)收敛速度慢;

2)局部极值;

3)难以确定隐含层和隐节点的个数。

        从原理上,只要有足够多的隐含层和隐节点,即可实现复杂的映射关系,但是如何根据特定的问题来具体确定网络的结构尚无很好的方法,仍需要凭借经验和试凑。

        BP网络能够实现输入/输出的非线性映射关系,但它并不依赖于模型。其输入与输出之间的关联信息分散地存储于连接权中。由于连接权的个数很多,个别神经元的损坏只对输入/输出关系有较小的影响,因此BP网络显示了较好的容错性。

三、实验结果

4.1  训练过程

4.2  测试结果

        测试结果:

四、实验总结

        通过本次实验我们更加深入的学习到BP神经网络的理论知识,掌握BP神经网络的算法原理以及如何在MATLAB中实现利用MATLAB完成BP神经网络实现人脸朝向分类的程序编写,这也使得我们掌握了在MATLAB中实现一些小型程序的编写能力,实验中我们不妨有一些知识是在课本上没有学习到的,因此我们在实验初期查阅了很多关于BP神经网络的资料,以及如何在MATLAB中实现BP神经网络的代码,当然我们也遇到了一些问题,比如,设置参数问题中,到底是运行越多越好呢还是达到目的就好,也做了很多查阅和讨论。

        更多C/C++语言Linux系统数据结构ARM板实战相关文章,关注专栏:

   手撕C语言

            玩转linux

                    脚踢数据结构

                            系统、网络编程

                                     探索C++

                                             6818(ARM)开发板实战

📢写在最后

  • 今天的分享就到这啦~
  • 觉得博主写的还不错的烦劳 一键三连喔~
  • 🎉🎉🎉感谢关注🎉🎉🎉
http://www.lryc.cn/news/538744.html

相关文章:

  • java数据结构_二叉树_5.5
  • Deepseek-R1推理模型API接入调用指南 ChatGPT Web Midjourney Proxy 开源项目接入Deepseek教程
  • 计算机网络(4)TCP断开
  • 科技云报到:科技普惠潮流渐起,“开源”将带我们走向何方?
  • 【论文笔记】On Generative Agents in Recommendation
  • 使用 Spring Boot 和 Canal 实现 MySQL 数据库同步
  • vue3 在element-plus表格使用render-header
  • 算法——结合实例了解Minimax算法(极小化极大算法)
  • 使用 DeepSeek 生成商城流程图
  • 什么是GraphQL?
  • Spring Boot 的约定优于配置,你的理解是什么?
  • C#开源大型商城系统之B2B2C+O2O一体化_OctShop
  • gitte远程仓库修改后,本地没有更新,本地与远程仓库不一致
  • 【对比】Pandas 和 Polars 的区别
  • el-input无法输入0.0001的小数,自动转换为0在vue3中的bug
  • Ubuntu 下 systemd 介绍
  • BERT文本分类(PyTorch和Transformers)畅用七个模型架构
  • 两步在 Vite 中配置 Tailwindcss
  • 【vmware虚拟机安装教程】
  • 文字转语音(三)FreeTTS实现
  • string类详解(上)
  • Visual Studio Code使用ai大模型编成
  • 外贸跨境订货系统流程设计、功能列表及源码输出
  • TraeAi上手体验
  • 深入解析 vLLM:高性能 LLM 服务框架的架构之美(一)原理与解析
  • thingboard告警信息格式美化
  • redis解决高并发看门狗策略
  • Python函数的函数名250217
  • Unity 获取独立显卡数量
  • JAVA生产环境(IDEA)排查死锁