2016-01-29 76 views
2

我想爲分配創建雙層感知器。
它將作爲Fisher虹膜數據集的分類器。如何在Matlab中爲多類數據集創建多層感知器

我已經遇到了以下問題而創建網絡:

  • 對於像上述的數據集,可以我安裝網絡與單個 輸入,並通過n行的整個訓練矩陣和4個功能爲 一個輸入值?或者,我是否需要調整網絡使用4個輸入 節點,每個功能1個,並將訓練矩陣作爲輸入值 值?
  • 此外,我該如何正確地將各層連接起來?
    例如,當我使用 網絡命令創建帶有4個輸入的感知器時,我並不真正瞭解biasConnect,inputConnect和layerConnect實際上做了什麼。
  • 最後,我需要多少輸出才能正確分類一個元素? 我遇到的每個例子都使用一個輸出,但是,只需要一個 就足夠了?或者,每個班級都需要一個嗎?

命令用於創建第二點提到的網絡:

net = network(4, 2, [1; 0], [1 1 1 1;0 0 0 0], [0 0; 1 0], [0 1]); 

回答

3

讓我們開始與網絡連接。 network函數的工作方式並不直觀。爲了如果你輸入向量正確描述結構來控制,你可以使用view(net)

enter image description here

現在我們討論的每個參數不久:

numInputs - 如果你的網絡將只得到一個輸入數據集,您需要在這裏輸入1

numLayers - 對於虹膜數據集,可以在這裏使用2

biasConnect - 偏置單位用於「增加」輸入和輸出之間的非線性。我們希望網絡能夠近似複雜的非線性函數,這就是爲什麼向兩個圖層添加偏差單位是一個好主意。所以放在這裏[1, 1]

inputConnect - 矢量的尺寸爲numLayers-by-numInputs。它顯示哪些輸入連接到哪些層。你只有一個輸入連接到第一層,所以在這裏放[1;0]

layerConnect - 矢量的尺寸爲numLayers-by-numLayers。你有兩層。第一層連接到第二層,但不連接到它自己。從第二層到第一層沒有連接,第二層不會自動饋送。把[0 0; 1 0]放在這裏。

outputConnect - 矢量的尺寸爲1-by-numLayers並顯示哪一層連接到輸出。把[0 1]放在這裏。

這裏是我們的命令和相應的圖形:

net = network(1, 2, [1; 1], [1;0], [0 0; 1 0], [0 1]); 

enter image description here

您可以嘗試使用的參數和所產生的結構是非常複雜的。

網絡配置

現在,您需要配置網絡。您可以在文檔中找到所有參數,我將在這裏描述最重要的部分:

  1. 爲層設置正確的激活函數很重要。默認情況下,該功能設置爲purelin。你可能想在這裏使用像tansiglogsig

  2. 您需要設置每個圖層的大小。在你的情況下,我會在第一層使用5或7個單位。第二層的大小應該等於輸出類的數量:3你的情況。

  3. 權重和偏置單元的初始化函數也應該爲每個層設置。

產生的網絡看起來像在這裏:

enter image description here

下面是代碼:

net = network(1, 2, [1; 1], [1;0], [0 0; 1 0], [0 1]); 

net.adaptFcn = 'adaptwb'; 
net.divideFcn = 'dividerand'; %Set the divide function to dividerand (divide training data randomly). 

net.performFcn = 'mse'; 
net.trainFcn = 'trainlm'; % set training function to trainlm (Levenberg-Marquardt backpropagation) 

net.plotFcns = {'plotperform', 'plottrainstate', 'ploterrhist', 'plotconfusion', 'plotroc'}; 

%set Layer1 
net.layers{1}.name = 'Layer 1'; 
net.layers{1}.dimensions = 7; 
net.layers{1}.initFcn = 'initnw'; 
net.layers{1}.transferFcn = 'tansig'; 

%set Layer2 
net.layers{2}.name = 'Layer 2'; 
net.layers{2}.dimensions = 3; 
net.layers{2}.initFcn = 'initnw'; 
net.layers{2}.transferFcn = 'tansig'; 

[x,t] = iris_dataset; %load of the iris data set 
net = train(net,x, t); %training 

y = net(x); %prediction 

view(net); 

的混淆矩陣看起來不錯。所以網絡運作良好!

enter image description here

一點點shoter方式

如果你想使用一個已經預裝的網絡,您可以使用此代碼:

[x,t] = iris_dataset; 
net = patternnet; 
net = configure(net,x,t); 

net = train(net,x,t); %training 
view(net); 

y = net(x); %predict 
+0

謝謝你這麼多的時間,你花了這些,我真的很感激它 – Izanagi