初始化BP神经网络
初始化主要是涉及两个方面的功能,一方面是对读取的训练样本数据进行归一化处理,归一化处理就是指的就是将数据转换成0~1之间。在BP神经网络理论里面,并没有对这个进行要求,不过实际实践过程中,归一化处理是不可或缺的。因为理论模型没考虑到,BP神经网络收敛的速率问题,一般来说神经元的输出对于0~1之间的数据非常敏感,归一化能够显著提高训练效率。可以用以下公式来对其进行归一化,其中 加个常数A 是为了防止出现 0 的情况(0不能为分母)。 y=(x-MinValue+A)/(MaxValue-MinValue+A) 另一方面,就是对神经元的权重进行初始化了,数据归一到了(0~1)之间,那么权重初始化为(-1~1)之间的数据,另外对修正量赋值为0。实现参考代码如下: void initBPNework(){
int i,j;
/*
找到数据最小、最大值
*/
for(i=0; i<In; i++){
Minin[i]=Maxin[i]=d_in[0][i];
for(j=0; j<Data; j++)
{
Maxin[i]=Maxin[i]>d_in[j][i]?Maxin[i]:d_in[j][i];
Minin[i]=Minin[i]<d_in[j][i]?Minin[i]:d_in[j][i];
}
}
for(i=0; i<Out; i++){
Minout[i]=Maxout[i]=d_out[0][i];
for(j=0; j<Data; j++)
{
Maxout[i]=Maxout[i]>d_out[j][i]?Maxout[i]:d_out[j][i];
Minout[i]=Minout[i]<d_out[j][i]?Minout[i]:d_out[j][i];
}
}
/*
归一化处理
*/
for (i = 0; i < In; i++)
for(j = 0; j < Data; j++)
d_in[j][i]=(d_in[j][i]-Minin[i]+1)/(Maxin[i]-Minin[i]+1);
for (i = 0; i < Out; i++)
for(j = 0; j < Data; j++)
d_out[j][i]=(d_out[j][i]-Minout[i]+1)/(Maxout[i]-Minout[i]+1);
/*
初始化神经元
*/
for (i = 0; i < Neuron; ++i)
for (j = 0; j < In; ++j){
w[i][j]=(rand()*2.0/RAND_MAX-1)/2;
dw[i][j]=0;
}
for (i = 0; i < Neuron; ++i)
for (j = 0; j < Out; ++j){
v[j][i]=(rand()*2.0/RAND_MAX-1)/2;
dv[j][i]=0;
}
}
|