BPNN *bpnn_internal_create(int n_in, int n_hidden, int n_out) { BPNN *newnet; newnet = (BPNN *) malloc (sizeof (BPNN)); if (newnet == NULL) { printf("BPNN_CREATE: Couldn't allocate neural network\n"); return (NULL); } newnet->input_n = n_in; newnet->hidden_n = n_hidden; newnet->output_n = n_out; newnet->input_units = alloc_1d_dbl(n_in + 1); newnet->hidden_units = alloc_1d_dbl(n_hidden + 1); newnet->output_units = alloc_1d_dbl(n_out + 1); newnet->hidden_delta = alloc_1d_dbl(n_hidden + 1); newnet->output_delta = alloc_1d_dbl(n_out + 1); newnet->target = alloc_1d_dbl(n_out + 1); newnet->input_weights = alloc_2d_dbl(n_in + 1, n_hidden + 1); newnet->hidden_weights = alloc_2d_dbl(n_hidden + 1, n_out + 1); newnet->input_prev_weights = alloc_2d_dbl(n_in + 1, n_hidden + 1); newnet->hidden_prev_weights = alloc_2d_dbl(n_hidden + 1, n_out + 1); return (newnet); }
void CChildView::OnBpnetTrain() { OnImgprcAll(); //判断是否经过了归一划的处理 if(gyhfinished==false) { //如果没有进行提示错误并返回 ::MessageBox(NULL,"没有进行归一划预处理",NULL,MB_ICONSTOP); return; } //建立BP网络训练参数对话框 CDBpParamater BpPa; //初始化变量 BpPa.m_a=0; // 相关参数 BpPa.m_eta=0.015; // 训练步长 BpPa.m_ex=0.001; // 最小均方误差 BpPa.m_hn=10; // 隐含层结点个数 // 显示对话框 if(BpPa.DoModal()!=IDOK) { //返回 return; } //用户获得参数信息 //相关系数 double momentum=BpPa.m_a; //最小均方误差 double min_ex=BpPa.m_ex; //隐层结点数目 int n_hidden=BpPa.m_hn; //训练步长 double eta=BpPa.m_eta; //获得指向DIB的指针 BYTE *lpDIB=(BYTE*)::GlobalLock((HGLOBAL) m_hDIB); //获得指向DIB象素的指针,并指向象素的起始位置 BYTE *lpDIBBits =(BYTE*)::FindDIBBits((char *)lpDIB); //获得颜色信息 int numColors=(int) ::DIBNumColors((char *)lpDIB); //不是灰度图返回 if (numColors!=256) { ::GlobalUnlock((HGLOBAL) m_hDIB); ::MessageBox(NULL,"只能处理灰度图像",NULL,MB_ICONSTOP); return; } //获取图像的宽度 LONG lWidth = (LONG) ::DIBWidth((char *)lpDIB); //获取图像的高度 LONG lHeight = (LONG) ::DIBHeight((char *)lpDIB); //计算图像每行的字节数 LONG lLineByte = (lWidth+3)/4*4; //归一化的宽度 LONG lSwidth = w_sample; //归一化的高度 LONG LSheight = h_sample; //指向输入样本的特征向量的指针 double **data_in; //从输入的训练样本中提取特征向量 data_in = code ( lpDIBBits, digicount, lLineByte, lSwidth, LSheight); //计算输入层结点的数目 int n_in = LSheight*lSwidth; double out[][4]={ 0.1,0.1,0.1,0.1, 0.1,0.1,0.1,0.9, 0.1,0.1,0.9,0.1, 0.1,0.1,0.9,0.9, 0.1,0.9,0.1,0.1, 0.1,0.9,0.1,0.9, 0.1,0.9,0.9,0.1, 0.1,0.9,0.9,0.9, 0.9,0.1,0.1,0.1, 0.9,0.1,0.1,0.9}; double **data_out; data_out = alloc_2d_dbl(digicount,4); for(int i=0;i<digicount;i++) { for(int j=0;j<4;j++) data_out[i][j]=out[i%10][j]; } BpTrain( data_in, data_out, n_in,n_hidden,min_ex,momentum,eta,digicount); ::GlobalUnlock(m_hDIB); CDC* pDC=GetDC(); DisplayDIB(pDC,m_hDIB); }