BP神經網路之MATLAB@GUI篇

Timmy_Y發表於2016-12-10

設計BP神經網絡方法

使用BP神經網路解決問題時,需要一個訓練資料集,此外還需要確定以下引數:

(1)網路層數

BP網路可以包含1到多個隱層,單隱層前饋網路已具有很大的學習。因此對於大部分場合,單個隱層即可滿足需求。面對大資料,從增加模型複雜度角度來說,增加隱層數目比增加隱層神經節點數更有效,因為增加隱層數目不僅增加了擁有啟用函式的神經元數目,還增加了記過函式巢狀的層數。但隨著隱層數目增加,網路收斂難度加大,傳統BP演算法很難實現。

(2)輸入層節點數、輸出層節點個數

輸入層節點數取決於輸入向量的維數、輸出層節點數取決於目標結果。實際應用時,首先應將問題提煉出向量模型用於表述輸入、輸出。

(3)隱含層節點數

隱含層節點數的選擇對網路影響很大,數目較多會帶來更好的效能,但訓練難度也會變大,一般採用經驗公式估計節點數,例如:

a.M = 根號下(n+m)+a,n、m分別為輸入層、輸出層神經元個數,a是0到10之間常數

b.M = log2(n),n為輸入層神經元個數 

(4)傳遞函式選擇

一般隱含層使用Sigmoid函式,而輸出層使用線性函式。如果輸出層也採用Sigmoid函式,則輸出結果為[0,1]或[-1,1]。

(5)訓練函式選擇

針對不同型別問題,選擇不同訓練函式。例如對於包含數百個權值的迴歸問題,LM收斂速度快,誤差小。但LM佔用記憶體大,模式識別問題處理能力弱,RPROP是更好的選擇。(MATLAB中所有訓練函式在後文列出)

(7)初始權值賦值

引數的初始值對訓練過程有著重大的影響。對引數初始化的原則是:引數應該隨機初始化在能讓sigmoid函式線上性區域啟用的值。如果引數全部都很大,那sigmoid一開始就飽和了,這樣就會得到一個非常小的梯度值,那引數更新就會很慢,訓練也會很慢。如果引數太小了,那梯度也會很小,同樣也會導致訓練很慢。


下面進入正題:MATLABBP神經網路的使用提供強大的模擬工具,除了一些函式外,更直觀、簡單的就是GUI的使用,簡化了眾多引數的設定,使得設計、模擬過程更加簡單。


在命令介面輸入nnstart命令

有四個選項,分別解決不同問題:

1)迴歸問題

2)歸類問題(監督學習)

3)聚類問題(非監督學習)

4)非線性時間序列問題

此外,GUI介面的BP網路隱含層只有1層,不能修改。


選擇Fitting app

接下來是輸入資料,可以選擇自己已經匯入工作空間的資料,或者使用load example data set匯入matlab的一些預設實驗資料,我這裡選擇bodyfat,根據人體的年齡、身高、體重等個13個輸入資訊預測肥胖係數。輸入資料大小13*253,輸出資料大小1*253

接下來是訓練資料、修正資料、測試資料的比重。修正資料的作用是對訓練結果作一定調整,提升泛化能力,防止過擬合,GUI內訓練資料比重是不能調整的,其他兩個可以。

選擇隱含層神經元結點數(預設為10)


選擇訓練方法,提供了3種方式,預設為LM演算法。

此外,MATLAB提供了多種資料訓練方式,在CODE模式下均可使用。LM演算法訓練資料通常是最快的,同樣BFGS quasi-Newton演算法速度也很快;但當資料規模較大時,這兩種演算法由於佔用記憶體較大效率較低,此時SCG(分類問題)和RP演算法是更好的選擇;當資料規模較小且包含噪聲時,可以選擇BR演算法。

有關這些學習演算法的詳細對比可以在matlab中搜尋Choose a Multilayer Neural Network Training Function


訓練完畢後,可以繪製迴歸曲線還有誤差直方圖。

迴歸曲線描述了網路對訓練資料、修正資料、測試資料的擬合能力,理想情況下45°直線代表輸出和目標完全相同。

誤差直方圖描述了不同誤差對應點數的分佈情況。可以根據直方圖對資料做一些評價,例如:

(1)如果部分訓練資料(佔比很少)偏離中心較多,則可認為這部分資料可能是有錯誤的

(2)如果修正資料大部分集中在邊緣,則說明原資料的過於重複,不具備泛化能力,可能需要新增更多資料,重新訓練

如果對以上評價結果不滿意的話,可以重新訓練,調整學習方法,增加隱層節點數,增加資料量等。


最後可以將GUI做所的事情轉換為程式碼,方便閱讀:

Codegeneration將給出所訓練神經網路的權重係數,可以檢視網路的結構。

Generate Scripts是將GUI執行命令轉換為程式碼,方便學習相應的函式。


Generate Scripts產生的程式碼如下:

% This script assumes these variables are defined:
%
%   bodyfatInputs - input data.
%   bodyfatTargets - target data.

x = bodyfatInputs;
t = bodyfatTargets;

% Choose a Training Function
% For a list of all training functions type: help nntrain
% 'trainlm' is usually fastest.
% 'trainbr' takes longer but may be better for challenging problems.
% 'trainscg' uses less memory. NFTOOL falls back to this in low memory situations.
trainFcn = 'trainlm';  % Levenberg-Marquardt

% Create a Fitting Network
hiddenLayerSize = 10;
net = fitnet(hiddenLayerSize,trainFcn);

% Setup Division of Data for Training, Validation, Testing
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;

% Train the Network
[net,tr] = train(net,x,t);

% Test the Network
y = net(x);
e = gsubtract(t,y);
performance = perform(net,t,y)

% View the Network
view(net)

執行一下Generate Scripts程式碼,得到:

Algorithms中描述了資料分組方式、訓練方法以及評級函式。Process中描述了迭代次數、耗費時間、修正次數、初始誤差/結束誤差、初始梯度/結束梯度等。其中可以設定最大迭代次數、最小誤差、最小梯度都可以作為訓練神經網路的結束條件,在CODE模式都可以執行。

 

CODE執行的好處在於可以檢視迭代過程中誤差、梯度等變化情況,例如誤差圖:


如有問題,敬請指正~





相關文章