人工智能3—BP神經網絡

目錄

 

一、神經網絡

二、BP神經網絡

1.什麼是BP神經網絡

2.BP神經網絡的原理

3.BP神經網絡的算法流程

4.優缺點

5.代碼運行結果圖

6.代碼解析


一、神經網絡

神經網絡也被稱爲人工神經網絡(Artificial Neural Network,ANN),是可科學家們在對神經元、神經系統有了進一步認識的基礎上,通過藉助數學和物理的方法從信息處理的角度對人腦神經網絡進行抽象後建立的簡化模型。

生物學中,神經系統的基本單元是神經元,神經元由一個細胞體和突組成,突又分爲兩類,樹突和軸突,人工神經網絡就是模擬神經元的組成,可把ANN看成是以處理單元爲節點,用加權有向弧相互連成的有向圖,如下圖示。輸入層就是樹突,接受輸入的信號;加權和就是細胞體,加工和處理信號;閾值函數(激活函數)就是軸突,控制輸出;輸出層就是突觸,輸出結果。

二、BP神經網絡

1.什麼是BP神經網絡

人工神經網絡可以分爲很多種類型,BP(Back Propagation)神經網絡就是其中應用比較廣泛的一種,全稱爲“後向傳播學習的前饋型神經網絡”。BP神經網絡是一種多層的前饋神經網絡,信號是前向傳播的,而誤差是反向傳播的。在BP神經網絡中,後向傳播是一種學習算法,體現爲訓練過程,該過程是需要監督學習的;前饋型網絡是一種結構,體現爲網絡框架。

2.BP神經網絡的原理

BP神經網絡分爲訓練和使用兩個階段。

訓練:根據給定樣本,使用適當的學習算法(如後向傳播學習算法)調整某種結構的網絡(如前饋型神經網絡結構)的網絡參數(層數、偏置值、神經元個數等),使得被訓練的網絡能夠對樣本有很好的擬合作用。

也就是:(1)在處理樣本的時候,從輸入層輸入,向前把結果輸出到第一隱含層

(2)第一隱含層將接收到的數據處理後作爲輸出,該輸出爲第二隱含層的輸入,以此類推

(3)直到輸出層輸出

再看反向傳播:(1)比較隱含層的實際輸出和預期結果,得到誤差

(2)通過相關的誤差方程式調整最後一個隱含層到輸出層之間的網絡權重

(3)從最後一個隱含層向倒數第二隱含層進行誤差反饋,調整各層之間的網絡權重,以此類推

(4)直到輸入層和第一隱含層之間的網絡權重調整好爲止

使用:採用已經訓練好的神經網絡,對一些未知結果的輸入進行運算,得到輸出,一般情況下都是先訓練後使用,一旦訓練結束就可以長期使用。

 

3.BP神經網絡的算法流程

輸入:網絡結構參數(層數、結點數等);訓練數據集
輸出:網絡權值與閾值

(1)初始化網絡權值
(2)向前傳播輸入:當某個具體樣本作用在輸入端後 ,計算每個神經元的輸出,即一個信號從輸入到隱層再到輸出
(3)反向誤差傳播:在輸出層得到實際輸出,比較預期輸出得到誤差,反向向前傳播,依次得到最後一個隱含層到第一個隱含層每個神經元的誤差

(4)網絡權重與神經元偏置調整:一邊後向傳播誤差,一邊調整網絡權重和神經元閾值。

(5)判斷結束:如果最終的輸出誤差小於可接受的範圍或迭代次數達到一定的閾值,則選取下一個樣本,重複步驟2;否則迭代次數加1,然後轉向步驟2繼續使用當前樣本進行訓練。

4.優缺點

(1)優點:非線性映射能力,自學習和自適應能力,將學習成果應用於新知識的泛化能力,一定的容錯能力

