在MATLAB中BP神經網路表示式
阿新 • • 發佈:2019-01-06
在MATLAB中,我們可以如此構建一個神經網路
當然,input可以是多組資料組成的矩陣,也可以是一組資料組成的向量,如此便可得到預測值。
結果如下:
其中a,b是輸入的兩個數。
%使用用輸入輸出資料(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上很方便的訓練好網路後,可直接利用訓練好的權值閾值在其他工具上使用。