BP神经网络(3层)

article/2025/8/23 23:45:48

终于放假啦,于是就想着把前一段时间学习的知识给整理一下,希望能够对小伙伴们有所帮助。

数学原理

BP(Back Propagation)(Rummelhart D, McClelland J.,1986)神经网络是一种按照误差逆向传播算法训练的多层前馈神经网络。
神经网络图示
三层BP神经网络的组成主要分为三个部分:输入层、隐含层、输出层。其中层与层之间的连接是全连接。其数学原理主要分为三个部分:1)正向传播过程;2)误差反向传递过程;3)权重更新。因为其公式有点多,所以就直接把写的实验报告的截图给贴上来啦,如下所示:

  • 正向传播过程
    正向传播
    其中 p 为输出层的神经元个数,b 为截距,w 为权重
  • 误差反向传递
    在反向误差传递的过程中,利用随机梯度下降法,对每个训练样本都使得往权重负梯度方向变化,从而调整权重使得误差最小。其中误差可以用损失函数求得,最小化均方根差损失函数 L(e)如下所示:
    误差反向传递
    每个权重的梯度都等于与其相连的前一层节点的输出与其相连的后一层的
    反向传播的输出。
  • 权重更新
    权重更新即在原来权重基础上加上权重梯度*rate_w 即可。

实验数据

1981年生物学家格若根(W.Grogan)和维什(W.Wirth)发现了两类蚊子(或飞蠓midges),他们测量了这两类蚊子每个个体的翼长和触角长,数据如下:
- 训练样本

翼长 触角长 类别
1.78 1.14 Apf
1.96 1.18 Apf
1.86 1.20 Apf
1.72 1.24 Af
2.00 1.26 Apf
2.00 1.28 Apf
1.96 1.30 Apf
1.74 1.36 Af
1.64 1.38 Af
1.82 1.38 Af
1.90 1.38 Af
1.70 1.40 Af
1.82 1.48 Af
1.82 1.54 Af
2.08 1.56 Af

  • 测试样本
    如果抓到三只新的蚊子,它们的翼长和触角长分别为(1.80,1.24);(1.84,1.28);(2.04,1.40),问它们应分别属于哪一个种类?

源代码


  • main.cpp
//
//  main.cpp
//  test
//
//  Created by Deemo on 2018/5/17.
//  Copyright © 2018年 Star. All rights reserved.
//#include <iostream>
#include <stdio.h>
#include "bp_Net.hpp"int main(int argc, const char * argv[])
{// insert code here...FILE *fou = fopen("/Users/Star/Desktop/test/BP训练结果.txt","w");//输入蚊子的翼长和触角长数据double m_Insample[trainsample][BpInNode]={{1.78,1.14},{1.96,1.18},{1.86,1.20},{1.72,1.24},{2.00,1.26},{2.00,1.28},{1.96,1.30},{1.74,1.36},{1.64,1.38},{1.82,1.38},{1.90,1.38},{1.70,1.40},{1.82,1.48},{1.82,1.54},{2.08,1.56}};//输入蚊子的类别数据double m_Outsmaple[trainsample][BpOutNode]{1,1,1,0,1,1,1,0,0,0,0,0,0,0,0};double m_Tsample[testsample][BpInNode]={{1.80,1.24},{1.84,1.28},{2.04,1.40}};if(!fou)return 0;BpNet  bp;//初始化bp.BpInitNetFunc();//设定迭代次数int times = 0;while( bp.totalErr > 0.0001 && times < 5000){times++;bp.BpNetTrainFunc(m_Insample,m_Outsmaple);if(times + 1 == (times + 1) / 100*100)fprintf(fou,"BP %5d  DT:%10.5f\n",times+1,bp.totalErr);}int    jj,isamp;double m[BpInNode];for(isamp = 0;isamp < testsample;isamp++){for(jj = 0;jj < BpInNode; jj++)m[jj] = m_Tsample[isamp][jj];  //输入的样本//进行识别bp.BpNetRecognizeFunc(m);for(jj = 0;jj < BpInNode; jj++)fprintf(fou," %5.2f",bp.In_x0[jj]);fprintf(fou," is ");for(jj = 0;jj < BpOutNode;jj++)fprintf(fou," %5.2f",bp.Outy0[jj]);fprintf(fou,"\n");}fclose(fou);return 0;
}

  • bp_Net.hpp
