如何用C语言编程实现多层前向BP神经网络,用来解决逻辑 XOR 运算和奇偶检验问题_第1页
如何用C语言编程实现多层前向BP神经网络,用来解决逻辑 XOR 运算和奇偶检验问题_第2页
如何用C语言编程实现多层前向BP神经网络,用来解决逻辑 XOR 运算和奇偶检验问题_第3页
如何用C语言编程实现多层前向BP神经网络,用来解决逻辑 XOR 运算和奇偶检验问题_第4页
如何用C语言编程实现多层前向BP神经网络,用来解决逻辑 XOR 运算和奇偶检验问题_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 _NEURALNETB

9、P_H/XOR2/#define 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 /最大循环次数/* 参数该变

10、量输入维数改变时,改变IN_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/测试样本数

11、量 用0-127共128组数据全部参加测试#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 Loop

12、Itera; /实际循环次数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 ySampleT

13、estOUT_COUT);/测试bp网络#endif二、"NeuralNetBP.cpp"/*BP人工神经网络基本算法C语言实现*/#include <stdlib.h>#include <math.h>#include <stdio.h>#include <time.h>#include "NeuralNetBP.h"/神经网络激活函数double fnet(double net) double temp=0;/Sigmoid函数temp= 1.0 / (1 + exp(-net); return tem

14、p;int InitBp(bp_nn *bp) /初始化bp网络/请输入隐层节点数,最大数为50(*bp).h = NN_ImplyCout;/请输入学习率(*bp).a = NN_Rate; /(*bp).a为double型数据,所以必须是lf/请输入精度控制参数(*bp).b = NN_Error;/请输入最大循环次数(*bp).LoopCout = NN_LOOP;/产生随机数初始化权值矩阵int i, j;srand(unsigned)time(NULL);for (i = 0; i < IN_COUT; i+)for (j = 0; j < (*bp).h; j+)(*b

15、p).vij = rand() / (double)(RAND_MAX);for (i = 0; i < (*bp).h; i+)for (j = 0; j < OUT_COUT; j+)(*bp).wij = rand() / (double)(RAND_MAX);return 1;int TrainBp(bp_nn *bp, int xSampleTrainIN_COUT, int ySampleTrainOUT_COUT) /训练bp网络,样本为x,理想输出为ydouble f = (*bp).b; /精度控制参数double a = (*bp).a; /学习率int h =

16、 (*bp).h; /隐层节点数double vIN_COUT50, w50OUT_COUT; /权矩阵double ChgH50, ChgOOUT_COUT; /修改量矩阵double O150, O2OUT_COUT; /隐层和输出层输出量int LoopCout = (*bp).LoopCout; /最大循环次数int i, j, k, n;double temp;for (i = 0; i < IN_COUT; i+) / 复制结构体中的权矩阵 for (j = 0; j < h; j+)vij = (*bp).vij;for (i = 0; i < h; i+)fo

17、r (j = 0; j < OUT_COUT; j+)wij = (*bp).wij;double e = f + 1;for (n = 0; e > f && n < LoopCout; n+) /对每个样本训练网络e = 0;for (i = 0; i < SampleTrain; i+)for (k = 0; k < h; k+) /计算隐层输出向量temp = 0;for (j = 0; j < IN_COUT; j+)temp = temp + xij * vjk;O1k = fnet(temp);for (k = 0; k <

18、; OUT_COUT; k+) /计算输出层输出向量temp = 0;for (j = 0; j < h; j+)temp = temp + O1j * wjk;O2k = fnet(temp);for (j = 0; j < OUT_COUT; j+) /计算输出层的权修改量 ChgOj = O2j * (1 - O2j) * (yij - O2j);for (j = 0; j < OUT_COUT; j+) /计算输出误差e = e + (yij - O2j) * (yij - O2j);for (j = 0; j < h; j+) /计算隐层权修改量temp =

19、0;for (k = 0; k < OUT_COUT; k+)temp = temp + wjk * ChgOk;ChgHj = temp * O1j * (1 - O1j);for (j = 0; j < h; j+) /修改输出层权矩阵for (k = 0; k < OUT_COUT; k+)wjk = wjk + a * O1j * ChgOk;for (j = 0; j < IN_COUT; j+) /修改隐含层权矩阵for (k = 0; k < h; k+)vjk = vjk + a * xij * ChgHk;(*bp).Errorn = e;/记录

20、误差if (n % 10 = 0)printf("循环次数:%d, 误差 : %fn",n,e);(*bp).LoopItera = n;/实际循环次数printf("总共循环次数:%dn", n);printf("调整后的隐层权矩阵:n");for (i = 0; i < IN_COUT; i+) for (j = 0; j < h; j+)printf("%f ", vij);printf("n");printf("调整后的输出层权矩阵:n");for (i

21、= 0; i < h; i+) for (j = 0; j < OUT_COUT; j+)printf("%f ", wij);printf("n");for (i = 0; i < IN_COUT; i+) /把结果复制回结构体 for (j = 0; j < h; j+)(*bp).vij = vij;for (i = 0; i < h; i+)for (j = 0; j < OUT_COUT; j+)(*bp).wij = wij;printf("bp网络训练结束!nn");return 1;

22、int UseBp(bp_nn *bp, int InputIN_COUT, double OutputOUT_COUT) /使用bp网络double O150;double O2OUT_COUT; /O1为隐层输出,O2为输出层输出int i, j;double temp;for (i = 0; i < (*bp).h; i+) temp = 0;for (j = 0; j < IN_COUT; j+)temp += Inputj * (*bp).vji;O1i = fnet(temp);for (i = 0; i < OUT_COUT; i+) temp = 0;for

23、(j = 0; j < (*bp).h; j+)temp += O1j * (*bp).wji;O2i = fnet(temp);/输出值for (i = 0; i < OUT_COUT; i+)Outputi = O2i;return 1;double TestBp(bp_nn *bp, int xSampleTestIN_COUT, int ySampleTestOUT_COUT) /使用bp网络int i, j;int InputIN_COUT;double OutputOUT_COUT;/此处的输出是实际计算输出 所以为double型int yMeasureSampleTe

24、st;int CorrectN = 0;double Accuracy = 0;/正确率for (i = 0; i < SampleTest; i+)for (j = 0; j < IN_COUT; j+)Inputj = xij;UseBp(bp, Input, Output); /测试bp神经网络子函数/结果分类if (OutputOUT_COUT - 1 >= 0.5)yMeasurei = 1;elseyMeasurei = 0;if (yiOUT_COUT - 1 = yMeasurei)/真值=测量值CorrectN+;Accuracy=CorrectN * 1.

25、0 / SampleTest;/计算正确率/显示测试结果printf("n=7 时,BPNN 测试结果为:n");printf(" 测试样本数:%dn", SampleTest);printf(" 正确样本数:%dn", CorrectN);printf(" 正确率为 :%fn", Accuracy);printf("nn");return Accuracy;三、"main.cpp"#include <stdlib.h>#include <math.h>#include <stdio.h>#include <time.h>#include <memory.h>#include "NeuralNetBP.h"

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论