📄 dh_bp.c
字号:
}
do {
err_curr=0.0;
for(i=from_snum;i<to_snum;i++){
forward(i);
for(m=0;m<nunit[nhlayer+1];m++){
out = *(outptr[nhlayer+1]+m);
*(errptr[nhlayer+1]+m)=(target[i][m]-out)
*(1-out)*out;
}
for(m=nhlayer+1;m>=1;m--){
for(n=0;n<nunit[m-1]+1;n++){
*(errptr[m-1]+n)=0.0;
for(p=0;p<nunit[m];p++){
offset=(nunit[m-1]+1)*p+n;
*(delw[m-1]+offset)=eta*(*(errptr[m]+p))
*(*(outptr[m-1]+n))
+alpha*(*(delw[m-1]+offset));
*(errptr[m-1]+n) += *(errptr[m]+p)*(*(wtptr[m-1]+offset));
}
*(errptr[m-1]+n)= *(errptr[m-1]+n)*(1-*(outptr[m-1]+n))
*(*(outptr[m-1]+n));
}
}
/* weight changes */
for(m=1;m<nhlayer+2;m++){
for(n=0;n<nunit[m];n++){
for(p=0;p<nunit[m-1]+1;p++){
offset=(nunit[m-1]+1)*n+p;
*(wtptr[m-1]+offset) += *(delw[m-1]+offset);
}
}
}
ep[i]=0.0;
for(m=0;m<nunit[nhlayer+1];m++){
ep[i] += fabs((target[i][m]-*(outptr[nhlayer+1]+m)));
}
err_curr +=ep[i]*ep[i];
}
err_curr=.5*err_curr/ninput;
if(fplot10==1)
fprintf(fp3,"%ld,%2.9f\n",cnt,err_curr);
cnt++;
result=introspective(from_snum,to_snum);
}while(result==CONTNE);
/* update output with changed weights */
for(i=from_snum;i<to_snum;i++)forward(i);
for(i=0;i<nhlayer+1;i++){
index=0;
for(j=0;j<nunit[i+1];j++)
{
printf("\n\nWeights between unit %d of layer %d",
j,i+1);
printf("and units of layer %d\n",i);
for(k=0;k<nunit[i];k++)
printf("%f",*(wtptr[i]+index++));
printf("\nThreshold of unit %d of layer %d is %f",
j,i+1,*(wtptr[i]+index++));
}
}
for(i=0;i<ninput;i++)
for(j=0;j<noutattr;j++)
printf("\n\n sample %d output %d=%ftarget %d=%f",
i,j,outpt[i][j],j,target[i][j]);
printf("\n\nTotal number of iteration is %d",cnt);
printf("\nNormalized system error is %f\n\n\n",err_curr);
return(result);
}
/* read in the input data file specified by user
during the interactive session */
user_session()
{
int i,j,showdata;
char fnam[20],dtype[20];
float max0=-99999.,min0=99999.;
float max1=-99999.,min1=99999.;
FILE *fp,*fp00;
fp11=fopen("bp1.ini","r");
printf("\nStart of learning session");
/* printf("\n\t Enter the task name:");*/
fscanf(fp11,"%s",task_name);
/* printf("\n How many features in input pattern?:");*/
fscanf(fp11,"%d",&ninattr);
/* printf("\nHow many output units?:");*/
fscanf(fp11,"%d",&noutattr);
/* printf("\nTotal number of input sample?:");*/
fscanf(fp11,"%d",&ninput);
strcpy(fnam,task_name);
strcat(fnam,".dat");
printf("\nInput file name is %s",fnam);
if((fp=fopen(fnam,"r"))==NULL)
{
printf("\nFile %s does not exist",fnam);
exit(0);
}
fclose(fp11);
/* printf("\n Do you want to look at data just read?");
printf("\nAnswer yes or no:");
scanf("%s",dtype);*/
fp00=fopen("bpmax","w");
dtype[0]='y';
showdata=((dtype[0]=='y')||(dtype[0]=='y'));
for(i=0;i<ninput;i++){
for(j=0;j<ninattr;j++){
fscanf(fp,"%f",&input[i][j]);
if(showdata)printf("%f\n",input[i][j]);
}
for(j=0;j<noutattr;j++){
fscanf(fp,"%f",&target[i][j]);
if(showdata)printf("%f\n",target[i][j]);
}
}
for(j=0;j<ninattr;j++){
for(i=0;i<ninput;i++){
if(input[i][j]>max0) max0=input[i][j];
if(input[i][j]<min0) min0=input[i][j];
}
for(i=0;i<ninput;i++) input[i][j]=(input[i][j]-min0)/(max0-min0);
fprintf(fp00,"%f %f\n",max0,min0);
max0=-9999.0;
min0=9999.0;
}
for(j=0;j<noutattr;j++){
for(i=0;i<ninput;i++){
if(target[i][j]>max1) max1=target[i][j];
if(target[i][j]<min1) min1=target[i][j];
/* min1=0.;max1=100.; */
}
for(i=0;i<ninput;i++) target[i][j]=(target[i][j]-min1)/(max1-min1);
fprintf(fp00,"%f %f\n",max1,min1);
max1=-9999.0;
min1=9999.0;
}
if((i=fclose(fp)) != 0)
{
printf("\nFile cannot be closed %d",i);
exit(0);
}
/*fp=fopen("bpmax","w");
fprintf(fp00,"%f %f\n",max1,min1); */
fclose(fp00);
}
/* main body of learning */
learning ()
{
int result;
user_session();
set_up();
init();
do {
initwt();
result=rumelhart(0,ninput);
}while(result==RESTRT);
if(result==FEXIT)
{
printf("\nMax number of iterations reached,");
printf("\nbut failed to decrease system");
printf("\n error sufficiently");
}
dwrite(task_name);
wtwrite(task_name);
}
/* main body of output generation */
output_generation()
{
int i,m,nsample,id;
float cw[1000];
char ans[10];
char dfile[20];
char fname[20];
float max0,min0,max1[10],min1[10],sdep,edep,relv,gr_off;
FILE *fp,*fp100;
/* printf("\n Generation of output for a new pattern");
printf("\n\t Presenttask name is %s",task_name);
printf("\n\t Work on a different task?");
printf("\n\tAnswer yes or no:");
scanf("%s",ans);
ans[0]='n';
if((ans[0]=='y') || (ans[0]=='Y'))
{
printf("\n\tType the task name:");
scanf("%s",task_name);
dread(task_name);
init();
wtread(task_name);
for (i=0;i<10;i++){
}
}*/
fp100=fopen("bp1.ini","r");
fscanf(fp100,"%s",task_name);
dread(task_name);
init();
wtread(task_name);
fclose(fp100);
fp12=fopen("bp2.ini","r");
/* input data for output generation are created */
/* printf("\n Enter file name for patterns to");
printf("be processed:");*/
fscanf(fp12,"%s",dfile);
if((fp1=fopen(dfile,"r"))==NULL)
{
perror("Cannot open file");
exit(0);
}
/* printf("\nEnter number of patterns for processing:");*/
fscanf(fp12,"%f",&gr_off);
fscanf(fp12,"%f",&sdep);
fscanf(fp12,"%f",&edep);
fscanf(fp12,"%f",&relv);
/* fscanf(fp12,"%d",&nsample); */
nsample=(int)((edep-sdep)/relv)+1;
for(i=0;i<nsample;i++)
for(m=0;m<ninattr+1;m++)
fscanf(fp1,"%f",&input[i][m]);
/* for(i=0;i<nsample;i++)
cw[i]=(100.*input[i][2])/(input[i][1]+input[i][2]); */
fp100=fopen("bpmax","r");
for(m=0;m<ninattr;m++) {
/* for(i=0;i<nsample;i++) {
if(input[i][m]>max0) max0=input[i][m];
if(input[i][m]<min0) min0=input[i][m];
} */
fscanf(fp100,"%f %f",&max0,&min0);
if(m==1) gr_off=(gr_off-min0)/(max0-min0);
for(i=0;i<nsample;i++) input[i][m]=(input[i][m+1]-min0)/(max0-min0);
}
/* output generation calculation starts */
/* printf("\n enter output file name=>");*/
fscanf(fp12,"%s",fname);
fclose(fp12);
/*fp12=fopen("bpmax","r"); */
for(m=0;m<noutattr;m++) fscanf(fp100,"%f %f",&max1[m],&min1[m]);
fclose(fp100);
if((fp=fopen(fname,"w+"))==NULL)
{
printf("connot open file");
exit(0);
}
for(i=0;i<nsample;i++)
{
forward(i); fprintf(fp,"%f ",sdep+i*relv);
for(m=0;m<noutattr;m++){
*(outptr[nhlayer+1]+m)=min1[m]+*(outptr[nhlayer+1]+m)*(max1[m]-min1[m]);
printf("\n sample %d output %d=%f",
i,m,*(outptr[nhlayer+1]+m));
printf("\n");
if(input[i][1]>gr_off) *(outptr[nhlayer+1]+m)=0.;
id=(int)(*(outptr[nhlayer+1]+m));
fprintf(fp," %d ",id);
/* if(input[i][1]>gr_off) *(outptr[nhlayer+1]+m)=0.;
fprintf(fp," %5.2f ",*(outptr[nhlayer+1]+m)); */
}
fprintf(fp,"\n");
}
printf("\n处理完毕!");
fclose(fp);
if((i=fclose(fp1)) != 0)
printf("\nFile cannot be closed %d",i);
}
/* ***********MAIN*************** */
main()
{
char select[20],cont[10];
strcpy(task_name,"*******");
do {
printf("\n 选择学习 L(earning) or 输出 O(utput generation)\n");
do {
scanf("%s",select);
switch(select[0]){
case'o':
case'O':
output_generation();
break;
case'l':
case'L':
learning();
break;
default:
printf("\nanswer learning or output generation");
break;
}
} while((select[0] != 'o') && (select[0] != 'O')
&&(select[0] != 'l')&&(select[0] != 'L'));
printf("\n继续?");
scanf("%s",cont);
}while((cont[0]=='y')||(cont[0]=='Y'));
printf("\n处理完毕.");
printf("\n 再见");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -