请问下,我用BP网络来识别手写数字,每次训练,我把权值保存起来。但是这个保存的权值只是对单个数字的训练权值,例如训练0,就只能识别0,其他的无法识别。
我每次只能采样一个数字的数据,请问要怎么弄?下面为训练的代码
PS:是不是因为下面这样算的误差只是单个数字的误差,而不是所以数字误差的累计和?如果是这样的话,应该怎么改呢?
for(l=0;l<5000;l++) //这里设定最大的迭代次数为5000次
{
ex=0;
for(i=1;i<=n_in;i++) //将样本特征送到输入层
input_unites[i] = data_in[i-1];
for(i=1;i<=n_out;i++) //将教师输出输送到BP网络的理想输出单元
target[i]=data_out[i-1];
bpnn_layerforward(input_unites,hidden_unites,
input_weights, n_in,n_hidden);
bpnn_layerforward(hidden_unites, output_unites,
hidden_weights,n_hidden,n_out);
//误差计算
bpnn_output_error(output_deltas,target,output_unites,n_out); //将输出层的输出与教师输出比较
bpnn_hidden_error(hidden_deltas,n_hidden, output_deltas, n_out,hidden_weights, hidden_unites); //根据输出层结点上的误差计算隐层每个节点上的误差
//权值调整
bpnn_adjust_weights(output_deltas,n_out, hidden_unites,n_hidden,
hidden_weights, hidden_prev_weights, eta, momentum);
bpnn_adjust_weights(hidden_deltas, n_hidden, input_unites, n_in,
input_weights, input_prev_weights, eta, momentum);
for(i=1;i<=n_out;i++) //总误差
ex=(output_unites[i]-data_out[i-1])*(output_unites[i]-data_out[i-1]);
//计算均方误差
/*ex=ex/double(num*n_out);*/
if(ex<min_ex)break;
}
ite_times = l;
rel_ex=ex;
//相关保存w
CString inw_path=weightPath+"in_w.dat";
CString outw_path=weightPath+"out_w.dat";
char *inw=inw_path.GetBuffer(inw_path.GetLength());
char *outw=outw_path.GetBuffer(outw_path.GetLength());
//保存输入层与隐层之间的权值
w_weight(input_weights,n_in,n_hidden,inw);
//保存隐层与输出层之间的权值
w_weight(hidden_weights,n_hidden,n_out,outw); |