1. 程式人生 > >在MATLAB中BP神經網路表示式

在MATLAB中BP神經網路表示式

在MATLAB中,我們可以如此構建一個神經網路 
%使用用輸入輸出資料(inputData、outputData)建立網路,
%隱節點個數設為3.其中隱層、輸出層的傳遞函式分別為tansig和purelin,使用trainlm方法訓練。
net =newff(inputData,outputData,3,{'tansig','purelin'},'trainlm');
%設定一些常用引數
net.trainparam.goal =0.00001; %訓練目標:均方誤差低於0.0001
net.trainparam.show =400;   %每訓練400次展示一次結果
net.trainparam.epochs =15000;  %最大訓練次數:15000.
net.divideFcn = '';
[net,tr] =train(net,inputData,outputData);%呼叫matlab神經網路工具箱自帶的train函式訓練網路

其中,隱藏層節點是3,我選取較簡單的輸入層節點為2,輸出層節點是 1來構建網路。

訓練好網路後,可用sim函式來執行Simulink模型,可通過輸入預測輸出,例如:

input=[4000;20]
simout =sim(net,input); %呼叫matlab神經網路工具箱自帶的sim函式得到網路的預測值

當然,input可以是多組資料組成的矩陣,也可以是一組資料組成的向量,如此便可得到預測值。

有的時候,我們需要提取已訓練好的神經網路,我們可以把它的權值,閾值匯出,如下程式碼,可提取出權值閾值的值。

w12 = net.iw{1,1} %第1層(輸入層)到第2層(隱層)的權值
b2 = net.b{1}    %第2層(隱層)的閾值
w23 = net.lw{2,1} %第2層(輸入層)到第3層(輸出層)的權值
b3 = net.b{2}    %第3層(輸出層)的閾值

結果如下:


得到權值與閾值的值後,我們要代入表示式中,

由於之前構建網路選用的啟用函式是tandig ,purelin,預測結果的數學表示式如下:


代表這個權值是第2層的第1個節點到第3層的第1個節點的權值。

在MATLAB中,我將上式整理為如下形式:

simy=purelin(w23*tansig(w12*[a;b]+b2)+b3)

其中a,b是輸入的兩個數。

w23 ,w12 ,b2,b3為上邊提取的權值閾值矩陣。

因為版本問題,newff函式有不同的用法,區別如下:

net =newff(inputData,outputData,3,{'tansig','purelin'},'trainlm');% 新
net =newff(minmax(inputData),[3 1],{'tansig','purelin'},'trainlm'); %舊
上邊兩種用法,新用法自帶歸一化,構建網路時,自動根據輸入輸出歸一化了,舊用法需要手動歸一化。

因為新版本自帶歸一化,新版本網路中的權值和閾值都是對於歸一化後的資料,因此,在運用神經網路數學表示式時,需要在之前把輸入歸一化,在之後把輸出反歸一化。

歸一化方法為
y=(ymax-ymin)*(x-xmin)/(xmax-xmin)+ymin

y是歸一化後資料,x是歸一化前資料,反歸一化公式為:

x=(y-ymin)*(xmax-xmin)/(ymax-ymin)+xmin

因為神經網路選擇的是歸一化到(-1,1),所以,ymin=-1.ymax=1,輸入和輸出都是如此。

可寫成如下,便可得到數學表示式用輸入預測輸出,結果與sim函式一致。

a=2*(a-amin)/(amax-amin)-1;
b=2*(b-bmin)/(bmax-bmin)-1;
simy=purelin(w23*tansig(w12*[a;b]+b2)+b3)
simy=(simy+1)*(simymax-simymin)/2+simymin

為何要提取表示式呢,有的時候,在MATLAB上很方便的訓練好網路後,可直接利用訓練好的權值閾值在其他工具上使用。