1. 程式人生 > >matlab的BP神經網路例子程式

matlab的BP神經網路例子程式




1. BP神經網路的設計例項 
  
例1.
採用動量梯度下降演算法訓練BP 網路。 
訓練樣本定義如下: 
輸入向量為     
p =[-1 -2 3  1;-1  1 5 -3] 
目標向量為   t = [-1 -1 1 1] 
解:本例的 MATLAB 程式如下:  

close all  
clear  
echo on  
clc
  
% NEWFF——生成一個新的前向神經網路  
% TRAIN——對 BP 神經網路進行訓練  
% SIM——對 BP 神經網路進行模擬  
pause         
%  敲任意鍵開始  
clc  
%  定義訓練樣本  
% P 為輸入向量  
P=[-1,  -2,    3,    1;       -1,    1,    5,  -3]; 
% T 為目標向量  
T=[-1, -1, 1, 1];  
pause;  
clc
  
%  建立一個新的前向神經網路  
net=newff(minmax(P),[3,1],{'tansig','purelin'},'traingdm') 
%  當前輸入層權值和閾值  
inputWeights=net.IW{1,1}  
inputbias=net.b{1}  
%  當前網路層權值和閾值  
layerWeights=net.LW{2,1}  
layerbias=net.b{2}  
pause  
clc
  
%  設定訓練引數  
net.trainParam.show = 50;  
net.trainParam.lr = 0.05;  
net.trainParam.mc = 0.9;  
net.trainParam.epochs = 1000;  
net.trainParam.goal = 1e-3;  
pause  
clc
  
%  呼叫 TRAINGDM 演算法訓練 BP 網路  
[net,tr]=train(net,P,T);  
pause  
clc
  
%  對 BP 網路進行模擬  
A = sim(net,P)  
%  計算模擬誤差  
E = T - A  
MSE=mse(E)  
pause  
clc  
echo off
  


例2. 採用貝葉斯正則化演算法提高 BP 網路的推廣能力。在本例中,我們採用兩種訓練方法,即 L-M 優化演算法(trainlm)和貝葉斯正則化演算法(trainbr),用以訓練 BP 網路,使其能夠擬合某一附加有白噪聲的正弦樣本資料。其中,樣本資料可以採用如下MATLAB 語句生成:  
輸入向量:P = [-1:0.05:1];  
目標向量:randn(’seed’,78341223);  
T = sin(2*pi*P)+0.1*randn(size(P));  
解:本例的 MATLAB 程式如下:  
close all  
clear  
echo on  
clc  
% NEWFF——生成一個新的前向神經網路  
% TRAIN——對 BP 神經網路進行訓練 
% SIM——對 BP 神經網路進行模擬  
pause         
%  敲任意鍵開始  
clc  
%  定義訓練樣本向量  
% P 為輸入向量  
P = [-1:0.05:1];  
% T 為目標向量  
randn('seed',78341223); T = sin(2*pi*P)+0.1*randn(size(P));  
%  繪製樣本資料點  
plot(P,T,'+');  
echo off  
hold on;  
plot(P,sin(2*pi*P),':');
         
%  繪製不含噪聲的正弦曲線  
echo on  
clc  
pause  
clc
  
%  建立一個新的前向神經網路  
net=newff(minmax(P),[20,1],{'tansig','purelin'});  
pause  
clc  
echo off  
clc 
disp('1.  L-M 優化演算法 TRAINLM'); disp('2.  貝葉斯正則化演算法 TRAINBR');  
choice=input('請選擇訓練演算法(1,2):');  
figure(gcf);  
if(choice==1)
                  
    echo on          
    clc
          
    %  採用 L-M 優化演算法 TRAINLM  
    net.trainFcn='trainlm';          
    pause          
    clc          
    %  設定訓練引數          
    net.trainParam.epochs = 500;          
    net.trainParam.goal = 1e-6;          
    net=init(net);         
    %  重新初始化            
    pause          
    clc 
elseif(choice==2)          
    echo on          
    clc
          
    %  採用貝葉斯正則化演算法 TRAINBR          
    net.trainFcn='trainbr';          
    pause          
    clc
          
    %  設定訓練引數          
    net.trainParam.epochs = 500;          
    randn('seed',192736547);          
    net = init(net);
         
    %  重新初始化            
    pause          
    clc          
end
   
  
  

例2. % 呼叫相應演算法訓練 BP 網路 
[net,tr]=train(net,P,T); 
pause 
clc
 
% 對 BP 網路進行模擬 
A = sim(net,P); 
% 計算模擬誤差 
E = T - A; 
MSE=mse(E) 
pause 
clc
 
