实验环境:MatlabR2009a

1 设计一个网络,并且训练它来识别字母表中的26个字母。在alphabet_train.m文件中添加代码如下所示。


[plain]  
    view plain 
    copy 
    
 
    
 
  
1. clear  
2. clc  
3. [alphabet,targets]=prprob; %alphabet=35x26  
4. S1=10;  % S1,第一层的神经元个数为10  
5. [R,Q]=size(alphabet);  
6. [S2,Q]=size(targets); % S2,第二层的神经元个数为S2  
7. P=alphabet;  
8.   
9.   
10.   
11.   
12. % 构建BP网络  
13. net=newff(minmax(P),[S1,S2],{'logsig','logsig'},'traingdx');  
14. net.LW{2,1}=net.LW{2,1}*0.01; % 调整第二层的权值  
15. net.b{2}=net.b{2}+0.01;       % 调整第二层的阈值  
16.   
17.   
18. % 无噪声训练  
19. T=targets;  
20. net.performFcn='sse';       % 性能函数,误差平方和  
21. net.trainParam.goal=0.1;  
22. net.trainParam.show=20;  
23. net.trainParam.epochs=5000; % 训练次数  
24. net.trainParam.mc=0.95;     % 附加动量   
25. [net,tr]=train(net,P,T);  
26.   
27.   
28. % 有噪声训练,两组没有噪的输入,两组有噪声的输入  
29. netn=net;  
30. netn.trainParam.goal=0.6;% 性能目标值  
31. netn.trainParam.epochs=300;% 训练的最大次数  
32. T=[targets targets targets targets];  
33. for pass=1:10   %重复10次训练  
34.         P=[alphabet,alphabet,(alphabet+randn(R,Q)*0.1),(alphabet+randn(R,Q)*0.2)];  
35.         [netn,tr]=train(netn,P,T);  
36. end  
37.   
38.   
39. % 再次无噪声训练  
40. netn.trainParam.goal=0.1;  % 性能目标值  
41. netn.trainParam.epochs=500;% 训练的最大次数  
42. netn.trainParam.show=5;  
43. P=alphabet;  
44. T=targets;  
45. [netn,tr]=train(netn,P,T);  
46.   
47.   
48. % 系统性能,绘制网络识别错误与噪声信号关系曲线  
49. noise_range=0:0.05:.5;  
50. max_test=100;  
51. network1=[];  
52. network2=[];  
53. T=targets;  
54. for noiselevel=noise_range  
55.     errors1=0;  
56.     errors2=0;  
57.     for i=1:max_test  
58.         P=alphabet+randn(35,26)*noiselevel;  
59.         A=sim(net,P);   %经过无噪声训练的网络  
60.         AA=compet(A);  
61.         errors1=errors1+sum(sum(abs(AA-T)))/2;  
62.         An=sim(netn,P); %经过有噪声训练的网络  
63.         AAn=compet(An);  
64.         errors2=errors2+sum(sum(abs(AAn-T)))/2;  
65.     end  
66.     network1=[network1 errors1/26/100];  
67.     network2=[network2 errors2/26/100];  
68. end  
69. plot(noise_range,network1*100,'--',noise_range,network2*100);  
70. xlabel('noise indecator');  
71. ylabel('no-noise net -- noise net-');  
72. legend('no-noise net','noise net');


2  运行程序,查看识别错误与噪声信号的关系。

2.1 第一次运行,结果如下。


人工神经网络研究复苏 人工神经网络实验_MATLAB

2.2 第二次运行,结果如下。


人工神经网络研究复苏 人工神经网络实验_系统性能_02

2.3 第三次运行,结果如下。


人工神经网络研究复苏 人工神经网络实验_MATLAB_03

2.4 对比分析

       由上面的3次结果可知,每次都存在着差异。这主要是由于每次运行时产生的随机值都是不一样的。

另外,就算每次训练的输入向量都是一样的,但是训练过程中也会产生不同的结果。

       在图中可见,当噪声小于0.05的时候,两个网络的识别错误率是一样的。当噪声增加时,经过噪声训练的网比没有经过噪声训练的网的识别错误率要低,而且噪声越大,两者之间的差距就越明显。

3 修改代码

3.1 将有噪声训练中的[netn,tr]=train(netn,P,T)改为[netn,tr]=train(net,P,T),运行程序。

3.1.1 第一次运行,如下图所示。


人工神经网络研究复苏 人工神经网络实验_网络仿真_04

3.1.2 第二次运行,结果如下图所示。


