MATLAB 神经网络模板
神經網絡模型有很多種類,MATLAB都有現成的函數。我只學了最簡單的一種bp網絡,寫個模板方便后來使用。
以下引用了大神博客里的一篇文章:
1. 數據預處理?
在訓練神經網絡前一般需要對數據進行預處理,一種重要的預處理手段是歸一化處理。下面簡要介紹歸一化處理的原理與方法。
(1) 什么是歸一化??
數據歸一化,就是將數據映射到[0,1]或[-1,1]區間或更小的區間,比如(0.1,0.9) 。
(2) 為什么要歸一化處理??
<1>輸入數據的單位不一樣,有些數據的范圍可能特別大,導致的結果是神經網絡收斂慢、訓練時間長。
<2>數據范圍大的輸入在模式分類中的作用可能會偏大,而數據范圍小的輸入作用就可能會偏小。
<3>由于神經網絡輸出層的激活函數的值域是有限制的,因此需要將網絡訓練的目標數據映射到激活函數的值域。例如神經網絡的輸出層若采用S形激活函數,由于S形函數的值域限制在(0,1),也就是說神經網絡的輸出只能限制在(0,1),所以訓練數據的輸出就要歸一化到[0,1]區間。
<4>S形激活函數在(0,1)區間以外區域很平緩,區分度太小。例如S形函數f(X)在參數a=1時,f(100)與f(5)只相差0.0067。
(3) 歸一化算法?
一種簡單而快速的歸一化算法是線性轉換算法。線性轉換算法常見有兩種形式:
<1>y = ( x - min )/( max - min )
其中min為x的最小值,max為x的最大值,輸入向量為x,歸一化后的輸出向量為y 。上式將數據歸一化到 [ 0 , 1 ]區間,當激活函數采用S形函數時(值域為(0,1))時這條式子適用。
<2>y = 2 * ( x - min ) / ( max - min ) - 1
這條公式將數據歸一化到 [ -1 , 1 ] 區間。當激活函數采用雙極S形函數(值域為(-1,1))時這條式子適用。
(4) Matlab數據歸一化處理函數?
Matlab中歸一化處理數據可以采用premnmx , postmnmx , tramnmx 這3個函數。
<1> premnmx
語法:[pn,minp,maxp,tn,mint,maxt] = premnmx(p,t)
參數:
pn: p矩陣按行歸一化后的矩陣
minp,maxp:p矩陣每一行的最小值,最大值
tn:t矩陣按行歸一化后的矩陣
mint,maxt:t矩陣每一行的最小值,最大值
作用:將矩陣p,t歸一化到[-1,1] ,主要用于歸一化處理訓練數據集。
<2> tramnmx
語法:[pn] = tramnmx(p,minp,maxp)
參數:
minp,maxp:premnmx函數計算的矩陣的最小,最大值
pn:歸一化后的矩陣
作用:主要用于歸一化處理待分類的輸入數據。
<3> postmnmx
語法: [p,t] = postmnmx(pn,minp,maxp,tn,mint,maxt)
參數:
minp,maxp:premnmx函數計算的p矩陣每行的最小值,最大值
mint,maxt:premnmx函數計算的t矩陣每行的最小值,最大值
作用:將矩陣pn,tn映射回歸一化處理前的范圍。postmnmx函數主要用于將神經網絡的輸出結果映射回歸一化前的數據范圍。
2. 使用Matlab實現神經網絡?
使用Matlab建立前饋神經網絡主要會使用到下面3個函數:
newff :前饋網絡創建函數
train:訓練一個神經網絡
sim :使用網絡進行仿真
下面簡要介紹這3個函數的用法。
(1) newff函數
<1>newff函數語法?
newff函數參數列表有很多的可選參數,具體可以參考Matlab的幫助文檔,這里介紹newff函數的一種簡單的形式。
語法:net = newff ( A, B, {C} ,‘trainFun’)
參數:
A:一個n×2的矩陣,第i行元素為輸入信號xi的最小值和最大值;
B:一個k維行向量,其元素為網絡中各層節點數;
C:一個k維字符串行向量,每一分量為對應層神經元的激活函數;
trainFun :為學習規則采用的訓練算法。
<2>常用的激活函數
常用的激活函數有:
a) 線性函數?(Linear transfer function)
f(x) = x
該函數的字符串為’purelin’。
b) 對數S形轉移函數( Logarithmic sigmoid transfer function )
該函數的字符串為’logsig’。
c) 雙曲正切S形函數?(Hyperbolic tangent sigmoid transfer function )
也就是上面所提到的雙極S形函數。
該函數的字符串為’ tansig’。
Matlab的安裝目錄下的toolbox\nnet\nnet\nntransfer子目錄中有所有激活函數的定義說明。
<3>常見的訓練函數
常見的訓練函數有:
traingd :梯度下降BP訓練函數(Gradient descent backpropagation)
traingdx :梯度下降自適應學習率訓練函數
<4>網絡配置參數
一些重要的網絡配置參數如下:
net.trainparam.goal ?:神經網絡訓練的目標誤差
net.trainparam.show ??: 顯示中間結果的周期
net.trainparam.epochs :最大迭代次數
net.trainParam.lr ?? : 學習率
(2) train函數
網絡訓練學習函數。
語法:[ net, tr, Y1, E ]? = train( net, X, Y )
參數:
X:網絡實際輸入
Y:網絡應有輸出
tr:訓練跟蹤信息
Y1:網絡實際輸出
E:誤差矩陣
(3) sim函數
語法:Y=sim(net,X)
參數:
net:網絡
X:輸入給網絡的K×N矩陣,其中K為網絡輸入個數,N為數據樣本數
Y:輸出矩陣Q×N,其中Q為網絡輸出個數
(4) Matlab BP網絡實例?
我將Iris數據集分為2組,每組各75個樣本,每組中每種花各有25個樣本。其中一組作為以上程序的訓練樣本,另外一組作為檢驗樣本。為了方便訓練,將3類花分別編號為1,2,3 。
使用這些數據訓練一個4輸入(分別對應4個特征),3輸出(分別對應該樣本屬于某一品種的可能性大小)的前向網絡。
Matlab程序如下:
%讀取訓練數據 [f1,f2,f3,f4,class] = textread('trainData.txt' , '%f%f%f%f%f',150);%特征值歸一化 [input,minI,maxI] = premnmx( [f1 , f2 , f3 , f4 ]') ;%構造輸出矩陣 s = length( class) ; output = zeros( s , 3 ) ; for i = 1 : soutput( i , class( i ) ) = 1 ; end%創建神經網絡 net = newff( minmax(input) , [10 3] , { 'logsig' 'purelin' } , 'traingdx' ) ;%設置訓練參數 net.trainparam.show = 50 ; net.trainparam.epochs = 500 ; net.trainparam.goal = 0.01 ; net.trainParam.lr = 0.01 ;%開始訓練 net = train( net, input , output' ) ;%讀取測試數據 [t1 t2 t3 t4 c] = textread('testData.txt' , '%f%f%f%f%f',150);%測試數據歸一化 testInput = tramnmx ( [t1,t2,t3,t4]' , minI, maxI ) ;%仿真 Y = sim( net , testInput )%統計識別正確率 [s1 , s2] = size( Y ) ; hitNum = 0 ; for i = 1 : s2[m , Index] = max( Y( : , i ) ) ;if( Index == c(i) )hitNum = hitNum + 1 ;end end sprintf('識別率是 %3.3f%%',100 * hitNum / s2 )注意:
1、歸一化:
premnmx函數用于將網絡的輸入數據或輸出數據進行歸一化,歸一化后的數據將分布在[-1,1]區間內。
premnmx語句的語法格式是:[Pn,minp,maxp,Tn,mint,maxt]=premnmx(P,T),其中P,T分別為原始輸入和輸出數據。
在訓練網絡時如果所用的是經過歸一化的樣本數據,那么以后使用網絡時所用的新數據也應該和樣本數據接受相同的預處理,這就要用到tramnmx函數:
tramnmx語句的語法格式是:[PN]=tramnmx(P,minp,maxp)
其中P和PN分別為變換前、后的輸入數據,maxp和minp分別為premnmx函數找到的最大值和最小值。
2、max函數的使用:
[Y,I]=max(M,[],2), 在第2維方向上取最大值,也就是每行最大值,結果存在Y里,I里存的是每行最大值的列位置。
?
總結
以上是生活随笔為你收集整理的MATLAB 神经网络模板的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity 碰撞
- 下一篇: 路由器怎么访问服务器共享文件夹,如何让你