(2)缺點:BP 算法的本質是梯度下降法 ,它所要的最小化目標函數非常複雜 ,算法可能陷入目標函數的局部最小點 ,不能保證收斂到全局最優點 ,所以BP 算法是低效的。

5.代碼運行結果圖

 

 

 

 

 

 

 

 

 

6.代碼解析

ps:代碼(不是自己寫的)無誤,理解有誤的請指出。

(1)net = newff(PR,[s1,s2...sn],{tf1,tf2...tfn},BTF,BLF,PF) 生成bp神經網絡
 PR:爲網絡輸入取向量取值範圍的矩陣
[s1,s2..sn]:各層的神經元個數
[tf1,tf2...tfn]:隱含層和輸出層神經元傳遞函數
BTF:訓練函數
BLF:網絡權值學習函數,默認爲learngdm
PF:性能數,默認爲mse

(2)tansig雙曲正切S型傳遞函數,將淨輸入轉換爲淨輸出。
A = tansig(N,FP) 淨輸出
N:淨輸入,矩陣列向量
FP:函數的參數結構

(3)  newp生成感知機神經網絡 net = newp(PR,S,TF,LF) 
PR爲一個R2的矩陣,由R組輸入向量中的最大值和最小值組成
S表示神經元的個數
TF表示感知器的激活函數,缺省值爲硬限幅激活函數hardlim
LF表示網絡的學習函數,缺省值爲learnp 

% net = newff(PR,[s1,s2...sn],{tf1,tf2...tfn},BTF,BLF,PF) 生成bp神經網絡
% PR:爲網絡輸入取向量取值範圍的矩陣
% [s1,s2..sn]:各層的神經元個數
% [tf1,tf2...tfn]:隱含層和輸出層神經元傳遞函數
% BTF:訓練函數
% BLF:網絡權值學習函數,默認爲learngdm
% PF:性能數,默認爲mse

% tansig雙曲正切S型傳遞函數,將淨輸入轉換爲淨輸出。
% A = tansig(N,FP) 淨輸出
% N:淨輸入,矩陣列向量
% FP:函數的參數結構

% purelin 線性傳遞函數,輸入輸出可取任意值

%訓練中隱含層傳遞函數用tansig(比logsig誤差小),輸出層選用purelin

net=newff([-1 2;0 5],[3,1],{'tansig','purelin'},'traingd')

%中間層到輸出層的權值
net.IW{1}

%輸出層各神經元閾值
net.b{1}

%matlab中定義輸入p
p=[1;2];

%sim動態系統仿真 使用參數名稱-值對組對指定模型仿真 得到仿真預測值
a=sim(net,p)

%init初始化神經網絡  返回神經網絡的權值和誤差
net=init(net);

net.IW{1}
net.b{1}
a=sim(net,p)

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}

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}

P=[1.2;3;0.5;1.6]
W=[0.3 0.6 0.1 0.8]

%newp生成感知機神經網絡 net = newp(PR,S,TF,LF) 
%PR爲一個R2的矩陣,由R組輸入向量中的最大值和最小值組成
%S表示神經元的個數
%TF表示感知器的激活函數,缺省值爲硬限幅激活函數hardlim
%LF表示網絡的學習函數,缺省值爲learnp 
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輸入 T輸出
p=[-0.1 0.5]
t=[-0.3 0.4]

%range創建一個包含指定範圍的元素的數組 返回從low到high之間的元素數組
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使調用進程(或線程)進入休眠狀態,直到傳遞的信號終止進程或導致調用信號捕獲函數
pause(0.5);

%hold off 使當前軸及圖形不在具備被刷新的性質
hold off;
net=newp([-2,2],1,'logsig');

%設置網絡的訓練參數
%net.trainParam.epochs―最大收斂次數
%net.trainParam.goal―收斂誤差
net.trainparam.epochs=100;
net.trainparam.goal=0.001;

%figure是建立圖形,figure(2)就是第一第二副圖
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}

 

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