人工神经网络研究复苏 人工神经网络实验_MATLAB_05

3.1.3 第三次运行,结果如下图所示。


人工神经网络研究复苏 人工神经网络实验_人工神经网络研究复苏_06

3.1.4 对比分析

修改代码后,噪声训练的.gaol和epochs参数不再是0.6和300,而是和无噪声训练时一样,分别为0.1和5000。

由于提高了训练的精度和次数,因此在最后的结果中可以看到,有噪声和无噪声的识别错误都降低了,而且是非常的接近的。

3.2 注释再次无噪声训练中的[netn,tr]=train(netn,P,T),运行代码。

3.2.1 第一次运行,结果如下。


人工神经网络研究复苏 人工神经网络实验_人工神经网络研究复苏_07

3.2.2 第二次运行,结果如下。


人工神经网络研究复苏 人工神经网络实验_MATLAB_08

3.2.3 第三次运行,结果如下。


人工神经网络研究复苏 人工神经网络实验_系统性能_09

3.2.4 对比分析。

由于没有了再次无噪声训练,导致了网络在识别无噪声信号时,付出了更大的代价。

4 网络仿真

4.1 编辑alphabet_recognise.m,输入如下代码。

% A——经过无噪声训练的识别
noisyJ=alphabet(:,1)+randn(35,1)*0.2;
figure,plotchar(noisyJ); % 显示含有噪声的字母A
A2=sim(net,noisyJ);
A2=compet(A2);
answer=find(compet(A2)==1);
figure,plotchar(alphabet(:,answer)); % 显示字母A的识别结果

% A——经过噪声训练的识别
noisyJ=alphabet(:,10)+randn(35,1)*0.2; 
figure,plotchar(noisyJ); % 显示含有噪声的字母J
A2=sim(netn,noisyJ);
A2=compet(A2);
answer=find(compet(A2)==1);
figure,plotchar(alphabet(:,answer)); % 显示字母J的识别结果



4.2 运行程序,结果如下图所示。

无噪声训练的识别结果


人工神经网络研究复苏 人工神经网络实验_人工神经网络_10

有噪声训练的识别结果


人工神经网络研究复苏 人工神经网络实验_人工神经网络_11

5 结论

使用没有修改代码的那个方案,效果比较好。


分享到: 




实验环境:MatlabR2009a

1 设计一个网络,并且训练它来识别字母表中的26个字母。在alphabet_train.m文件中添加代码如下所示。


[plain]  
    view plain 
    copy 
    
 
    
 
  
1. clear  
2. clc  
3. [alphabet,targets]=prprob; %alphabet=35x26  
4. S1=10;  % S1,第一层的神经元个数为10  
5. [R,Q]=size(alphabet);  
6. [S2,Q]=size(targets); % S2,第二层的神经元个数为S2  
7. P=alphabet;  
8.   
9.   
10.   
11.   
12. % 构建BP网络  
13. net=newff(minmax(P),[S1,S2],{'logsig','logsig'},'traingdx');  
14. net.LW{2,1}=net.LW{2,1}*0.01; % 调整第二层的权值  
15. net.b{2}=net.b{2}+0.01;       % 调整第二层的阈值  
16.   
17.   
18. % 无噪声训练  
19. T=targets;  
20. net.performFcn='sse';       % 性能函数,误差平方和  
21. net.trainParam.goal=0.1;  
22. net.trainParam.show=20;  
23. net.trainParam.epochs=5000; % 训练次数  
24. net.trainParam.mc=0.95;     % 附加动量   
25. [net,tr]=train(net,P,T);  
26.   
27.   
28. % 有噪声训练,两组没有噪的输入,两组有噪声的输入  
29. netn=net;  
30. netn.trainParam.goal=0.6;% 性能目标值  
31. netn.trainParam.epochs=300;% 训练的最大次数  
32. T=[targets targets targets targets];  
33. for pass=1:10   %重复10次训练  
34.         P=[alphabet,alphabet,(alphabet+randn(R,Q)*0.1),(alphabet+randn(R,Q)*0.2)];  
35.         [netn,tr]=train(netn,P,T);  
36. end  
37.   
38.   
39. % 再次无噪声训练  
40. netn.trainParam.goal=0.1;  % 性能目标值  
41. netn.trainParam.epochs=500;% 训练的最大次数  
42. netn.trainParam.show=5;  
43. P=alphabet;  
44. T=targets;  
45. [netn,tr]=train(netn,P,T);  
46.   
47.   
48. % 系统性能,绘制网络识别错误与噪声信号关系曲线  
49. noise_range=0:0.05:.5;  
50. max_test=100;  
51. network1=[];  
52. network2=[];  
53. T=targets;  
54. for noiselevel=noise_range  
55.     errors1=0;  
56.     errors2=0;  
57.     for i=1:max_test  
58.         P=alphabet+randn(35,26)*noiselevel;  
59.         A=sim(net,P);   %经过无噪声训练的网络  
60.         AA=compet(A);  
61.         errors1=errors1+sum(sum(abs(AA-T)))/2;  
62.         An=sim(netn,P); %经过有噪声训练的网络  
63.         AAn=compet(An);  
64.         errors2=errors2+sum(sum(abs(AAn-T)))/2;  
65.     end  
66.     network1=[network1 errors1/26/100];  
67.     network2=[network2 errors2/26/100];  
68. end  
69. plot(noise_range,network1*100,'--',noise_range,network2*100);  
70. xlabel('noise indecator');  
71. ylabel('no-noise net -- noise net-');  
72. legend('no-noise net','noise net');

