📄 bptraindlg.cpp
字号:
if(Col != dwWidth || Row != dwHeight)
{
AfxMessageBox("图像大小不符合要求!");
free(image);
return;
}
if(0 != DIBNumColors((LPSTR)lpDIB))
{
AfxMessageBox("图像色彩不符合要求!");
free(image);
return ;
}
//彩色图像指针赋值
BYTE *lpTemp = (BYTE *)FindDIBBits((LPSTR)lpDIB);
memcpy(image, lpTemp, Row * Col * 3);
////////////BP训练 image 为32×16的字元图像
BPTraining(image,m_Type);
////////////
} // end while
free(image);
m_bTrained=TRUE;
AfxMessageBox("当前字符训练完成,请进行下一个字符的训练");
//CDialog::OnOK();
}
void CBPTrainDlg::BPTraining(unsigned char *image, CString strType)
{
#define Image(i,j) image[(long)(i)*width+(j)]
/* 对应的字符number, character的洞的个数
在神经网络有两个输出值相近时做为判断的依据
0 1 2 3 4 5 6 7 8 9 */
int number_zero[] = {1,0,0,0,1,0,1,0,2,1};
/* A B C D E F G H I J K L M N O P Q R S T U V W X Y Z */
int character_zero[] =
{1,2,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0};
int all_zero[]={1,0,0,0,1,0,1,0,2,1,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,1,2,0,1,0,
0,0,0,0,0,0,0,0,0,1,
1,1,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0
};
int i,j;
float sum;
BOOL bIsChar = FALSE;
unsigned char image1[Row][Col];
int width=Col;
int depth = Row;
for(i=0;i<Row;i++)
for(j=0;j<Col;j++)
{
image1[i][j]=image[(long)i*width+j];
}
for(i=0;i<100;i++)
{
Out[i].Invalue=0.;
Out[i].Outvalue=0.;
}
//vector(image1,3); /* vector of the char 需要自己根据需要编写*/
Input[INPUTSIZE]=(float)1.0;
//tag=1;
bIsChar=FALSE;
/////forward propagation ysirss
for(i=0;i<HID1SIZE;i++) // input to hidden 1
{
sum=(float)0.;
for(j=0;j<INPUTSIZE+1;j++)
{
sum=sum+(float)Input[j]*InH1Weight[i][j].Weight;
}
Hid1[i].Invalue=sum;
Hid1[i].Outvalue=(float)1.0/((float)1.0+(float)exp(-(double)Hid1[i].Invalue));
//printf("1==%f\n",Hid1[i].Outvalue);
}
//printf("%ld\n",t);
Hid1[HID1SIZE].Invalue=(float)1.;Hid1[HID1SIZE].Outvalue=(float)1.;
for(i=0;i<HID1SIZE;i++) // hidden 1 to hidden 2
{
sum=(float)0.;
for(j=0;j<HID1SIZE+1;j++)
{
sum=sum+Hid1[j].Outvalue*H1H2Weight[i][j].Weight;
}
Hid2[i].Invalue=sum;
Hid2[i].Outvalue=(float)1.0/((float)1.0+(float)exp(-(double)Hid2[i].Invalue));
//printf("2==%f\n",Hid2[i].Outvalue);
}
Hid2[HID1SIZE].Invalue=(float)1.;Hid2[HID1SIZE].Outvalue=(float)1.;
for(i=0;i<OUTSIZE;i++) // hidden 2 to output
{
sum=(float)0.;
for(j=0;j<HID1SIZE+1;j++)
{
sum=sum+Hid2[j].Outvalue*H2OutWeight[i][j].Weight;
}
Out[i].Invalue=sum;
Out[i].Outvalue = (float)1.0/((float)1.0+(float)exp(-(double)Out[i].Invalue));
//printf("3==%f\n",Out[i].Outvalue);
}
float NetError,NetGain, NetAlpha, NetEta, Err;
//output error
NetError = 0;
NetGain = 1.;
NetAlpha = 0.9;
NetEta = 0.25;
for (i=1; i<=OUTSIZE; i++)
{
OutError[i] = NetGain * Out[i].Outvalue * (1-Out[i].Outvalue) * (Target[i-1]-Out[i].Outvalue);
NetError += 0.5 * sqr(Target[i-1]-Out[i].Outvalue);
}
//hidden 2 error
for (i=1; i<=HID2SIZE; i++)
{
Err = 0;
for (j=1; j<=OUTSIZE; j++) {
Err += H2OutWeight[j][i].Weight * OutError[j];
}
H2Error[i] = NetGain * Hid2[i].Outvalue * (1-Hid2[i].Outvalue) * Err;
}
//hidden 1 error
for (i=1; i<=HID1SIZE; i++)
{
Err = 0;
for (j=1; j<=HID2SIZE; j++) {
Err += H1H2Weight[j][i].Weight * H2Error[j];
}
H1Error[i] = NetGain * Hid1[i].Outvalue * (1-Hid1[i].Outvalue) * Err;
}
//adjust weight
float dWeight, Out1;
for (i=1; i<=HID1SIZE; i++)
{
for (j=0; j<=INPUTSIZE; j++)
{
Out1 = Hid1[j].Outvalue;
Err = H1Error[i];
dWeight = InH1Weight[i][j].dWeight;
InH1Weight[i][j].Weight += NetEta * Err * Out1 + NetAlpha * dWeight;
InH1Weight[i][j].dWeight = NetEta * Err * Out1;
}
}
for (i=1; i<=HID2SIZE; i++)
{
for (j=0; j<=HID1SIZE; j++)
{
Out1 = Hid2[j].Outvalue;
Err = H2Error[i];
dWeight = H1H2Weight[i][j].dWeight;
H1H2Weight[i][j].Weight += NetEta * Err * Out1 + NetAlpha * dWeight;
H1H2Weight[i][j].dWeight = NetEta * Err * Out1;
}
}
for (i=1; i<=OUTSIZE; i++)
{
for (j=0; j<=HID2SIZE; j++)
{
Out1 = Out[j].Outvalue;
Err = OutError[i];
dWeight = H2OutWeight[i][j].dWeight;
H2OutWeight[i][j].Weight += NetEta * Err * Out1 + NetAlpha * dWeight;
H2OutWeight[i][j].dWeight = NetEta * Err * Out1;
}
}
//save weight
for (i=1; i<=HID1SIZE; i++)
{
for (j=0; j<=INPUTSIZE; j++)
{
InH1Weight[i][j].WeightSave = InH1Weight[i][j].Weight;
}
}
for (i=1; i<=HID2SIZE; i++)
{
for (j=0; j<=HID1SIZE; j++)
{
H1H2Weight[i][j].WeightSave = H1H2Weight[i][j].Weight;
}
}
for (i=1; i<=OUTSIZE; i++)
{
for (j=0; j<=HID2SIZE; j++)
{
H2OutWeight[i][j].WeightSave = H2OutWeight[i][j].Weight;
}
}
return;
}
void CBPTrainDlg::OnCancel()
{
// TODO: Add extra cleanup here
if(!m_bTrained || AfxMessageBox("结束当前类型的训练吗?",MB_YESNO)==IDNO)
return;
/////start保存权重到文件
CString strTmp;
if (strcmp(m_Type,"数字")==0)
sprintf(g_acDatFile,"%sdata\\Num.dat",g_acExeDir);
else if (strcmp(m_Type,"字母")==0)
sprintf(g_acDatFile,"%sdata\\Let.dat",g_acExeDir);
else if (strcmp(m_Type,"汉字")==0)
sprintf(g_acDatFile,"%sdata\\Hz.dat",g_acExeDir);
FILE *R1_file;
char buf[30];
if(NULL == (R1_file=fopen(g_acDatFile,"wb+")))
return ;
fseek(R1_file, 0, SEEK_SET);
/* t = 0;
for(k=0; k<30; k++)
buf1[k] = 0;
while('\0' != (ch=fgetc(R3_file)))
buf1[t++] = ch;
NumBuf11(i,j) = (float)strtod(buf1, &buf3); */
int i, j, t, k;
for(i=0; i<HID1SIZE; i++)
for(j=0; j<INPUTSIZE; j++)
{
fwrite(&InH1Weight[i][j].WeightSave,sizeof(float),1,R1_file);
fwrite("",sizeof(""),1,R1_file);
/*for(k=0; k<30; k++)
buf[k] = 0;
sprintf(buf,"%f\0",InH1Weight[i][j].WeightSave);
t=0;
while (buf[t]!='\0')
fputc(buf[t++],R1_file);*/
}
for(i=0; i<HID2SIZE; i++)
for(j=0; j<HID1SIZE; j++)
{
fwrite(&H1H2Weight[i][j].WeightSave,sizeof(float),1,R1_file); fwrite("",sizeof(""),1,R1_file);
fwrite("",sizeof(""),1,R1_file);
/*for(k=0; k<30; k++)
buf[k] = 0;
sprintf(buf,"%f\0",H1H2Weight[i][j].WeightSave);
t=0;
while (buf[t]!='\0')
fputc(buf[t++],R1_file);*/
}
for(i=0; i<OUTSIZE; i++)
for(j=0; j<HID2SIZE; j++)
{
fwrite(&H2OutWeight[i][j].WeightSave,sizeof(float),1,R1_file);
fwrite("",sizeof(""),1,R1_file);
/*for(k=0; k<30; k++)
buf[k] = 0;
sprintf(buf,"%f\0",H2OutWeight[i][j].WeightSave);
t=0;
while (buf[t]!='\0')
fputc(buf[t++],R1_file);*/
}
/*
for(i=0; i<HID1SIZE; i++)
for(j=0; j<INPUTSIZE; j++)
fprintf(R1_file,"%f\0",InH1Weight[i][j].WeightSave);
for(i=0; i<HID2SIZE; i++)
for(j=0; j<HID1SIZE; j++)
fprintf(R1_file,"%f\0",H1H2Weight[i][j].WeightSave);
for(i=0; i<OUTSIZE; i++)
for(j=0; j<HID2SIZE; j++)
fprintf(R1_file,"%f\0",H2OutWeight[i][j].WeightSave);
*/
fclose(R1_file);
/////end保存权重到文件
m_bTrained=FALSE;
//CDialog::OnCancel();
}
void CBPTrainDlg::OnCancel2()
{
// TODO: Add your control notification handler code here
if (m_bTrained)
CBPTrainDlg::OnCancel();
CDialog::OnCancel();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -