![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
各位大哥 帮忙看看这个程序哪里错了吧 急用 并且告诉我这是干什么的 谢谢啦 请尽快 VC++ 50
typedefstruct{intinput_n;//输入层的单元个数inthid_n;//隐含层的单元个数intoutput_n;//输出层的单元个数double*in...
typedef struct{
int input_n;//输入层的单元个数
int hid_n;//隐含层的单元个数
int output_n;//输出层的单元个数
double *input_units;//输入层单元
double *hid_units;//隐层单元
double *output_units;//输出层单元
double *hid_delta;//隐层单元误差
double *output_delta;//输出层单元误差
double *target;//期望输出
double **input_weights;//输入层到隐层的连接权值
double **hid_weights;//隐层到输出层的连接权值
double **input_prev_weights;//上一次输入层到隐层的权值变化
double **hid_prev_weights;//上一次隐层到输出层的权值变化
} BPNN;
BPNN *bpnn_create(int n_in,int n_hid,int n_out);//创建BP网络
void bpnn_free(BPNN* net);//释放空间
void bpnn_feedforward(BPNN *net);//前向传播
void bpnn—train(BPNN *net,double eta,double momentum,double *out_e,double *hid_e);//训练BP网络
void bpnn_save(BPNN *net,char *filename); //保存权值
BPNN *bpnn_read(char *filename); //读取权值
unsigned int reg_BP(double *plmage); //进行识别
//调整隐层到输出层的权值
void bpnn_adjust_weights(double *delta,//输出层误差
int ndelta,//输出层单元个数
double *ly,//隐层单元
int nly,//隐层单元个数
double** w,//隐层到输出层的连接权值
double **oldw,//上一次隐层到输出层的权值变化
double eta,//步长
double momentum)//动量因子
{
double new_dw;
int k,j;
ly[0]=1.0;
for(j=l;j<=ndelta;j++){
for(k=O;k<=nly;k++){
new_dw=((eta*delta[j]*ly[k])+(momentum*oldw[k][j]));
w[k][j]+=new_dw;
oldw[k][j]=new_dw;
}
}
}
//计算隐层单元误差
void bpnn_hid_error(double* delta_h,int nh,double *delta_o,int no,double **who,double *hid,double *err)
{
int j,k;
double h,sum,errsum;
errsum=0.0;
for(j=l;j<=nh;j++){
h=hid[j];
sum=O.0;
for(k=1;k<=no;k++){
sum+=delta_o[k]*who[j][k];
}
delta_h[j]=h*(1.O-h)*sum;
errsum+=ABS(delta_h[j]);
}
*err=errsum;
}
//计算输出层单元误差
void bpnn_output_error(double *delta,double *target,double *output,
int nj,double *err)
{
int j;
double o,t, errsum;
errsum=0.0;
for(j=1;j<=nj;j++){
o=output[j];
t=target[j];
delta[j]=o*(1.0-o)*(t-o);
errsum+=ABS(delta[j]);
}
*err=errsum;
} 展开
int input_n;//输入层的单元个数
int hid_n;//隐含层的单元个数
int output_n;//输出层的单元个数
double *input_units;//输入层单元
double *hid_units;//隐层单元
double *output_units;//输出层单元
double *hid_delta;//隐层单元误差
double *output_delta;//输出层单元误差
double *target;//期望输出
double **input_weights;//输入层到隐层的连接权值
double **hid_weights;//隐层到输出层的连接权值
double **input_prev_weights;//上一次输入层到隐层的权值变化
double **hid_prev_weights;//上一次隐层到输出层的权值变化
} BPNN;
BPNN *bpnn_create(int n_in,int n_hid,int n_out);//创建BP网络
void bpnn_free(BPNN* net);//释放空间
void bpnn_feedforward(BPNN *net);//前向传播
void bpnn—train(BPNN *net,double eta,double momentum,double *out_e,double *hid_e);//训练BP网络
void bpnn_save(BPNN *net,char *filename); //保存权值
BPNN *bpnn_read(char *filename); //读取权值
unsigned int reg_BP(double *plmage); //进行识别
//调整隐层到输出层的权值
void bpnn_adjust_weights(double *delta,//输出层误差
int ndelta,//输出层单元个数
double *ly,//隐层单元
int nly,//隐层单元个数
double** w,//隐层到输出层的连接权值
double **oldw,//上一次隐层到输出层的权值变化
double eta,//步长
double momentum)//动量因子
{
double new_dw;
int k,j;
ly[0]=1.0;
for(j=l;j<=ndelta;j++){
for(k=O;k<=nly;k++){
new_dw=((eta*delta[j]*ly[k])+(momentum*oldw[k][j]));
w[k][j]+=new_dw;
oldw[k][j]=new_dw;
}
}
}
//计算隐层单元误差
void bpnn_hid_error(double* delta_h,int nh,double *delta_o,int no,double **who,double *hid,double *err)
{
int j,k;
double h,sum,errsum;
errsum=0.0;
for(j=l;j<=nh;j++){
h=hid[j];
sum=O.0;
for(k=1;k<=no;k++){
sum+=delta_o[k]*who[j][k];
}
delta_h[j]=h*(1.O-h)*sum;
errsum+=ABS(delta_h[j]);
}
*err=errsum;
}
//计算输出层单元误差
void bpnn_output_error(double *delta,double *target,double *output,
int nj,double *err)
{
int j;
double o,t, errsum;
errsum=0.0;
for(j=1;j<=nj;j++){
o=output[j];
t=target[j];
delta[j]=o*(1.0-o)*(t-o);
errsum+=ABS(delta[j]);
}
*err=errsum;
} 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询