//
//  bp_Net.hpp
//  test
//
//  Created by Deemo on 2018/5/17.
//  Copyright © 2018年 Star. All rights reserved.
//#ifndef bp_Net_hpp
#define bp_Net_hpp#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define   trainsample        15             //BP训练样本数
#define   testsample         3              //BP测试样本数
#define   BpInNode           2             //BP输入结点数
#define   BpHideNode         10             //BP隐含结点数
#define   BpOutNode          1            //BP输出结点数#define   RAND_MAX           100class BpNet
{ public:BpNet();virtual ~BpNet();
public:double    ih_w[BpInNode][BpHideNode];  //隐含结点权值double    ho_w[BpHideNode][BpOutNode]; //输出结点权值double    Hideb0[BpHideNode];          //隐含结点阀值double    Out_b0[BpOutNode];           //输出结点阀值double    rate_ih_w;                   //权值学习率(输入层-隐含层)double    rate_ho_w;                   //权值学习率 (隐含层-输出层)double    rate_Hideb0;                 //隐含层阀值学习率double    rate_Out_b0;                 //输出层阀值学习率double    In_x0[ BpInNode];            //输入向量double    Hides0[BpHideNode];          //隐含结点状态值double    Outy0[ BpOutNode];           //输出结点状态值double    Outyd[BpOutNode];            //希望输出值double    out_Er[BpOutNode];           //输出结点的校正误差 希望输出值与实际输出值的偏差double    hideEr[BpHideNode];          //隐含结点的校正误差double    totalErr;                    //允许的总误差
public:void    __fastcall winit(double w[],int nn);                                //权值初始化void    __fastcall BpInitNetFunc();                                         //参数初始化void    __fastcall BpNetTrainFunc(double InSam[trainsample][BpInNode],double OutSam[trainsample][BpOutNode]);   //Bp训练void    __fastcall BpNetRecognizeFunc(double *p);                           //Bp识别
};#endif /* bp_Net_hpp */
  • bp_Net.cpp
