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

下载本文档

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

文档简介

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

2、)用C语言编程实现前向NN的BP算法解:解题思路:先用C语言编程实现前向NN的BP算法,再将误差保存至文本文件,最后用MATLAB绘制出误差曲线。开发思路奇偶检验问题可视为XOR问题的推广(由2输入到n输入的推广):若n个输入中有奇数个1,则输出为1;若n个输入中有偶数个1,则输出为0。一个2层的NN可实现奇偶检验运算。本文选用2层神经网络,包括隐含层1层,输出层1层,来设计BP神经网络。x1x2xnnW212w211W101012层神经网络本文隐含层和输出层的激活函数选用Sigmoid函数,申(s)=,=9(s)(1_9(s)1+e_sds其函数曲线如下所示:可定义如下分类函数:Y(y)=1

3、y=1/20y3b871W网络训练结朿!BP神经网络的学习曲线如下:2LayerBPNeuralNetworkforXORwith2inputand1outpufi-TheErrorlin-e可以看出bp神经网络的误差很快收敛至0。为了测试BP神经网络的有效性,取10次运算的平均值,其正确率如下图所示:2LayerBPNeuralN&tworkforXORwith2inputan-d1output-Thre-ResultHne2iiiiiiii0.4&5noo7kltW15.9960904一再加R.77832?丄丄.丄丄37?玄3.868187.62337?-28,213789-31.9644

4、903.1B6909-2B.83553M18.95683412.3785285.7623559.17216037.60412612.82109El.it26G6-0.6073?!4.980324-11.981143-23.9005E0血网络训练皓束!巔罰2.0580185208-4.653486E.498790一$72GS27-6.814911-7.55052B一?6S5629一5922517-5.835666-5.214218一8丄208?一7179203-5丄28L847.?62376-2.Z55177-1HU5M535一7-26S1B8-7.5835132.813371-10运7孑481

5、-E.791459-4.722353-4.E7B572-4.27651111.446776-6.86751经过85857次迭代学习后,收敛至指定误差范围内。鬲正正lip测试结果为=1281281.盹妣妣L2J全部样本参加测试,所有的样本的输出值都能完全和真值吻合,正确率为1。BP神经网络的学习曲线如下:2LaerBPN&ursENetworkforXORwith7inputand1output-TheErrorlin-e可以看出BP神经网络的误差很快收敛至0。为了测试BP神经网络的有效性,取10次运算的平均值,其正确率如下图所示:2LayerBPNeuralNetworkforXQRwith7

6、inputaruj1output-Th&ResultHn&IIIIIIIIFErroris0.96094afteriteration10times,0.D9234568590.0a0_&6_NO939794O.times定义正确率:其中,A为正确率,n=测试值和真实值相等的数量,N为参与测试的样本数量。由上图可以看出,10次测试的正确率均值为0.967,有理由相信,BP神经网络所训练出来的参数是正确的。附录、NeuralNetBP.h/*参数定义*/#pragmaonce#ifndef_NEURALNETBP_H#define_NEURALNETBP_H/XOR2#defineIN_COUT#

7、defineOUT_COUT/#defineIMPLY_NUM/#defineSampleTrain/#defineSampleTest/#defineNN_lmplyCout/#defineNN_Rate/#defineNN_Error/#defineNN_LOOP输入向量维数输出向量维数隐含层层数训练样本数量用0-127共128组数据全部参加训练/测试样本数量用0-127共128组数据全部参加测试隐含层节点数学习速率0.001精度控制参数100000最大循环次数0.5/*参数该变量输入维数改变时,改变INCOUT的值即可同时需要修改SampleTrain、SampleTest、NN_Imp

8、lyCout的值;本程序取:SampleTrain=2AIN_COUTSampleTest=2A|N_COUTNN_ImplyCout=(2-4)*IN_COUT*/XOR7#defineIN_COUT7输入向量维数#defineOUT_COUT1输出向量维数#defineIMPLY_NUM1隐含层层数#defineSampleTrain128训练样本数量用0-127共128组数据全部参加训练#defineSampleTest128测试样本数量用0-127共128组数据全部参加测试#defineNN_lmplyCout25隐含层节点数#defineNN_Rate#defineNN_Error#

9、defineNN_LOOP0.4学习速率0.001精度控制参数100000最大循环次数typedefstructinth;/bp人工神经网络结构实际使用隐层节点数doublevIN_COUT50;隐藏层权矩阵i,隐层节点最大数量为50doublew50OUT_COUT;输出层权矩阵doublea;doubleb;intLoopCout;intLoopItera;学习率精度控制参数最大循环次数实际循环次数doubleErrorNN_LOOP;误差bp_nn;intlnitBp(bp_nn*bp);初始化bp网络intTrainBp(bp_nn*bp,intxSampleTrainIN_COUT,

10、intySampleTrainOUT_COUT);/训练bp网络,样本为x,理想输出为yintUseBp(bp_nn*bp,intInputIN_COUT,doubleOutputOUT_COUT);使用bp网络doubleTestBp(bp_nn*bp,intxSampleTestIN_COUT,intySampleTestOUT_COUT);测试bp网络#endif二、NeuralNetBP.cpp”/*BP人工神经网络基本算法C语言实现*/#include#include#include#include#includeNeuralNetBP.h/神经网络激活函数doublefnet(do

11、ublenet)doubletemp=0;/Sigmoid函数temp=1.0/(1+exp(-net);returntemp;intlnitBp(bp_nn*bp)/初始化bp网络请输入隐层节点数,最大数为50(*bp).h=NN_ImplyCout;请输入学习率(*bp).a=NN_Rate;/(*bp).a为double型数据,所以必须是If请输入精度控制参数(*bp).b=NN_Error;请输入最大循环次数(*bp).LoopCout=NN_LOOP;产生随机数初始化权值矩阵inti,j;srand(unsigned)time(NULL);for(i=0;iIN_COUT;i+)fo

12、r(j=0;j(*bp).h;j+)(*bp).vij=rand()/(double)(RAND_MAX);for(i=0;i(*bp).h;i+)for(j=0;jOUT_COUT;j+)(*bp).wij=rand()/(double)(RAND_MAX);return1;intTrainBp(bp_nn*bp,intxSampleTrainIN_COUT,intySampleTrainOUT_COUT)/训练bp网络,样本为x,理想输出为ydoublef=(*bp).b;精度控制参数doublea=(*bp).a;学习率inth=(*bp).h;隐层节点数doublevIN_COUT50

13、,w50OUT_COUT;权矩阵修改量矩阵隐层和输出层输出量/最大循环次数doubleChgH50,ChgOOUT_COUT;doubleO150,O2OUT_COUT;intLoopCout=(*bp).LoopCout;inti,j,k,n;doubletemp;for(i=0;iIN_COUT;i+)/复制结构体中的权矩阵for(j=0;jh;j+)vij=(*bp).vij;for(i=0;ih;i+)for(j=0;jf&nLoopCout;n+)对每个样本训练网络e=0;for(i=0;iSampleTrain;i+)for(k=0;kh;k+)计算隐层输出向量temp=0;for

14、(j=0;jIN_COUT;j+)temp=temp+xij*vjk;O1k=fnet(temp);for(k=0;kOUT_COUT;k+)计算输出层输出向量temp=0;for(j=0;jh;j+)temp=temp+O1j*wjk;O2k=fnet(temp);for(j=0;jOUT_COUT;j+)计算输出层的权修改量ChgOj=O2j*(1-O2j)*(yij-O2j);for(j=0;jOUT_COUT;j+)计算输出误差e=e+(yij-O2j)*(yij-O2j);for(j=0;jh;j+)计算隐层权修改量temp=0;for(k=0;kOUT_COUT;k+)temp=t

15、emp+wjk*ChgOk;ChgHj=temp*O1j*(1-O1j);for(j=0;jh;j+)修改输出层权矩阵for(k=0;kOUT_COUT;k+)wjk=wjk+a*O1j*ChgOk;for(j=0;jIN_COUT;j+)修改隐含层权矩阵for(k=0;kh;k+)vjk=vjk+a*xij*ChgHk;(*bp).Errorn=e;/记录误差讦(n%10=0)printf(循环次数:%d,误差:%fn,n,e);(*bp).Loopltera=n;实际循环次数printf(总共循环次数:%dn,n);printf(调整后的隐层权矩阵:n);for(i=0;iIN_COUT;

16、i+)for(j=0;jh;j+)printf(%f,vij);printf(n);printf(调整后的输出层权矩阵:n);for(i=0;ih;i+)for(j=0;jOUT_COUT;j+)printf(%f,wij);printf(n);for(i=0;iIN_COUT;i+)把结果复制回结构体for(j=0;jh;j+)(*bp).vij=vij;for(i=0;ih;i+)for(j=0;jOUT_COUT;j+)(*bp).wij=wij;printf(bp网络训练结束!nn);return1;/使用bp网络intUseBp(bp_nn*bp,intInputIN_COUT,do

17、ubleOutputOUT_COUT)doubleO150;doubleO2OUT_COUT;/O1为隐层输出,O2为输出层输出inti,j;doubletemp;for(i=0;i(*bp).h;i+)temp=0;for(j=0;jIN_COUT;j+)temp+=Inputj*(*bp).vji;O1i=fnet(temp);for(i=0;iOUT_COUT;i+)temp=0;for(j=0;j(*bp).h;j+)temp+=O1j*(*bp).wji;O2i=fnet(temp);输出值for(i=0;iOUT_COUT;i+)Outputi=O2i;return1;double

18、TestBp(bp_nn*bp,intSampleTestIN_COUT,intSampleTestOUT_COUT)使用bp网络inti,j;intInputIN_COUT;doubleOutputOUT_COUT;此处的输出是实际计算输出所以为double型intyMeasureSampleTest;intCorrectN=0;doubleAccuracy=0;正确率for(i=0;iSampleTest;i+)for(j=0;j=0.5)yMeasurei=1;elseyMeasurei=0;讦(iOUT_COUT-1=yMeasurei)真值=测量值CorrectN+;Accuracy

19、=CorrectN*1.0/SampleTest;计算正确率显示测试结果printf(n=7时,BPNN测试结果为:n);printf(测试样本数:%dn,SampleTest);printf(正确样本数:%dn,CorrectN);printf(正确率为:%fn,Accuracy);printf(nn);returnAccuracy;三、main.cpp#include#include#include#include#include#includeNeuralNetBP.h#includeHandleFile.h#includeSample.h/*奇偶性判断若n个输入中有奇数个1,则输出为1;若n个

温馨提示

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

评论

0/150

提交评论