打印

BP神经网络

[复制链接]
2805|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kusheng176|  楼主 | 2010-12-29 16:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问下,我用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);

相关帖子

沙发
acute1110| | 2010-12-29 16:12 | 只看该作者
如果你想做到能针对所有数字则你需要将所有的数字全部拆分成最基本的笔画单元,这样你只要储存这些基本单元就好了,----这其实是你需要用什么方法来实现,当你的样本比基本单元多很多时当然用基本单元了,比如汉字,如果只有数字字母,就单个学习好了。

使用特权

评论回复
板凳
haolaishi| | 2011-9-10 20:38 | 只看该作者
MARK

使用特权

评论回复
地板
李富贵| | 2011-9-11 01:32 | 只看该作者
昨天去医院隔了bp,那神经网络显然也不见了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

64

帖子

1

粉丝