1. 程式人生 > 其它 >BP神經網路續1

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