(精选)如何用C语言编程实现多层前向BP神经网络-用来解决逻辑-XOR-运算和奇偶检验问题

上传人:W**** 文档编号:185454200 上传时间:2021-07-08 格式:DOCX 页数:18 大小:476.21KB
返回 下载 相关 举报
(精选)如何用C语言编程实现多层前向BP神经网络-用来解决逻辑-XOR-运算和奇偶检验问题_第1页
第1页 / 共18页
(精选)如何用C语言编程实现多层前向BP神经网络-用来解决逻辑-XOR-运算和奇偶检验问题_第2页
第2页 / 共18页
(精选)如何用C语言编程实现多层前向BP神经网络-用来解决逻辑-XOR-运算和奇偶检验问题_第3页
第3页 / 共18页
(精选)如何用C语言编程实现多层前向BP神经网络-用来解决逻辑-XOR-运算和奇偶检验问题_第4页
第4页 / 共18页
(精选)如何用C语言编程实现多层前向BP神经网络-用来解决逻辑-XOR-运算和奇偶检验问题_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《(精选)如何用C语言编程实现多层前向BP神经网络-用来解决逻辑-XOR-运算和奇偶检验问题》由会员分享,可在线阅读,更多相关《(精选)如何用C语言编程实现多层前向BP神经网络-用来解决逻辑-XOR-运算和奇偶检验问题(18页珍藏版)》请在金锄头文库上搜索。

