版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、BP 神经网络 C 程序 在该题的程序设计中采用了文件相关的操作, 记录了相关学习和测试信息数据。 权值用伪随 机数函数随机产生(范围是( 0,0.5) 采用结构体及链表来实现神经网络的结构 分为实例结构体、层结构体和网络结构体 数据结构的设计参照了人工神经网络原理 (马锐编著,北京:机械工业出版社, 2010,7) 一书 学习算法的优化也参照该书 采用学习效率自适应调整算法优化源程序的学习算法,以减少学习次数 由于能力和知识有限,该程序存在较大漏洞误差,在调整学习率时,不好掌握调节系数 初始权值的限定范围适中,则程序的学习次数将明显减少 在随机赋初始权值( 0,0.5)时,学习次数可调节至
2、135,但对测试数据的判别效果不理想, 没有采用#include<stdio.h>#include<stdlib.h>#include<math.h>#include<malloc.h> #define TRUE 1 #define FALSE 0 #define NUM_LAYERS 4#define NUM20/ 训练实例个数#define N#define M2/ 输入层单元数2/ 输出层单元数int UnitsNUM_LAYERS = N,3,3,M; FILE *fp,*fb;/每层单元数typedef structfloat xN;
3、float yM; TRAIN;/训练实例typedef structint Units;float *Output; float *Error;float *Weight;/网络层结构/该层中单元的个数/第 i 个单元的输出 / 第 i 个单元的校正误差 /第 i 个单元的连接权值/网络/隐层定义/输入层/输出层/允许误差/学习率/产生 (-0.5,0.5)之间的随机数LAYER;typedef structLAYER *Layer;LAYER *Inputlayer;LAYER *Outputlayer;float Error;float Eta;NET;/初始化伪随机数发生器void I
4、nitializeRandoms()srand(4711); return;/产生随机实数并规范化float RandomReal()return (float)(rand()%100)/200.0);/初始化训练数据void InitializeTrainingData(TRAIN *training)int i,j;char filename20;printf("n 请输入训练实例的数据文件名 : n"); gets(filename);fb = fopen(filename,"r");fprintf(fp,"nn-Saving initi
5、alization training datas .n"); for(i=0;i<NUM;i+)for(j=0;j<N;j+)fscanf(fb,"%f",&(training+i)->xj); fprintf(fp,"%10.4f",(training+i)->xj);for(j=0;j<M;j+)fscanf(fb,"%f",&(training+i)->yj);fprintf(fp,"%10.4f",(training+i)->yj);fpr
6、intf(fp,"n"); fclose(fb); return;/应用程序初始化void InitializeApplication(NET *Net)Net->Eta = (float)0.3;Net->Error = (float)0.0001; fp = fopen("BPResultData.txt","w+"); return;/应用程序关闭时终止打开的文件 void FinalizeApplication(NET *Net) fclose(fp);return;/分配内存 ,建立网络void Generate
7、Network(NET *Net)int l,i;Net->Layer = (LAYER *)calloc(NUM_LAYERS,sizeof(LAYER *); for(l=0;l<NUM_LAYERS;l+)Net->Layerl = (LAYER *)malloc(sizeof(LAYER);Net->Layerl->UnitsNet->Layerl->OutputNet->Layerl->ErrorNet->Layerl->WeightNet->Layerl->Output0if(l != 0) for(i=
8、1;i <= Unitsl;i+)= Unitsl;= (float *) calloc(Unitsl+1,sizeof(float);= (float *) calloc(Unitsl+1,sizeof(float);= (float *)calloc(Unitsl+1,sizeof(float *);/下标从 "1" 开始= 1;Net->Layerl->Weighti = (float *)calloc(Unitsl-1+1,sizeof(float);Net->Inputlayer = Net->Layer0;Net->Outpu
9、tlayer = Net->LayerNUM_LAYERS - 1; return;/产生随机实数作为初始连接权值void RandomWeights(NET *Net)int l,i,j;for(l=1;l<NUM_LAYERS;l+)for(i=1;i <= Net->Layerl->Units;i+)for(j=0;j <= Net->Layerl-1->Units;j+)Net->Layerl->Weightij = RandomReal();return;/设置输入层的输出值void SetInput(NET *Net,fl
10、oat *Input)int i;/输入层采用/输出层采for(i=1;i <= Net->Inputlayer->Units;i+)Net->Inputlayer->Outputi = Inputi-1;u(x) = xreturn;/设置输出层的输出值void GetOutput(NET *Net,float *Output)int i;for(i=1;i <= Net->Outputlayer->Units;i+)Outputi-1 = (float)(1/(1 + exp(-Net->Outputlayer->Outputi)
11、;用 f(x)=1心+e*x)return;/层间顺传播void PropagateLayer(NET *Net,LAYER *Lower,LAYER *Upper)int i,j;float sum;for(i=1;i <= Upper->Units;i+)sum = 0;for(j=1;j <= Lower->Units;j+)sum += (Upper->Weightij * Lower->Outputj);Upper->Outputi = (float)(1/(1 + exp(-sum);return;/整个网络所有层间的顺传播void Pro
12、pagateNet(NET *Net)int l;for(l=0;l < NUM_LAYERS-1;l+)PropagateLayer(Net,Net->Layerl,Net->Layerl+1); return;/计算输出层误差void ComputeOutputError(NET *Net,float *target)int i;float Out,Err;for(i=1;i <= Net->Outputlayer->Units;i+)Out = Net->Outputlayer->Outputi;Err = targeti-1 - Out;
13、Net->Outputlayer->Errori = Out*(1-Out)*Err;return;/层间逆传播void BackpropagateLayer(NET *Net,LAYER *Upper,LAYER *Lower) int i,j;float Out,Err;for(i=1;i <= Lower->Units;i+)Out = Lower->Outputi;Err = 0;for(j=1;j <= Upper->Units;j+)Err += (Upper->Weightji * Upper->Errorj);Lower-&
14、gt;Errori = Out*(1-Out)*Err;return;/整个网络所有层间的逆传播 void BackpropagateNet(NET *Net)int l; for(l=NUM_LAYERS-1;l>1;l-)BackpropagateLayer(Net,Net->Layerl,Net->Layerl-1); return;/权值调整void AdjustWeights(NET *Net)int l,i,j;float Out,Err;for(l=1;l<NUM_LAYERS;l+)for(i=1;i <= Net->Layerl->U
15、nits;i+) for(j=0;j <= Net->Layerl-1->Units;j+) Out = Net->Layerl-1->Outputj;Err = Net->Layerl->Errori;Net->Layerl->Weightij += (Net->Eta*Err*Out); return;/网络处理过程 void SimulateNet(NET *Net,float *Input,float *Output,float *target,int TrainOrNot)/输入数据/模式顺传播/形成输出/计算输出误差/误差
16、逆传播/调整权值SetInput(Net,Input);PropagateNet(Net);GetOutput(Net,Output);ComputeOutputError(Net,target); if(TrainOrNot)BackpropagateNet(Net);AdjustWeights(Net);return;/训练过程void TrainNet(NET *Net,TRAIN *training)int l,i,j,k;int count=0,flag=0;float OutputM,outputfrontM,ERR,err,sum;doflag = 0; sum = 0;ERR
17、= 0; if(count >= 1)for(j=0;j<M;j+) outputfrontj=Outputj;SimulateNet(Net,(training+(count%NUM)->x,Output,(training+(count%NUM)->y,TRUE); if(count >= 1)k = count%NUM;for(i=1;i <= Net->Outputlayer->Units;i+)sum += Net->Outputlayer->Errori;err = (training+k-1)->yi-1 - ou
18、tputfronti-1; ERR += (outputfronti-1 * (1 - outputfronti-1) * err);if(sum <= ERR)Net->Eta = (float)(0.9999 * Net->Eta);elseNet->Eta = (float)(1.0015 * Net->Eta);if(count >= NUM)for(k=1;k <= M;k+) if(Net->Outputlayer->Errork > Net->Error) flag=1; break; if(k>M)flag
19、=0; count+;while(flag | count <= NUM); fprintf(fp,"nnn");fprintf(fp,"-training results . n"); fprintf(fp,"training times: %dn",count); fprintf(fp,"n*the final weights*n"); for(l=1;l<NUM_LAYERS;l+)for(i=1;i <= Net->Layerl->Units;i+)for(j=1;j <
20、= Net->Layerl-1->Units;j+)fprintf(fp,"%15.6f",Net->Layerl->Weightij);fprintf(fp,"n");fprintf(fp,"nn");/评估过程void EvaluateNet(NET *Net)int i;printf("nn(");fprintf(fp,"nn(");for(i=1;i <= Net->Inputlayer->Units;i+)printf(" %.4f&
21、quot;,Net->Inputlayer->Outputi); fprintf(fp,"%10.4f",Net->Inputlayer->Outputi);printf(")t");fprintf(fp,")t");for(i=1;i <= Net->Outputlayer->Units;i+)if(fabs(Net->Outputlayer->Outputi - 1.0) <= 0.0499)printf(" 肯定是第 %d 类, ",i); fpri
22、ntf(fp," 肯定是第 %d 类, ",i);if(fabs(Net->Outputlayer->Outputi - 0.9) <= 0.0499)printf(" 几乎是第 %d 类, ",i); fprintf(fp," 几乎是第 %d 类, ",i);if(fabs(Net->Outputlayer->Outputi - 0.8) <= 0.0499)printf(" 极是第 %d 类, ",i);fprintf(fp," 极是第 %d 类, ",i
23、);if(fabs(Net->Outputlayer->Outputi - 0.7) <= 0.0499)printf(" 很是第 %d 类, ",i);fprintf(fp," 很是第 %d 类 , ",i);if(fabs(Net->Outputlayer->Outputi - 0.6) <= 0.0499)printf(" 相当是第 %d 类, ",i); fprintf(fp," 相当是第 %d 类 , ",i); if(fabs(Net->Outputlayer-
24、>Outputi - 0.5) <= 0.0499) printf(" 差不多是第 %d 类, ",i); fprintf(fp," 差不多是第 %d 类, ",i); if(fabs(Net->Outputlayer->Outputi - 0.4) <= 0.0499) printf(" 比较像是第 %d 类, ",i); fprintf(fp," 比较像是第 %d 类, ",i); if(fabs(Net->Outputlayer->Outputi - 0.3) <
25、;= 0.0499) printf(" 有些像是第 %d 类, ",i); fprintf(fp," 有些像是第 %d 类, ",i); if(fabs(Net->Outputlayer->Outputi - 0.2) <= 0.0499) printf(" 有点像是第 %d 类, ",i); fprintf(fp," 有点像是第 %d 类, ",i); if(fabs(Net->Outputlayer->Outputi - 0.1) <= 0.0499) printf(&quo
26、t; 稍稍像是第 %d 类, ",i); fprintf(fp," 稍稍像是第 %d 类, ",i);if(Net->Outputlayer->Outputi <= 0.0499)printf(" 肯定不是第 %d 类, ",i); fprintf(fp," 肯定不是第 %d 类 , ",i); printf("nn"); fprintf(fp,"nnn");return;/测试过程 void TestNet(NET *Net)TRAIN Testdata; float OutputM;int i,j,flag=0; char select;fprintf(fp,"nn-Saving test datas .n"); doprintf("n 请输入测试数据 (x1 x2 . y1 y2 .): n"); for(j=0;j<N;j+) scanf("%f",&Testdata.xj); fprintf(fp,"%10.4f",Testdata.xj); for(j=0;j<M;j+) scanf("%f",&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 部编版七年级下册《第21课 古代诗歌五首》2024年同步练习卷
- 2024秋四年级英语上册 Unit 4 My home第1课时(Let's talk Lets play)教案 人教PEP
- 2024委托寄售的合同书范文
- 2024秋七年级历史上册 第三单元 秦汉时期 统一多民族国家的建立和巩固 第9课 秦统一中国教案1 新人教版
- 2024大量家禽买卖合同
- 2024秋八年级物理上册 第3章 光现象 第五节 光的反射教学设计1(新版)苏科版
- 2024秋八年级道德与法治上册 第二单元 公共利益 第五课 公私之间 第1框 相互依存 和谐共生教学设计 教科版
- 2024年学年八年级语文上册 第八单元 外国短篇小说选读 第28课《变色龙》教案1 沪教版五四制
- 2024年五年级英语下册 Project 2教案 译林牛津版
- 2024年四年级英语下册 Unit 3 What can you see第2课时教案 湘少版
- 七年级英语音标教学课件
- 2023年高考物理试题评析海南卷
- 《术前访视专题讲座》课件
- 景区员工的服务培训课件
- 语文七年级《敬辞与谦辞》完整版
- LY/T 1417-2023航空用胶合板
- 全科医学基础理论考核试题题库及答案
- 《霍奇金淋巴瘤》课件
- 羊水异常的护理课件
- 幼儿园管理中的基本因素分析
- 医院高层次人才引进考核办法
评论
0/150
提交评论