//
//  bp_Net.cpp
//  test
//
//  Created by Deemo on 2018/5/17.
//  Copyright © 2018年 Star. All rights reserved.
//#include "bp_Net.hpp"
#include <stdio.h>//产生[low,high)之间的随机数
double __fastcall  Genc_randval(double low,double high)
{double val =((double) ( rand() % RAND_MAX) / (float) RAND_MAX) * (high-low) + low;return(val);
}//sigmoid 激励函数
double __fastcall  SigmoidFunc(  double t0)
{t0 = exp(-t0);return 1. / (1 + t0);
}BpNet :: BpNet()
{totalErr    = 1.0;  //允许的总误差rate_ih_w   = 0.1;  //权值学习率(输入层--隐含层)rate_ho_w   = 0.1;  //权值学习率 (隐含层--输出层)rate_Hideb0 = 0.1;  //隐含层阀值学习率rate_Out_b0 = 0.1;  //输出层阀值学习率
}BpNet :: ~BpNet() {}//初始权值:-0.01,0.01  随机数
void __fastcall BpNet :: winit(double w[],int nn)
{for(int  ii = 0;ii < nn;ii++)w[ii] = Genc_randval(-0.01,0.01);
}//参数初始化
void __fastcall BpNet :: BpInitNetFunc()
{ winit((double*) ih_w,  BpInNode  * BpHideNode);winit((double*) ho_w,  BpHideNode* BpOutNode);winit((double*) Hideb0,BpHideNode);winit((double*) Out_b0,BpOutNode);
}//训练样本
void __fastcall BpNet :: BpNetTrainFunc(double InSam[trainsample][BpInNode],double OutSam[trainsample][BpOutNode])
{double  sum,z0;int     isamp;int     ii,jj;totalErr = 0.;//1.循环训练样品for(isamp = 0;isamp < trainsample;isamp++){for(jj = 0;jj < BpInNode; jj++)In_x0[jj] = InSam[isamp][jj];             //输入的样本for(jj = 0;jj < BpOutNode;jj++)Outyd[jj] = OutSam[isamp][jj];            //希望输出的样本//2.正向传播 :: 构造每个样品的输入和输出标准//2.1 输入->隐含层for(jj = 0;jj < BpHideNode;jj++){sum = 0.0;for(ii = 0;ii < BpInNode;ii++)sum += ih_w[ii][jj]*In_x0[ii];         //隐含层各单元输入激活值z0= sum + Hideb0[jj];                                              //隐含层激活值Hides0[jj] = SigmoidFunc(z0);              //隐含层各单元的输出  1.0/( 1.0 + exp(-z0));}//2.2 隐含层->输出层for(jj = 0;jj < BpOutNode;jj++){sum= 0.0;for(ii = 0;ii < BpHideNode;ii++)sum += ho_w[ii][jj]*Hides0[ii];      //输出层各单元输入激活值z0=sum + Out_b0[jj];                                            //输出层激活值Outy0[jj] = SigmoidFunc(z0);            //输出层各单元输出    1.0/(1.0 + exp(-z0)}//3.误差反向传播:: 对于网络中每个输出单元,计算误差项,并更新权值//3.1 输出层->隐含层[第2层]sum = 0;//计算总均方差for(jj = 0;jj < BpOutNode;jj++){z0 = Outyd[jj] - Outy0[jj];out_Er[jj] = z0;sum += z0*z0;}totalErr += sum / 2.0;for(jj = 0;jj < BpOutNode;jj++){out_Er[jj] = out_Er[jj] * Outy0[jj] * (1. - Outy0[jj]);  //输出层δ2 = ei * θ'(si2)  期望误差*输出层Outy0激励函数导数for(ii = 0;ii < BpHideNode;ii++)ho_w[ii][jj] += rate_ho_w * out_Er[jj]*Hides0[ii];  //更新隐含层和输出层之间的连接权}//更新隐含层和输出层之间的阈值for(jj = 0;jj < BpOutNode; jj++)Out_b0[jj] += rate_Out_b0 * out_Er[jj];//3.2 隐含层->输入层[第1层]for(jj = 0;jj < BpHideNode;jj++){sum = 0.0;for(ii = 0;ii < BpOutNode;ii++)sum += out_Er[ii] * ho_w[jj][ii];hideEr[jj] = sum * Hides0[jj]*(1. - Hides0[jj]);   //隐含层δ1 = (∑out_Er *ho_w) * θ'(si2)  隐含层误差*隐含层Hides0激励函数导数for(ii = 0;ii < BpInNode;ii++)ih_w[ii][jj] += rate_ih_w * hideEr[jj] * In_x0[ii];  //更新输入层和隐含层之间的连接权[权重梯度]}for(jj = 0;jj < BpHideNode;jj++)Hideb0[jj] += rate_Hideb0 * hideEr[jj];  //更新输入层和隐含层之间的阈值}return;
}//识别模块
void __fastcall BpNet :: BpNetRecognizeFunc(double*p)
{int    jj,ii;double sum,z0;for(jj = 0;jj < BpInNode; jj++)In_x0[jj] = p[jj];                        //输入的样本//2.正向传播 :: 构造每个样品的输入和输出标准//2.1 输入->隐含层for(jj = 0;jj < BpHideNode;jj++){sum    = 0.0;for(ii = 0;ii < BpInNode;ii++)sum += ih_w[ii][jj]*In_x0[ii]; //隐含层各单元输入激活值z0     = sum + Hideb0[jj];                                    //隐含层激活值Hides0[jj] = SigmoidFunc(z0);   //隐含层各单元的输出1.0/( 1.0 + exp(-z0));}//2.2 隐含层->输出层for(jj = 0;jj < BpOutNode;jj++){sum    = 0.0;for(ii = 0;ii < BpHideNode;ii++)sum += ho_w[ii][jj]*Hides0[ii];//输出层各单元输入激活值z0     = sum + Out_b0[jj];                                      //输出层激活值Outy0[jj] = SigmoidFunc(z0);    //输出层各单元输出1.0/(1.0 + exp(-z0)}return;}

http://chatgpt.dhexx.cn/article/qBJFKuv1.shtml

相关文章

基于三层BP神经网络的人脸识别

实验四、基于三层BP神经网络的人脸识别 一、 实验要求 采用三层前馈BP神经网络实现标准人脸YALE数据库的识别&#xff0c;编程语言为C系列语言。 二、BP神经网络的结构和学习算法 实验中建议采用如下最简单的三层BP神经网络&#xff0c;输入层为 &#xff0c;有n个神经元节点&a…

神经网络笔记1-三层BP神经网络

神经网络笔记1-三层BP神经网络 神经网络性质简介信息正向传输预期神经网络的获得误差反向更新&#xff08;输出层→隐藏层&#xff09;误差反向更新&#xff08;隐藏层→输入层&#xff09; 伪代码实现训练函数测试函数&#xff0c;用训练好的神经网络预测 手写数字识别举例识别…

BP神经网络的梯度公式推导(三层结构)

本站原创文章&#xff0c;转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com 目录 一. 推导目标 1.1 梯度公式目标 1.2 本文梯度公式目标 二. 网络表达式梳理 2.1 梳理三层BP神经网络的网络表达式 三. 三层BP神经网络梯度推导过程 3.1 简化推导目标 3.2 输出层权重…

三层架构的搭建

目录 实验拓扑&#xff1a; 实验要求&#xff1a; 使用的技术有&#xff1a; ospf技术、NAT技术、静态、DHCP、VRRP 、STP、 VLAN、TRUNK 、 access接口模式、 以太网中继Eth-Trunk(华为) 技术、vlan管理技术 实验思路&#xff1a; 实验过程&#xff1a; IP地址的配置&am…

tfs路径映射已存在

环境&#xff1a;VS2019、Win10 最近公司服务器更换&#xff0c;想要将tfs项目映射到原来的工作区&#xff0c;提示“tfs-路径 XXX 已在工作区 XXX;XXX 中映射”&#xff0c;通过网络查找资料得知&#xff0c;需要修改Team Foundation的配置文件&#xff1a; 1.找到目录&#x…

TFS2012 权限设置

环境&#xff1a; TFS2012 win7 1.安装好TFS 2.创建系统用户组&#xff1a; TFSAdmins、TFSDevs、TFSUsers 分别为TFS管理人员组、TFS开发人员组、TFS普通用户组。 如下图&#xff1a; 这样我们在TFS的权限设置里&#xff0c;都只针对这三个组设权限&#xff0c;不会具体到…

TFS学习

一、TFS是什么 TFS全称是 Team Foundation Server&#xff0c;是 Microsoft 提供的 源代码管理、数据收集、报告和项目跟踪的平台工具。 主要功能 版本管理&#xff1a;工作区&#xff08;workspace&#xff09;、变更集&#xff08;changeset&#xff09;、标签并行开发支持…

tfs java_TFS (Team Foundation Server) 2013集成Maven构建

Team Foundation Server原生就支持跨平台的构建&#xff0c;包括Ant和Maven两种构建方式。通过配置构建服务器&#xff0c;连接TFS源代码库&#xff0c;可以实现持续集成构建&#xff0c;自动检测代码库健康状况&#xff0c;进而实现自动测试和部署。本文以Maven为例&#xff0…

Azure DevOps Server 2019 (TFS)安装教程

&#xff08;1&#xff09;安装教程&#xff1a; Azure DevOps Server 2019 (TFS&#xff09;安装教程 - danzhang - 博客园 Azure DevOps Server 的安装教程_躺平佛系周大侠的博客-CSDN博客 1.配置数据库&#xff0c;使用默认的sql express 2.搜索配置&#xff0c; 使用默认…

TFS用户组说明和用户权限配置过程

一、TFS默认用户组的说明 服务器级别用户组&#xff1a; 1、TFS服务器/Team Foundation Valid Users&#xff1a;可以访问TFS服务器。 2、TFS服务器/Team Foundation Licensed Users&#xff1a;可以连接TFS服务器。这个组只在 Team Foundation Server Workgroup Edition 版本…

linux系统tfs安装,Jenkins使用TFS部署

之前发表过一篇Jenkins的文章《使用Jenkins部署.Net应用程序》&#xff0c;里面是使用GIT做的版本管理&#xff0c;今天更新下使用TFS做版本管理。 首先在插件管理中搜索tfs&#xff0c;我这里因为已经装了&#xff0c;所以在已安装列表里&#xff0c;没装的话在可选插件列表中…

TFS淘宝分布式文件核心存储引擎源码架构剖析实现

这里写目录标题 相关背景介绍相关设计思路介绍项目基础文件系统接口扇区文件结构关于inode为什么淘宝不用小文件存储淘宝网为什么不用普通文件存储海量小数据&#xff1f; 设计思路关键数据结构哈希表 代码日志mmp_file.hmmap_file.cppfile_op.hmain_mmap_op_file.cppindex_han…

webstorm TFS 插件的安装与使用

翻看网上帖子&#xff0c;有直接在webstrom的Plugins下载TFS插件的&#xff0c;很遗憾&#xff0c;同样的操作我始终搜索不到&#xff0c;跟同事要了现成的安装包 点击这里下载 1、解压后&#xff0c;放到websotrom的plugins文件夹里 2、重启ws&#xff0c;点击 File》Setting…

TFS映射关系出错的几种

服务器更换 开发小组更换了一台新的 TFS 服务器&#xff0c;旧的 TFS 服务器停止使用。但从客户端 VS2005 连接到新的服务器&#xff0c;并下载源码到本地原来工作的文件夹时&#xff0c;出现错误提示&#xff0c;说本地文件夹已被映射到了旧的服务器上&#xff0c;不能从新服…

IDEA安装TFS插件

现在在Plugins已经搜不到TFS插件了&#xff0c;只能在官网TFS - IntelliJ IDEs Plugin | Marketplace 下载对应的版本zip包&#xff0c;采用Install Plugins From Diak方式安装&#xff0c; 如果出现如下问题&#xff0c;那就换个版本试试看。 换个版本之后&#xff1a; 重启之…

TFS 操作指令

最近厂商来公司做项目&#xff0c;人员来来往往的很多&#xff0c;有人签出后没有签入就走了&#xff0c;只好想办法强制解除。从网上找到了解决办法&#xff0c;但照着做出了好多错&#xff0c;特此记录。 1.强制解除被独占签出的文件必须使用命令工具tf.exe 该文件在C:\Pro…

tfs java_Java SDK for TFS

Java SDK for TFS 05/19/2011 2 分钟可看完 本文内容 So you don’t use Visual Studio as your main IDE and instead use Eclipse with Team Explorer Everywhere but want to tailor TFS to suite your (and/or your teams) needs. Not a problem as with this new SDK it’…

TFS工作项模板自定义指南

概述 TFS 内置有CMMI模板、敏捷模板等过程模板&#xff0c;但是为了方便团队管理&#xff0c;TFS 提供自定义过程模板的功能。每个团队可以根据需要自定义模板界面、字段、流程等内容。 本文档将会介绍如何自定义过程模板&#xff0c;以及制定的要求。 环境准备 获取修改权限…

vs 的 tfs 账号更改

vs 更换账户&#xff0c;可能不常用&#xff0c;当时有时特殊化&#xff0c;需要进行账号更改&#xff0c;但是打开 vs 后发现没有地方可以注销账户的&#xff0c;为什么呢&#xff1f; 原因是这样的&#xff0c;当我们第一次登陆账号时&#xff0c;会生成一个凭据到我们的计算…

TFS的原理及应用

最近的一个项目由于原先的nas服务停了&#xff0c;所以没有办法&#xff0c;只能迁移到TFS上。这本来是一个内部的分享的。TFS本身也是开源了&#xff0c;所以就拿出来分享一下吧。 这里大部分内容出自TFS的开源网站及内部的wiki&#xff0c;下面是TFS的项目 TFS开源项目&…