1、6.( 1) 试用 C 语言编程实现多层前向 NN 的 BP 算法。要求:输入、输出结点数目,隐层数目,及各隐层中结点的数目应为任意整数。( 2) 试用所编出的 BP 算法程序训练出一个实现 XOR 运算的 2 层前向网络。( 3) 用所编出的 BP 算法程序训练出输入矢量的维数分别为 n=7和 n=8的两个实现奇偶检验运算(即如题 2.(2)所述)的 2 层前向 NN。注: 对第 6 题的要求:(i) 列表给出训练收敛后的 NN 权值和所用的迭代次数;(ii) 给出训练收敛后的训练误差和检验误差,及用训练集和检验集做输入时所得到的正确输出率;(iii) 给出 NN 的学习曲线(即 E(W(k

2、)随迭代次数 k 的变化曲线,该结果应是用计算程序计算和打印出来的曲线,而不要是用手画出的曲线)。(1)用C语言编程实现前向NN的BP算法解:解题思路:先用 C语言编程实现前向 NN 的 BP 算法,再将误差保存至文本文件,最后用MATLAB绘制出误差曲线。(1.1)开发思路奇偶检验问题可视为 XOR 问题的推广(由 2 输入到 n 输入的推广):若 n 个输入中有奇数个1,则输出为 1;若n个输入中有偶数个1,则输出为 0。一个 2 层的 NN 可实现奇偶检验运算。本文选用2层神经网络,包括隐含层1层,输出层1层,来设计BP神经网络。2层神经网络本文隐含层和输出层的激活函数选用Sigmoid

3、函数,其函数曲线如下所示:由奇偶检验问题的定义:可定义如下分类函数:其中y为BP神经网络的输出值,Y为分类结果。(1.2)运行流程本文的多层前向 NN 的 BP 算法用C 语言编程实现,最后将运行结果保存成数据文件,通过MATLAB绘图显示,其运行流程图如上图所示,其源代码见附录部分。(1.3)参数设定输入、输出结点数目,隐层数目,及各隐层中结点的数目应为任意整数,通过宏定义改变相应的值,具体修改方式见NeuralNetBP.h文件,在程序运行之前,需要跳转到该文件修改具体的取值。( 2) 试用所编出的 BP 算法程序训练出一个实现 XOR 运算的 2 层前向网络。解:利用(1)中BP 算法程

4、序训练出XOR 运算的 2 层前向网络。(2.1)参数设定首先进入NeuralNetBP.h文件通过宏定义改变相应的值,包括输入、输出结点数目,隐层数目,及各隐层中结点的数目。/XOR2#define IN_COUT2 /输入向量维数#define OUT_COUT1 /输出向量维数#define IMPLY_NUM1 /隐含层层数#define SampleTrain 4/训练样本数量 #define SampleTest 4/测试样本数量 #define NN_ImplyCout 3/隐含层节点数#define NN_Rate0.5/学习速率#define NN_Error 0.001 /

5、精度控制参数#define NN_LOOP100000 /最大循环次数(2.1)程序训练结果对所有样本进行训练,取隐含层节点数为3,运行结果如下:BP神经网络的学习曲线如下:可以看出BP神经网络的误差很快收敛至0。为了测试BP神经网络的有效性,取10次运算的平均值,其正确率如下图所示:定义正确率:其中,A为正确率,n=测试值和真实值相等的数量,N为参与测试的样本数量。由上图可以看出,10次测试的正确率都是A=1,有理由相信,BP神经网络所训练出来的参数是正确的。(2.3)XOR运算使用2层BP神经网络,NN的取隐含层节点数为3,示意图如下所示:两层神经网络实现逻辑异或运算(XOR)的真值表如下

6、所示:x1x2y000011101110计算公式如下: 经过28582次迭代后,可求得其权值取值如下: ( 3) 用所编出的 BP 算法程序训练出输入矢量的维数分别为 n=7和 n=8的两个实现奇偶检验运算(即如题 2.(2)所述)的 2 层前向 NN。解:n=7和 n=8的两个实现奇偶检验运算的 2 层前向 NN,完全相同,本文以n=7为例进行说明。(3.1)参数设定首先进入NeuralNetBP.h文件通过宏定义改变相应的值,包括输入、输出结点数目,隐层数目,及各隐层中结点的数目。/XOR7#define IN_COUT7 /输入向量维数#define OUT_COUT1 /输出向量维数#

7、define IMPLY_NUM1 /隐含层层数#define SampleTrain128/训练样本数量 用0-127共128组数据全部参加训练#define SampleTest128/测试样本数量 用0-127共128组数据全部参加测试#define NN_ImplyCout25/隐含层节点数#define NN_Rate0.4/学习速率#define NN_Error0.001 /精度控制参数#define NN_LOOP100000 /最大循环次数(3.2)程序训练结果7位2进制数数,共有128个样本,对所有样本进行训练,取隐含层节点数为25,运行结果如下:经过85857次迭代学习后

8、,收敛至指定误差范围内。全部样本参加测试,所有的样本的输出值都能完全和真值吻合,正确率为1。BP神经网络的学习曲线如下:可以看出BP神经网络的误差很快收敛至0。为了测试BP神经网络的有效性,取10次运算的平均值,其正确率如下图所示:定义正确率:其中,A为正确率,n=测试值和真实值相等的数量,N为参与测试的样本数量。由上图可以看出,10次测试的正确率均值为0.967,有理由相信,BP神经网络所训练出来的参数是正确的。附 录一、NeuralNetBP.h/*参数定义*/#pragma once#ifndef _NEURALNETBP_H#define _NEURALNETBP_H/XOR2/#de

9、fine IN_COUT2 /输入向量维数/#define OUT_COUT1 /输出向量维数/#define IMPLY_NUM1 /隐含层层数/#define SampleTrain4/训练样本数量 用0-127共128组数据全部参加训练/#define SampleTest4/测试样本数量 用0-127共128组数据全部参加测试/#define NN_ImplyCout4/隐含层节点数/#define NN_Rate0.5/学习速率/#define NN_Error0.001 /精度控制参数/#define NN_LOOP100000 /最大循环次数/* 参数该变量输入维数改变时,改变I

10、N_COUT的值即可同时需要修改SampleTrain、SampleTest、NN_ImplyCout的值;本程序取:SampleTrain = 2IN_COUTSampleTest = 2IN_COUTNN_ImplyCout = (2-4) * IN_COUT*/XOR7#define IN_COUT7 /输入向量维数#define OUT_COUT1 /输出向量维数#define IMPLY_NUM1 /隐含层层数#define SampleTrain128/训练样本数量 用0-127共128组数据全部参加训练#define SampleTest128/测试样本数量 用0-127共128

11、组数据全部参加测试#define NN_ImplyCout25/隐含层节点数#define NN_Rate0.4/学习速率#define NN_Error0.001 /精度控制参数#define NN_LOOP100000 /最大循环次数typedef struct /bp人工神经网络结构int h; /实际使用隐层节点数double vIN_COUT50; /隐藏层权矩阵i,隐层节点最大数量为50double w50OUT_COUT; /输出层权矩阵double a; /学习率double b; /精度控制参数int LoopCout; /最大循环次数int LoopItera; /实际循环

12、次数double ErrorNN_LOOP;/误差 bp_nn;int InitBp(bp_nn *bp); /初始化bp网络int TrainBp(bp_nn *bp, int xSampleTrainIN_COUT, int ySampleTrainOUT_COUT); /训练bp网络,样本为x,理想输出为yint UseBp(bp_nn *bp, int InputIN_COUT, double OutputOUT_COUT); /使用bp网络double TestBp(bp_nn *bp, int xSampleTestIN_COUT, int ySampleTestOUT_COUT)

13、;/测试bp网络#endif二、NeuralNetBP.cpp/*BP人工神经网络基本算法C语言实现*/#include #include #include #include #include NeuralNetBP.h/神经网络激活函数double fnet(double net) double temp=0;/Sigmoid函数temp= 1.0 / (1 + exp(-net); return temp;int InitBp(bp_nn *bp) /初始化bp网络/请输入隐层节点数,最大数为50(*bp).h = NN_ImplyCout;/请输入学习率(*bp).a = NN_Rate; /(*bp).a为double型数据,所以必须是lf/请输入精度控制参数(*bp).b = NN_Error;/请输入最大循环次数(*bp

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 专业基础教材

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号