实验环境:MatlabR2009a
1 设计一个网络,并且训练它来识别字母表中的26个字母。在alphabet_train.m文件中添加代码如下所示。
clear
clc
[alphabet,targets]=prprob; %alphabet=35x26
S1=10; % S1,第一层的神经元个数为10
[R,Q]=size(alphabet);
[S2,Q]=size(targets); % S2,第二层的神经元个数为S2
P=alphabet;
% 构建BP网络
net=newff(minmax(P),[S1,S2],{'logsig','logsig'},'traingdx');
net.LW{2,1}=net.LW{2,1}*0.01; % 调整第二层的权值
net.b{2}=net.b{2}+0.01; % 调整第二层的阈值
% 无噪声训练
T=targets;
net.performFcn='sse'; % 性能函数,误差平方和
net.trainParam.goal=0.1;
net.trainParam.show=20;
net.trainParam.epochs=5000; % 训练次数
net.trainParam.mc=0.95; % 附加动量
[net,tr]=train(net,P,T);
% 有噪声训练,两组没有噪的输入,两组有噪声的输入
netn=net;
netn.trainParam.goal=0.6;% 性能目标值
netn.trainParam.epochs=300;% 训练的最大次数
T=[targets targets targets targets];
for pass=1:10 %重复10次训练
P=[alphabet,alphabet,(alphabet+randn(R,Q)*0.1),(alphabet+randn(R,Q)*0.2)];
[netn,tr]=train(netn,P,T);
end
% 再次无噪声训练
netn.trainParam.goal=0.1; % 性能目标值
netn.trainParam.epochs=500;% 训练的最大次数
netn.trainParam.show=5;
P=alphabet;
T=targets;
[netn,tr]=train(netn,P,T);
% 系统性能,绘制网络识别错误与噪声信号关系曲线
noise_range=0:0.05:.5;
max_test=100;
network1=[];
network2=[];
T=targets;
for noiselevel=noise_range
errors1=0;
errors2=0;
for i=1:max_test
P=alphabet+randn(35,26)*noiselevel;
A=sim(net,P); %经过无噪声训练的网络
AA=compet(A);
errors1=errors1+sum(sum(abs(AA-T)))/2;
An=sim(netn,P); %经过有噪声训练的网络
AAn=compet(An);
errors2=errors2+sum(sum(abs(AAn-T)))/2;
end
network1=[network1 errors1/26/100];
network2=[network2 errors2/26/100];
end
plot(noise_range,network1*100,'--',noise_range,network2*100);
xlabel('noise indecator');
ylabel('no-noise net -- noise net-');
legend('no-noise net','noise net');
2 运行程序,查看识别错误与噪声信号的关系。
2.1 第一次运行,结果如下。
2.2 第二次运行,结果如下。
2.3 第三次运行,结果如下。
2.4 对比分析
由上面的3次结果可知,每次都存在着差异。这主要是由于每次运行时产生的随机值都是不一样的。
另外,就算每次训练的输入向量都是一样的,但是训练过程中也会产生不同的结果。
在图中可见,当噪声小于0.05的时候,两个网络的识别错误率是一样的。当噪声增加时,经过噪声训练的网比没有经过噪声训练的网的识别错误率要低,而且噪声越大,两者之间的差距就越明显。
3 修改代码
3.1 将有噪声训练中的[netn,tr]=train(netn,P,T)改为[netn,tr]=train(net,P,T),运行程序。
3.1.1 第一次运行,如下图所示。
3.1.2 第二次运行,结果如下图所示。
3.1.3 第三次运行,结果如下图所示。
3.1.4 对比分析
修改代码后,噪声训练的.gaol和epochs参数不再是0.6和300,而是和无噪声训练时一样,分别为0.1和5000。
由于提高了训练的精度和次数,因此在最后的结果中可以看到,有噪声和无噪声的识别错误都降低了,而且是非常的接近的。
3.2 注释再次无噪声训练中的[netn,tr]=train(netn,P,T),运行代码。
3.2.1 第一次运行,结果如下。
3.2.2 第二次运行,结果如下。
3.2.3 第三次运行,结果如下。
3.2.4 对比分析。
由于没有了再次无噪声训练,导致了网络在识别无噪声信号时,付出了更大的代价。
4 网络仿真
4.1 编辑alphabet_recognise.m,输入如下代码。
4.2 运行程序,结果如下图所示。
5 结论
使用没有修改代码的那个方案,效果比较好。