2  运行程序,查看识别错误与噪声信号的关系。

2.1 第一次运行,结果如下。


人工神经网络研究复苏 人工神经网络实验_MATLAB

2.2 第二次运行,结果如下。


人工神经网络研究复苏 人工神经网络实验_系统性能_02

2.3 第三次运行,结果如下。


人工神经网络研究复苏 人工神经网络实验_MATLAB_03

2.4 对比分析

       由上面的3次结果可知,每次都存在着差异。这主要是由于每次运行时产生的随机值都是不一样的。

另外,就算每次训练的输入向量都是一样的,但是训练过程中也会产生不同的结果。

       在图中可见,当噪声小于0.05的时候,两个网络的识别错误率是一样的。当噪声增加时,经过噪声训练的网比没有经过噪声训练的网的识别错误率要低,而且噪声越大,两者之间的差距就越明显。

3 修改代码

3.1 将有噪声训练中的[netn,tr]=train(netn,P,T)改为[netn,tr]=train(net,P,T),运行程序。

3.1.1 第一次运行,如下图所示。


人工神经网络研究复苏 人工神经网络实验_网络仿真_04

3.1.2 第二次运行,结果如下图所示。


人工神经网络研究复苏 人工神经网络实验_MATLAB_05

3.1.3 第三次运行,结果如下图所示。


人工神经网络研究复苏 人工神经网络实验_人工神经网络研究复苏_06

3.1.4 对比分析

修改代码后,噪声训练的.gaol和epochs参数不再是0.6和300,而是和无噪声训练时一样,分别为0.1和5000。

由于提高了训练的精度和次数,因此在最后的结果中可以看到,有噪声和无噪声的识别错误都降低了,而且是非常的接近的。

3.2 注释再次无噪声训练中的[netn,tr]=train(netn,P,T),运行代码。

3.2.1 第一次运行,结果如下。


人工神经网络研究复苏 人工神经网络实验_人工神经网络研究复苏_07

3.2.2 第二次运行,结果如下。


人工神经网络研究复苏 人工神经网络实验_MATLAB_08

3.2.3 第三次运行,结果如下。


人工神经网络研究复苏 人工神经网络实验_系统性能_09

3.2.4 对比分析。

由于没有了再次无噪声训练,导致了网络在识别无噪声信号时,付出了更大的代价。

4 网络仿真

4.1 编辑alphabet_recognise.m,输入如下代码。

% A——经过无噪声训练的识别
noisyJ=alphabet(:,1)+randn(35,1)*0.2;
figure,plotchar(noisyJ); % 显示含有噪声的字母A
A2=sim(net,noisyJ);
A2=compet(A2);
answer=find(compet(A2)==1);
figure,plotchar(alphabet(:,answer)); % 显示字母A的识别结果

% A——经过噪声训练的识别
noisyJ=alphabet(:,10)+randn(35,1)*0.2; 
figure,plotchar(noisyJ); % 显示含有噪声的字母J
A2=sim(netn,noisyJ);
A2=compet(A2);
answer=find(compet(A2)==1);
figure,plotchar(alphabet(:,answer)); % 显示字母J的识别结果



4.2 运行程序,结果如下图所示。

无噪声训练的识别结果


人工神经网络研究复苏 人工神经网络实验_人工神经网络_10

有噪声训练的识别结果


人工神经网络研究复苏 人工神经网络实验_人工神经网络_11

5 结论

使用没有修改代码的那个方案,效果比较好。