% 繪製匹配結果曲線 
close all; 
plot(P,A,P,T,'+',P,sin(2*pi*P),':'); 
pause; 
clc 
echo off
 


        通過採用兩種不同的訓練演算法,我們可以得到兩種擬合結果。圖中的實線表示擬合曲線,虛線代表不含白噪聲的正弦曲線,“+”點為含有白噪聲的正弦樣本資料點。顯然,經 trainlm 函式訓練後的神經網路對樣本資料點實現了“過度匹配”,而經 trainbr 函式訓練的神經網路對噪聲不敏感,具有較好的推廣能力。  

          值得指出的是,在利用 trainbr 函式訓練 BP 網路時,若訓練結果收斂,通常會給出提示資訊“Maximum MU reached”。此外,使用者還可以根據 SSE 和 SSW 的大小變化情況來判斷訓練是否收斂:當 SSE 和 SSW 的值在經過若干步迭代後處於恆值時,則通常說明網路訓練收斂,此時可以停止訓練。觀察trainbr 函式訓練 BP 網路的誤差變化曲線,可見,當訓練迭代至 320 步時,網路訓練收斂,此時 SSE 和 SSW 均為恆值,當前有效網路的引數(有效權值和閾值)個數為 11.7973。 
例3 採用“提前停止”方法提高 BP 網路的推廣能力。對於和例 2相同的問題,在本例中我們將採用訓練函式 traingdx 和“提前停止”相結合的方法來訓練 BP 網路,以提高 BP 網路的推廣能力。 
解:在利用“提前停止”方法時,首先應分別定義訓練樣本、驗證樣本或測試樣本,其中,驗證樣本是必不可少的。在本例中,我們只定義並使用驗證樣本,即有 
驗證樣本輸入向量:val.P = [-0.975:.05:0.975] 
驗證樣本目標向量:val.T = sin(2*pi*val.P)+0.1*randn(size(val.P)) 
        值得注意的是,儘管“提前停止”方法可以和任何一種 BP 網路訓練函式一起使用,但是不適合同訓練速度過快的演算法聯合使用,比如 trainlm 函式,所以本例中我們採用訓練速度相對較慢的變學習速率演算法 traingdx 函式作為訓練函式。 
本例的 MATLAB 程式如下: 
close all 
clear 
echo on 
clc 
% NEWFF——生成一個新的前向神經網路 
% TRAIN——對 BP 神經網路進行訓練 
% SIM——對 BP 神經網路進行模擬 
pause 
% 敲任意鍵開始 
clc 
% 定義訓練樣本向量 
% P 為輸入向量 
P = [-1:0.05:1]; 
% T 為目標向量 
randn('seed',78341223); 
T = sin(2*pi*P)+0.1*randn(size(P));
 
% 繪製訓練樣本資料點 
plot(P,T,'+'); 
echo off 
hold on; 
plot(P,sin(2*pi*P),':'); % 繪製不含噪聲的正弦曲線 
echo on 
clc 
pause 
clc
 
% 定義驗證樣本 
val.P = [-0.975:0.05:0.975]; % 驗證樣本的輸入向量 
val.T = sin(2*pi*val.P)+0.1*randn(size(val.P)); % 驗證樣本的目標向量 
pause 
clc 
% 建立一個新的前向神經網路 
net=newff(minmax(P),[5,1],{'tansig','purelin'},'traingdx'); 
pause 
clc
 
% 設定訓練引數 
net.trainParam.epochs = 500; 
net = init(net); 
pause 
clc
 
% 訓練 BP 網路 
[net,tr]=train(net,P,T,[],[],val); 
pause 
clc 
% 對 BP 網路進行模擬 
A = sim(net,P); 
% 計算模擬誤差 
E = T - A; 
MSE=mse(E) 
pause 
clc
 
% 繪製模擬擬合結果曲線 
close all; 
plot(P,A,P,T,'+',P,sin(2*pi*P),':'); 
pause; 
clc 
echo off 


          下面給出了網路的某次訓練結果,可見,當訓練至第 136 步時,訓練提前停止,此時的網路誤差為 0.0102565。給出了訓練後的模擬資料擬合曲線,效果是相當滿意的。 
[net,tr]=train(net,P,T,[],[],val); 
TRAINGDX, Epoch 0/500, MSE 0.504647/0, Gradient 2.1201/1e-006 
TRAINGDX, Epoch 25/500, MSE 0.163593/0, Gradient 0.384793/1e-006 
TRAINGDX, Epoch 50/500, MSE 0.130259/0, Gradient 0.158209/1e-006 
TRAINGDX, Epoch 75/500, MSE 0.086869/0, Gradient 0.0883479/1e-006 
TRAINGDX, Epoch 100/500, MSE 0.0492511/0, Gradient 0.0387894/1e-006 
TRAINGDX, Epoch 125/500, MSE 0.0110016/0, Gradient 0.017242/1e-006 
TRAINGDX, Epoch 136/500, MSE 0.0102565/0, Gradient 0.01203/1e-006 
TRAINGDX, Validation stop.