附錄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

提交評論