📄 bpnetwork_recognition.m
字号:
%两层BP网络,35个输入端,输出层26个神经元,隐层和输出层
%的传递函数均为logsigmoid, 输出量在0-1之间,恰好满足输出
%布尔值的要求。隐层含10个神经元,神经元数目的选择是依据经
%和猜测而定。实际训练中,若训练过程不理想,可以适当增加
%隐层神经元数目
%训练网络就是要是其输出向量正确代表字母向量。而噪声的引入
%可能导致不精确的输出,通过竞争传递函数compet训练,能保证
%正确识别带噪声的字母向量
%首先生成代表26个字母布尔值的样本数据
[alphabet,targets]=prprob; %prprob: character recognition problem definition
[R,Q]=size(alphabet);%alphabet-35*26matrix of 5*7 bit maps for each letter
[s2,Q]=size(targets); %targets-26*26 target vectors
s1=10; %隐层神经元数目
p=alphabet;
%用newff生成bp网络
net=newff(minmax(p),[s1,s2],{'logsig','logsig'},'traingdx');% traingdx-动量
%和自适应lr的梯度下降法
net.LW{2,1}=net.LW{2,1}*0.01;
net.b{2}=net.b{2}*0.01;
%为使网络对输入向量有一定的容错能力,先使用理想信号,再用理想+噪声信号进行训练
%无噪声训练
t=targets;
%net.performFcn='see';
net.trainParam.goal=0.1; %训练精度
net.trainParam.show=20;% 显示训练迭代过程,NaN为不显示
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
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;
net.trainParam.show=5;
p=alphabet;
t=targets;
[netn,tr]=train(netn,p,t);
%
% %系统性能测试,分别用100个不同的噪声信号进行试验
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
figure;
plot(noise_range,network1*100,'--',noise_range,network2*100);
title('识别误差');
xlabel('噪声指标');
ylabel('无噪声训练网络- 有噪声训练网络--');
%
%
% %字母识别
noiseJ=alphabet(:,1)+randn(35,1)*0.2; %识别字母A
figure;
plotchar(noiseJ);
a2=sim(net,noiseJ);
a2=compet(a2);
answer=find(compet(a2)==1);
figure;
plotchar(alphabet(:,answer));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -