matlab神经网络知识讲解

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Matlab神经网络工具箱

2010-7-21

今天学的是BP神经网络,首先看的是一个关于非线性函数逼近的例子,最后得出一个心得:在使用newff函数生成一个新的网络时,神经元的层数和每一层的神经元数会对结果造成不小的影响,一般都采用[n,1]的建立方法,其中n为隐层的神经元数,1为输出层的神经元数。

然后是做了一个识别系统,算是一个较大的神经网络,具体的代码解释和分析如下:

[alphabet,targets]=prprob;

[R,Q]=size(alphabet);

[S2,Q]=size(targets);

S1=10;

[R,Q]=size(alphabet);

[S2,Q]=size(targets);

P=alphabet;

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;

其中的proprob是matlab自带的一个生成字母表布尔值的函数。可以具体查看。

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.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(net,P,T);

end

接下来是有噪声训练,采用随机数生成影响输入矩阵的方式。这里收敛的有点慢,在

应用于其他系统的时候值得注意。

netn.trainParam.goal=0.1;

netn.trainParam.epochs=500;

netn.trainParam.show=5;

P=alphabet;

T=targets;

[net,tr]=train(netn,P,T)

接下来还进行无噪声训练,可能是前面的逼近情况已经很了理想了,这里只用了0次循环。。。。。。

noise_range=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);

plot(noise_range,network1*100,'--',noise_range,network2*100,'+');

title('识别误差');

xlabel('噪声指标');

ylabel('不同的训练方式');

legend('无噪声训练','有噪声训练');

以上是对系统性能的分析。

这里的compet函数从help上来更像是一个滤波函数,而sum函数则是用来求一个多维矩阵中各行列的和值。

noisyJ=alphabet(:,1)+randn(35,1)*0.2;

plotchar(noisyJ);

A2=sim(net,noisyJ);

A2=compet(A2);

answer=find(compet(A2)==1);

plotchar(alphabet(:,answer));

这里面plotchar函数就是将布尔值向量转变成具体的字母图形,下上代码是对具体的情况进行识别。

noisyJ=alphabet(:,10)+randn(35,1)*0.2;

subplot(1,2,1);

plotchar(noisyJ)

A2=sim(net,noisyJ);

A2=compet(A2);

answer=find(compet(A2)==1);

subplot(1,2,2);

plotchar(alphabet(:,answer));

这段代码暴露了系统还不太成熟的一面

noisyJ=alphabet(:,23)+randn(35,1)*0.2;

subplot(1,2,1);

plotchar(noisyJ);

A2=sim(net,noisyJ);

A2=compet(A2);

answer=find(compet(A2)==1);

subplot(1,2,2);

plotchar(alphabet(:,answer));

同上,这也是一种识别出错的情况。

noisyJ=alphabet(:,4);

subplot(1,2,1);

plotchar(noisyJ);

A2=sim(net,noisyJ);

A2=compet(A2);

相关文档
最新文档