附录A改进算法的C}}言程序_第1页
附录A改进算法的C}}言程序_第2页
附录A改进算法的C}}言程序_第3页
附录A改进算法的C}}言程序_第4页
附录A改进算法的C}}言程序_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、附录A改进算法的C言程序*/BP神经网络训练仿真器*2002.3 *参数:* input parameter file:包含着网络结构和训练集的文件*#iterations:网络的迭代次数 *learning rate(learn r):此值越大,网络学习得越快(但要防止过度训练)(一般取*BP算法:" 0:传统的BP算法*1:改进的BP算法 *chec冲oint:是否让仿真器周期地向权值文件写入权值,chec冲oint=0为no,checkpoint>0为yes如输入为checkpoint=N,则仿真器每N个迭代向权值文件写入一次).当重新运行仿真时,checlpint口J以

2、重新装载入仿真器中. *权值文件(A一选项):如果希望从一个保存的权值文件中装载权值,则需提供文件名.注意这个文件的结构必须和仿真器的一样. 州版nclude <stdio.lv版nclude <math.lv#include <stdlib.lv#define LINEAR 0#define SIGMOID 1unsigned char MASSINPUTS 16 16= I,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o, o,l,o,o,o,o,o,o,o,o,o,o,o,o,o,o, o,o,l,o,o,o,o,o,o,o,o,o,o,o,o,o, o,o

3、,o,l,o,o刀,o,o刀,o,o刀p,o,o, o,o,o,o,l,o,o,o,o,o,o,o,o,o,o,o, o,o,o,o,o,l,o,o,o,o,o,o,o,o,o,o, o,o,o,o,o,o,l,o,o,o,o,o,o,o,o,o, o,o,o,o,o,o,o,l,o,o,o,o,o,o,o,o, o,o,o,o,o,o,o,o,l,o,o,o,o,o,o,o, o,o,o,o,o,o,o,o,o,l,o,o,o,o,o,o, o,o,o,o,o,o,o,o,o,o,l,o,o,o,o,o, o,o,o,o,o,o,o,o,o,o,o,l,o,o,o,o, o,o,o,o,o,

4、o,o,o,o,o,o,o,l,o,o,o, o,o,o,o刀刀,o,o刀刀刀,o,o,l刀刀, o,o,o,o刀刀,o,o刀刀刀,o,o刀,1刀, o,o,o,o刀刀,o,o刀刀刀,o,o刀刀,1, ;unsigned char MASSTARGETS88= 1,0,0,0,0,0,0,0 , 0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0, 0,0,0,1,0,0,0,0, 0,0,0,0,1,0,0,0, 0,0,0,0,0,1,0,0, 0,0,0刀,0,0,1刀, 0,0,0刀,0,0刀,1, ;void readParamFile(char *filename,

5、int *num_ inputs, int *num_outputs,int*traininset size, int *num_layers, int *arch, int *bias);void printParams(int num_ inputs, int num_outputs, int training_ set size,int num_layers,int *arch, int *bias);void setupInputs(float *unitinputs, int num_layers, int *arch, int *bias);void zeroDeltaWeight

6、s(float *deltaweights, int num_layers, int *arch, int *bias);float runUnit(float *inputs, float *weights, int numInputs, int squasher);voidprint2D(ffoat *mat, intdiml, intdim2);voidprintWeights(ffoat *weights, int numLayers, int *arch, int *bias);float NthDerivative(int squasher, int deriv, float va

7、lue);float sita=0.0;float zoom=1.0;float RandomEquaIREAL(ffoat Low, float High) retarn (float) randQ/RAND_MAX)*(High-Love)+Love;1int main(int argc, char *argv) FTT F. *ftle; int iterations, checkpoint, num_ inputs, num_outputs, training_ set size,num_layers,i, j, k, h, p, x, lastlayer; /*arch为各层结点数:

8、,y int *arch, *bias; uns堪ned char *squasher, *inputs, *targets; float learn rate, TSS, thisError; float ffoatin, out, sum, delta; float *outputs, *deltas; float * * *weights, * * *unitinputs, * * *deltaweights, * * *tempweights; long int totalbytes=0; int checkpointOn=0; int BPALG=0; printf("SE

9、QUENTIAL IMPLEMENTATION:n"); if(argc<6) fprintf(stderr, "Usage: %s inputparameter file” ,#iterations learning rate (learn_ rate) BPALG (0=normal,1=modifie山” "checkpointevery#iterations <weights file>n", argv0); exit(1); iterations=atoi(argv2); learn- rate=atof(argv3); BP

10、ALG=atoi(argv4); checkpoint=atoi(argv5); printf("BPALG=0oCri", BPAL,G; readParamFile(argv1, &num_ inputs,&training_set size,&num_layers, &arch, &bias); 州ntParams(num inputs, num_outputs, traininset size,num_layers,&nu m_outputs,arch, bias);/*初始化输入输出层:,:/printf("

11、;Initializing input and output layers.n"inputs=(unsigned char*)malloc(training_set size*sizeof(unsigned char*);targets=(unsigned char*)malloc(training_set size*sizeof(unsigned char*);for(i=0; i<traininset size; i+) totalbytes+=2*num_inputs*sizeof(unsigned char); inputs i=(uns堪ned char*)mallo

12、c(num inputs*sizeof(uns堪ned char); targetsi=(unsigned char*)malloc(num_outputs*sizeof(unsigned char); for(j; j<num inputs; j+) inputs i口=MASSINPUTS i口; for(j=0; j<num_outputs; j+) targets i口=MASSTARGETS i口; printf("INPUTS:t"); for(j; j<num inputs; j+) printf("t07od", inp

13、utsi山); printf("nTARGETS:"); for(j=0; j<num_outputs; j+) printf("t07od", targetsi山); printf("n");1/*初始化输入输出层结束:,y/*初始化各层权值:,y/*为各层权值分配内存空间:,weights = (float*)malloc(nu门i layers*sizeof(float*);/当前权值tempweights=(float* * *)malloc(num_layers*sizeof(float* *);/临时权值deltaw

14、eights=(float* * *)malloc(num_layers * sizeof(float* *);/ f次迭代权值unitinputs = (float*)malloc(num_layers*sizeof(float*);/每层的输入值for(i=0; i<n layers; i+) weights i=(float* *)malloc(archi *sizeof(float*); tempweights i=(float* *)malloc(archi *sizeof(float*); deltaweights i=(float* *)malloc(archi *size

15、of(float*); unitinputsi=(float* *)malloc(archi *sizeof(float*); for(j=0; j<archi; j+)/*隐层和输出层均受前一层的权值的影响.*/if(i!=0) weights i口=(float*)malloc(archi-1+biasi)*sizeof(float); tempweights i j=(float*)malloc(archi-1+biasi)*sizeof(float); deltaweights i j=(float*)malloc(archi-1+biasi)*sizeof(float); un

16、itinputsij=(float*)malloc(archi-1+biasi)*sizeof(float);1/*对于输入层,假设其字,经元权值为1*/else weights i口=(float*)malloc(1+biasi)*sizeof(float); tempweights i j=(float*)malloc(l+biasi)*sizeof(float); deltaweights i j=(float*)malloc(archi-1+biasi)*sizeof(float); unitinputsi口=(float*)malloc(1+biasi)*sizeof(float);

17、 1 11/*分配权值空间结束:,y/*对各层当前权值赋值,采用两种赋值方式:1.随机数赋值;2.从文件读取*/* 1.如果用户不从文件读入权值,则采用随机数赋值:, */printf("Initializing weight parameters.丫);if(argc<=6)/*用高斯随机值填充权值矩阵:,:/for(i=0; i<num_layers; i+) for(j=0; j<archi; j+) if(i!=0) lastlayer=archi-1; else lastlayer=1; for(k-0; k<(lastlayer+biasi); k

18、+) if(i!=0) weights i j k=RandomEquaIREAL(0.0, 1.0); else weights i j k=1.0; 1 1 11/" 2.此处完成从一个checkpoint文件读入权值的功能:,:/elseprintf("reading weights from'%s' filen", argv6);file=fopen(argv6, "r");if(!file)perror("fopen");exit(1);1for(j=0; j<num_layers; j+)f

