BP神經網路續1
一、BP網路中的函式
1.建立函式
1) cascadeforwardnet函式
cascadeforwardnet(hiddenSizes,trainFcn)
其中引數hiddenSizes為隱含層神經元節點的個數,如果有多個隱含層,則hiddenSizes是一個行向量,預設值為10;引數trainFcn為訓練函式(預設值為trainlm)。
2) feedforwardnet(hiddenSizes,trainFcn)
3) newff函式
4) newcf函式
2.傳遞函式
1) logsig函式
A = logsig(N,FP):N為SxQ維的網路輸入(列)向量,FP為效能引數
dA_dN = logsig(‘dn’,N,A,FP)
返回A關於N的導數dA_dN,如果A或FP沒有給出,則FP返回預設引數
2) tansig函式
3) purelin函式
該函式為線性傳遞函式
3.學習函式
1) learngd函式
2) learngdm函式
4.訓練函式
1) trainbfg函式
準牛頓BP演算法
2) traingd函式
該函式為負梯度下降BP演算法函式
3) traindm函式
該函式為負梯度下降動量BP演算法函式
5.效能函式
perf = msereg(E,Y,X,FP)
引數E表示誤差矩陣或向量(E=T-Y,T表示網路的目標向量);Y為網路的輸出向量;X為所有權值和閾值的向量;FP表示效能引數;返回引數perf為平均絕對誤差
6.顯示函式
1) plotperf函式
用於繪製一個單獨神經元的額誤差曲面
plotperf(tr,goal,name,epoch)
其中tr為網路訓練記錄;引數goal為效能目標,預設值為NaN;引數name為訓練函式名稱,預設為空;引數epoch為訓練步數,預設訓練記錄的長度。
2) errsurf函式
errsurf(P,T,WV,BV,F)
P為輸入行向量,T為目標行向量;WV為權值列向量;BV為閾值列向量;F為函式名字
3) plotes函式
plotes(WV,BV,ES,V)
其中,引數WV為權值的N維列向量;引數BV為M維的閾值行向量;引數ES為誤差向量組成的MxN維矩陣;引數V為視角,預設為[-37.5,30]
4) plotep函式
H = plotep(W,B,E)
引數W為當前權值;引數B為當前閾值;引數E為當前神經元的輸入誤差
二、BP神經網路的應用
1.分類
p=[1 2;-1 1;-2 1;-4 0]';
t=[0.2 0.8 0.8 0.2];
net=newff([-1 1;-1 1],[5 1],{'logsig','logsig'},'traingd');
net.trainParam.goal = 0.001;
net.trainParam.epochs = 5000;
[net,tr]=train(net,p,t);
iw1=net.iw{1}
ib1=net.b{1}
iw2=net.iw{2}
ib2=net.b{2}
save li3_27 net;
load li3_27 net;
p1=[1 2;-1 1;-2 1;-4 0]';
a2=sim(net,p1)
disp('輸出分類結果為:')
a2=a2>0.5
2.BP網路去除噪聲
clear all;
[alphabet,targets]=prprob;
[R,Q]=size(alphabet);
[S2,Q]=size(targets);
S1=10;
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;
% 無噪聲訓練
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
P=[alphabet,alphabet,(alphabet+rand(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=5000;
netn.trainParam.show=5;
P=alphabet;
T=targets;
% [net,tr]=train(netn,P,T);
% 系統性能
noise_range=0:0.05:0.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(AA-T)))/2;
end
network1=[network1 errors1/26/100];
network2=[network2 errors2/26/100];
end
plot(noise_range,network1*100,'--',noise_range,network2*100);
xlabel('噪聲指標');
ylabel('無噪聲訓練 -- 有噪聲訓練 ---');
legend('無噪聲訓練網路','有噪聲訓練');
% 對訓練的網路進行模擬
noisyA=alphabet(:,1)+randn(35,1)*0.2;
figure;
plotchar(noisyA);
A2=sim(net,noisyA);
A2=compet(A2);
answer=find(compet(A2)==1);
figure;plotchar(alphabet(:,answer));