感知器與BP神經網絡的簡單應用

感知器與BP神經網絡的簡單應用

一、概念

1、BP神經網絡
基本BP算法包括信號的前向傳播和誤差的反向傳播兩個過程。即計算誤差輸出時按從輸入到輸出的方向進行,而調整權值和閾值則從輸出到輸入的方向進行。正向傳播時,輸入信號通過隱含層作用於輸出節點,經過非線性變換,產生輸出信號,若實際輸出與期望輸出不相符,則轉入誤差的反向傳播過程。誤差反傳是將輸出誤差通過隱含層向輸入層逐層反傳,並將誤差分攤給各層所有單元,以從各層獲得的誤差信號作爲調整各單元權值的依據。通過調整輸入節點與隱層節點的聯接強度和隱層節點與輸出節點的聯接強度以及閾值,使誤差沿梯度方向下降,經過反覆學習訓練,確定與最小誤差相對應的網絡參數(權值和閾值),訓練即告停止。此時經過訓練的神經網絡即能對類似樣本的輸入信息,自行處理輸出誤差最小的經過非線形轉換的信息。

2、感知器
感知器是一種前饋人工神經網絡模型,其將輸入的多個數據集映射到單一的輸出的數據集上,可以解決任何線性不可分問題。

二、BP神經網絡算法流程

在這裏插入圖片描述

1、初始化網絡權重
假設輸入層的節點個數爲n,隱含層的節點個數爲m,輸出層的節點個數爲l。其中激勵函數爲g(x)取Sigmoid函數。形式爲:
在這裏插入圖片描述
2、隱含層的輸出
如上面的三層BP網絡所示,隱含層的輸出爲
在這裏插入圖片描述
3、輸出層的輸出
在這裏插入圖片描述
4、誤差的計算
我們取誤差公式爲:
在這裏插入圖片描述
其中爲期望輸出。我們記,則可以表示爲
在這裏插入圖片描述
5、權值和偏重的更新
權值的更新公式爲:
在這裏插入圖片描述
隱含層到輸出層的權重更新 在這裏插入圖片描述
則權重的更新公式爲:
在這裏插入圖片描述
輸入層到隱含層的權重更新 在這裏插入圖片描述
偏置的更新公式爲:
在這裏插入圖片描述
隱含層到輸出層的偏置更新
在這裏插入圖片描述
則偏置的更新公式爲:
在這裏插入圖片描述
輸入層到隱含層的偏置更新
在這裏插入圖片描述
6、判斷結束
常見方法是指定迭代的代數,判斷迭代次數是否達到了閾值或者輸出誤差是否小於可接受的範圍。

代碼:

% BP網絡
% BP神經網絡的構建
net=newff([-1 2;0 5],[3,1],{'tansig','purelin'},'traingd')
net.IW{1}
net.b{1}

p=[1;2];
a=sim(net,p)
net=init(net);
net.IW{1}
net.b{1}
a=sim(net,p)
%net.IW{1}*p+net.b{1}
p2=net.IW{1}*p+net.b{1}
a2=sign(p2)
a3=tansig(a2)
a4=purelin(a3)
net.b{2}
net.b{1}

net.IW{1}
net.IW{2}
0.7616+net.b{2}
a-net.b{2}
(a-net.b{2})/ 0.7616
help purelin

p1=[0;0];
a5=sim(net,p1)
net.b{2}
% BP網絡
% BP神經網絡的構建
net=newff([-1 2;0 5],[3,1],{'tansig','purelin'},'traingd')
net.IW{1}
net.b{1}
%p=[1;];
p=[1;2];
a=sim(net,p)
net=init(net);
net.IW{1}
net.b{1}
a=sim(net,p)
net.IW{1}*p+net.b{1}
p2=net.IW{1}*p+net.b{1}
a2=sign(p2)
a3=tansig(a2)
a4=purelin(a3)
net.b{2}
net.b{1}




P=[1.2;3;0.5;1.6]
W=[0.3 0.6 0.1 0.8]
net1=newp([0 2;0 2;0 2;0 2],1,'purelin');
net2=newp([0 2;0 2;0 2;0 2],1,'logsig');
net3=newp([0 2;0 2;0 2;0 2],1,'tansig');
net4=newp([0 2;0 2;0 2;0 2],1,'hardlim');

net1.IW{1}
net2.IW{1}
net3.IW{1}
net4.IW{1}
net1.b{1}
net2.b{1}
net3.b{1}
net4.b{1}