19、or(k-0; k<archj; k+) if(j!=0) lastlayer=archj-1; else lastlayer=0; for(h=0; h<(lastlayer+biasj); h+)fscanf(file, "%1t", &Iloatin);printf("floatin=%fn", floatin);weights j k h=floatin;1if(lastlayer+bias口>0) fscanf(file, 'n"); 11fclose(file);printf("Initi

20、alizing weight parameters end n");/*赋值结束:,:/*初始化各层权值结束:,:/ /*为每一个单元的deltas和outputs分配矩阵:,:/ outputs=(float* *)malloc(num_layers*sizeof(float*);/各层输出句量 deltas=(float* *)malloc(num_layers *sizeof(float*); squasher=(unsigned char*)malloc(num_layers*sizeof(unsigned char*);/用来判断采用什么方式的转换函数,参看代码NthDer

21、ivative的方法 for(i=0; i<num_layers; i+) outputsi=(float*)malloc(archi *sizeof(float); deltasi=(float*)malloc(archi *sizeof(float); squasheri=(unsigned char*)malloc(archi*sizeof(unsigned char);1/*设置转换I数矩阵(trans_func matrix)*/printf("setting up the squasher matrix.n"for(i=0; i<num_layers

22、; i+) if(i=o) k = LINEAR; else k=SIGMOID; for(j=0; j<archi; j+) squasheri j=(unsigned char)k;1/*初始化各层单元输入值和卜次迭代矩阵:,:/printf("Initializing unitinputs and deltaweights.丫);setupInputs(unitinputs, num_layers, arch, bias);zeroDeltaWeights(deltaweights, num_layers, arch, bias);/*/*土循环开始/*/printf(&

23、quot;main loop starting. . n");fo叹i=0; i<iterations; i+)printf("TTERATION %dn", i);TSS=0.0;for门二1;钦numk+)for(h=0; h<archk; h+)for(p=0; p<archk 1+biask; p+) deltaweightsk h p=0.0; 11for(j=0; j<traininset size; j+)thisError=0.0;/*将网络输入值写入第一层的单元输入:,yfor(k-0; k<arch0; k+)un

24、itinputs0 k 0=inputsj k;/*计算各层的输入值和输出值:,:/fork=0k<num layers; k+)for(h=0; h<archk; h+) if(k!=0) lastlayer=archk 1; /*如果是输入层,则总是有一个输入的:,y else lastlayer=1; /*计算输出值:,:/ out=runUnit(unitinputskh, weightskh,lastlayer+biask,squasherk h);/*记录这个单元的输出:,:/outputsk h=out;/*把结果放入单元输入矩阵给下一层:,:/*计算输入值:,:/i

25、f(k+l!=rimes layers)/*涂了最后一层:,:/for(x=0; x<archk+l; x+) unitinputsk+l x h=out;/*计算误差:,:/for(k-0; k<archnum layers-1; k+) thisError+=pow(oattaegets口k-outputsnum layers-1k,2);thisError*=0.5;if(i=iterations一1)printf("Error #%d=%n", j, thisFrror);/*把此次迭代的thisErrc力I I入TSS中:,:/TSS+=thisErr

26、or;*/以下的CHECKPOITING代码实现断点检查的功*/育旨*冰*./././if(checkpoint>0&&i!=0&&(i%checkpoint=Olli=iterations一1)if(checkpointOn=0)=fopen("checkpoint", "w");file)fileif(!perror("fopen");exit(1);for(x=0; x<num,x+)fork-0;k<archx; k+)if(x!=0)lastlayer=archx 1;els

27、elastlayer=0;for(h=0; h<(lastlayer+biasx); h+)fprintf(file,"%it", weightsxkh);if(lastlayer+biasx>0) fprintf(file,"fin"); 11checkpointOn=1;1fk-0;k<archnumera-1; k+)fprintf(file,"%3.Sf", inputs山k);枷ntf(file,"t%3.Sf", targets山Lkl)fprintf(file,"t%3.S

28、fn", outputsnum layers-1k);if(j=iterations-1)fclose(file);checkpointOn=0;/*/*断点检查到此结束/*/if(i=iterations-1)for(k-0;k<archnumers-1; k+)printf('t%d", targets山Lkl)printf('t%3.Sfn", outputsnum layers-1k);*/误差反传开始*/冰*./././far(k-numers-1; k>=1; k一)for(h=0; h<archk; h+)delta

29、=0.0;/*如果是最后一层,则delta的计算是不同的:,y if(k=num_layers一1) if(BPALG=0) delta=(floattagets口h)一outputs k hNthDerivative(squasherk h,l ,outputsk h); 1 else if(BPALG=1) delta=4.0*pow(floattagets口h-outputsk h,3.0) *exp(lloat)targets l h )outputs k h)(float)targets j h)-outputs k h) *NthDerivative(squasherk h, l

30、,outputs k h) 1 1 else sum=0.0; for(p=0; p<archk+l; p+) sum+=deltas k+l p*weightsk+lph; delta=NthDerivative(squasherk h,l ,outputsk h)*sum; 1 deltas k h=delta; /*现在计算deltaweights */ for(p=0; p<archk 1+biask; p+) /*式3.16*/ /*木仿真器的W,T和sita采用周期更新的策略,如果采用样木更新的策略,则修改下面的代码:,y deltaweights k h p+=lea

31、rn_ rate*delta*unitinputs k h p+deltaweightskhp;/*/*误差反传结束/*/1/*现在应用delta权值:,yfor门二1;钦numk+)for(h=0; h<archk; h+) for(p=0; p<archk 1+biask; p+) weights k h p+= deltaweightsk h p; 1 1 if(i%1000=0) printf("%ct%fn", i, TSS*2); 1 /*/ /*土循环结束 /*/ /*因为此处的循环和释放所分配的个部内存比程序结时操作系统释放整个内存要花更多的时间

32、,所以不打算释放个部内存:,y return 1;void readParamFile(char *filename, int *num_inputs, int *num_outputs,int*traininset size, int *num layers, int *arch, int *bias) F1T F. *infile; int i; printf("Reading parameters file.n" infile=fopen(filename, "r"); if(!infile)州ntf("Reading parameter

33、s file failed n") perror("fopen"); exit(1);1fscanf(infile, "num_inputs: %cnn", num inputs);fscanf(infile, "num_outputs: %cAn", num_outputs);fscanf(infile, "training_ set size: %cnn", training set size);fscanf(infile, "numes layers: %dn", num_lay

34、ers);/*为网络的层数分配内存空间并从文件读入:,:/"arch=(int*)malloc(*num_layers*sizeof(int);fscanf(infile, "layers:”);for(i=0; i<*num layers; i+) fscanf(infile, "%cnt", &(*arch)i);fscanf(infile, "fin");/*为判断是否每层都有一个位移输入sita,以Boolean形式读入:,:/fscanf(infile, "layer biases:”);*bias=

35、(int*)malloc(*num_layers*sizeof(int);for(i=0; i<*num layers; i+) fscanf(infile, "%cnt", &(*bias)i);fclose(infile);州ntf("Reading parameters file endn");void printParams(int num_inputs, int num_outputs, int training_set size,int num_layers,int *arch,int *bias) int i; printf(

36、"num_inputs: %cAn", num inputs); printf("num_outputs: %cnn", num_outputs); printf("training_ set size: %cAn", training set size); printf("num_layers: %cAn", num_layers); printf('layers:”); for(i=0; i<num_layers; i+) printf("%d”,archi); printf('

37、n");printf("layer biases:”);for(i=0; i<num layers; i+) printf("%d”,biasi);printf('n");void setupInputs(ffoat *unitinputs, int num layers, int *arch, int *bias) int i, j, k, lastlayer; printf("Initializing unitinputs.恤,); for(i=0; i<num layers; i+) for(j=0; j<arc

38、hi; j+) if(i!=0) lastlayer=archi-1; else lastlayer=1; for(k-0; k<(lastlayer+biasi); k+) unitinputsi山k=1.0; 1 1 printf("Initializing unitinputs end n");void zeroDeltaWeights(ffoat *deltaweights, int num layers, int *arch,int *bias) int i, j, k, lastlayer; printf("Initializing deltaweights.恤,); for(i=0; i<num layers; i+) for(j=0; j<archi; j+) if(i!=0)lastlayer=archi-1;else lastlayer=1; for(k-0; k&l

温馨提示

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

评论

0/150

提交评论