net1.IW{1}=W;
net2.IW{1}=W;
net3.IW{1}=W;
net4.IW{1}=W;

a1=sim(net1,P)
a2=sim(net2,P)
a3=sim(net3,P)
a4=sim(net4,P)

init(net1);
net1.b{1}

help tansig

% 訓練
p=[-0.1 0.5]
t=[-0.3 0.4]
w_range=-2:0.4:2;
b_range=-2:0.4:2;

ES=errsurf(p,t,w_range,b_range,'logsig');%單輸入神經元的誤差曲面
plotes(w_range,b_range,ES)%繪製單輸入神經元的誤差曲面
pause(0.5);
hold off;
net=newp([-2,2],1,'logsig');
net.trainparam.epochs=100;
net.trainparam.goal=0.001;
figure(2);
[net,tr]=train(net,p,t);
title('動態逼近')
wight=net.iw{1}
bias=net.b
pause;
close;
% 練
p=[-0.2 0.2 0.3 0.4]
t=[-0.9 -0.2 1.2 2.0]
h1=figure(1);
net=newff([-2,2],[5,1],{'tansig','purelin'},'trainlm');
net.trainparam.epochs=100;
net.trainparam.goal=0.0001;
net=train(net,p,t);
a1=sim(net,p)
pause;
h2=figure(2);
plot(p,t,'*');
title('樣本')
title('樣本');
xlabel('Input');
ylabel('Output');
pause;
hold on;
ptest1=[0.2 0.1]
ptest2=[0.2 0.1 0.9]
a1=sim(net,ptest1);
a2=sim(net,ptest2);

net.iw{1}
net.iw{2}
net.b{1}
net.b{2}

運行結果:
在這裏插入圖片描述

三、感知器算法流程

1、 w,b權值初始化

2、 選取訓練數據
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20190929202851671.png
3、 如果
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20190929202901801.png
那麼
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20190929202924892.png
4、 轉至步驟2,直至訓練數據集中沒有誤分類點或滿足某個終止條件。

代碼:

% 第一章  感知器
% 1. 感知器神經網絡的構建
% 1.1  生成網絡
net=newp([0 2],1);%單輸入,輸入值爲[0,2]之間的數
inputweights=net.inputweights{1,1};%第一層的權重爲1
biases=net.biases{1};%閾值爲1
% 1.2  網絡仿真

net=newp([-2 2;-2 2],1);%兩個輸入,一個神經元,默認二值激活
net.IW{1,1}=[-1 1];%權重,net.IW{i,j}表示第i層網絡第j個神經元的權重向量
net.IW{1,1}
net.b{1}=1;
net.b{1}
p1=[1;1],a1=sim(net,p1)
p2=[1;-1],a2=sim(net,p2)
p3={[1;1] [1 ;-1]},a3=sim(net,p3) %兩組數據放一起
p4=[1 1;1 -1],a4=sim(net,p4)%也可以放在矩陣裏面
net.IW{1,1}=[3,4];
net.b{1}=[1];
a1=sim(net,p1)
% 1.3  網絡初始化
net=init(net);
wts=net.IW{1,1}
bias=net.b{1}
% 改變權值和閾值爲隨機數
net.inputweights{1,1}.initFcn='rands';
net.biases{1}.initFcn='rands';
net=init(net);
bias=net.b{1}
wts=net.IW{1,1}
a1=sim(net,p1)

% 2. 感知器神經網絡的學習和訓練
% 1 網絡學習
net=newp([-2 2;-2 2],1);
net.b{1}=[0];
w=[1 -0.8]
net.IW{1,1}=w;
p=[1;2];
t=[1];
a=sim(net,p)
e=t-a
help learnp
dw=learnp(w,p,[],[],[],[],e,[],[],[],[],[])
w=w+dw
net.IW{1,1}=w;
a=sim(net,p)


net = newp([0 1; -2 2],1);
P = [0 0 1 1; 0 1 0 1];
T = [0 1 1 1];
Y = sim(net,P)
net.trainParam.epochs = 20;
net = train(net,P,T);
Y = sim(net,P)


% 2 網絡訓練
net=init(net);
p1=[2;2];t1=0;p2=[1;-2];t2=1;p3=[-2;2];t3=0;p4=[-1;1];t4=1;
net.trainParam.epochs=1;
net=train(net,p1,t1)
w=net.IW{1,1}
b=net.b{1}
a=sim(net,p1)
net=init(net);
p=[[2;2] [1;-2] [-2;2] [-1;1]];
t=[0 1 0 1];
net.trainParam.epochs=1;
net=train(net,p,t);
a=sim(net,p)
net=init(net);
net.trainParam.epochs=2;
net=train(net,p,t);
a=sim(net,p)
net=init(net);
net.trainParam.epochs=20;
net=train(net,p,t);
a=sim(net,p)

% 3. 二輸入感知器分類可視化問題
P=[-0.5 1 0.5 -0.1;-0.5 1 -0.5 1];
T=[1 1 0 1]
net=newp([-1 1;-1 1],1);
plotpv(P,T);
plotpc(net.IW{1,1},net.b{1});
%hold on;
%plotpv(P,T);
net=adapt(net,P,T);
net.IW{1,1}
net.b{1}
plotpv(P,T);
plotpc(net.IW{1,1},net.b{1})
net.adaptParam.passes=3;
net=adapt(net,P,T);
net.IW{1,1}
net.b{1}
plotpc(net.IW{1},net.b{1})
net.adaptParam.passes=6;
net=adapt(net,P,T)
net.IW{1,1}
net.b{1}
plotpv(P,T);
plotpc(net.IW{1},net.b{1})

plotpc(net.IW{1},net.b{1})
%仿真
a=sim(net,p);
plotpv(p,a)

p=[0.7;1.2]
a=sim(net,p);
plotpv(p,a);
hold on;
plotpv(P,T);
plotpc(net.IW{1},net.b{1})
%感知器能夠正確分類,從而網絡可行。

% 4. 標準化學習規則訓練奇異樣本
P=[-0.5 -0.5 0.3 -0.1 -40;-0.5 0.5 -0.5 1.0 50]
T=[1 1 0 0 1];
net=newp([-40 1;-1 50],1);
plotpv(P,T);%標出所有點
hold on;
linehandle=plotpc(net.IW{1},net.b{1});%畫出分類線
E=1;
net.adaptParam.passes=3;%passes決定在訓練過程中訓練值重複的次數。
while (sse(E))
    [net,Y,E]=adapt(net,P,T);
    linehandle=plotpc(net.IW{1},net.b{1},linehandle);
    drawnow;
end;
axis([-2 2 -2 2]);
net.IW{1}
net.b{1}
%另外一種網絡修正學習(非標準化學習規則learnp)
hold off;
net=init(net);
net.adaptParam.passes=3;
net=adapt(net,P,T);
plotpc(net.IW{1},net.b{1});
axis([-2 2 -2 2]);
net.IW{1}
net.b{1}
%無法正確分類
%標準化學習規則網絡訓練速度要快!

% 訓練奇異樣本
% 用標準化感知器學習規則(標準化學習數learnpn)進行分類
net=newp([-40 1;-1 50],1,'hardlim','learnpn');
plotpv(P,T);
linehandle=plotpc(net.IW{1},net.b{1});
e=1;
net.adaptParam.passes=3;
net=init(net);
linehandle=plotpc(net.IW{1},net.b{1});
while (sse(e))
[net,Y,e]=adapt(net,P,T);
linehandle=plotpc(net.IW{1},net.b{1},linehandle);
end;
axis([-2 2 -2 2]);
net.IW{1}%權重
net.b{1}%閾值
%正確分類

 %非標準化感知器學習規則訓練奇異樣本的結果
net=newp([-40 1;-1 50],1);
net.trainParam.epochs=30;
net=train(net,P,T);
pause;
linehandle=plotpc(net.IW{1},net.b{1});
hold on;
plotpv(P,T);
linehandle=plotpc(net.IW{1},net.b{1});
axis([-2 2 -2 2]);

% 5. 設計多個感知器神經元解決分類問題
p=[1.0 1.2 2.0 -0.8; 2.0 0.9 -0.5 0.7]
t=[1 1 0 1;0 1 1 0]
plotpv(p,t);
hold on;
net=newp([-0.8 1.2; -0.5 2.0],2);
linehandle=plotpc(net.IW{1},net.b{1});
net=newp([-0.8 1.2; -0.5 2.0],2);
linehandle=plotpc(net.IW{1},net.b{1});
e=1;
net=init(net);
while (sse(e))
[net,y,e]=adapt(net,p,t);
linehandle=plotpc(net.IW{1},net.b{1},linehandle);
drawnow;
end;

運行結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章