Neural Networks神经网络编程入门
本文主要內(nèi)容包括: (1) 介紹神經(jīng)網(wǎng)絡基本原理,(2) AForge.NET實現(xiàn)前向神經(jīng)網(wǎng)絡的方法,(3) Matlab實現(xiàn)前向神經(jīng)網(wǎng)絡的方法 。
第0節(jié)、引例?
?????? 本文以Fisher的Iris數(shù)據(jù)集作為神經(jīng)網(wǎng)絡程序的測試數(shù)據(jù)集。Iris數(shù)據(jù)集可以在http://en.wikipedia.org/wiki/Iris_flower_data_set? 找到。這里簡要介紹一下Iris數(shù)據(jù)集:
有一批Iris花,已知這批Iris花可分為3個品種,現(xiàn)需要對其進行分類。不同品種的Iris花的花萼長度、花萼寬度、花瓣長度、花瓣寬度會有差異。我們現(xiàn)有一批已知品種的Iris花的花萼長度、花萼寬度、花瓣長度、花瓣寬度的數(shù)據(jù)。
一種解決方法是用已有的數(shù)據(jù)訓練一個神經(jīng)網(wǎng)絡用作分類器。
如果你只想用C#或Matlab快速實現(xiàn)神經(jīng)網(wǎng)絡來解決你手頭上的問題,或者已經(jīng)了解神經(jīng)網(wǎng)絡基本原理,請直接跳到第二節(jié)——神經(jīng)網(wǎng)絡實現(xiàn)。
第一節(jié)、神經(jīng)網(wǎng)絡基本原理?
1.?人工神經(jīng)元( Artificial Neuron )模型?
?????? 人工神經(jīng)元是神經(jīng)網(wǎng)絡的基本元素,其原理可以用下圖表示:
圖1. 人工神經(jīng)元模型
?
?????? 圖中x1~xn是從其他神經(jīng)元傳來的輸入信號,wij表示表示從神經(jīng)元j到神經(jīng)元i的連接權值,θ表示一個閾值 ( threshold ),或稱為偏置( bias )。則神經(jīng)元i的輸出與輸入的關系表示為:
?
圖中 yi表示神經(jīng)元i的輸出,函數(shù)f稱為激活函數(shù)?( Activation Function )或轉移函數(shù) ( Transfer Function ) ,net稱為凈激活(net activation)。若將閾值看成是神經(jīng)元i的一個輸入x0的權重wi0,則上面的式子可以簡化為:
?
若用X表示輸入向量,用W表示權重向量,即:
X = [ x0 , x1 , x2 , ....... , xn ]
?
則神經(jīng)元的輸出可以表示為向量相乘的形式:
?
?
?????? 若神經(jīng)元的凈激活net為正,稱該神經(jīng)元處于激活狀態(tài)或興奮狀態(tài)(fire),若凈激活net為負,則稱神經(jīng)元處于抑制狀態(tài)。
?????? 圖1中的這種“閾值加權和”的神經(jīng)元模型稱為M-P模型?( McCulloch-Pitts Model ),也稱為神經(jīng)網(wǎng)絡的一個處理單元( PE, Processing Element )。
2.?常用激活函數(shù)?
?????? 激活函數(shù)的選擇是構建神經(jīng)網(wǎng)絡過程中的重要環(huán)節(jié),下面簡要介紹常用的激活函數(shù)。
(1)?線性函數(shù)?( Liner Function )
?
(2)?斜面函數(shù)?( Ramp Function )
?
(3)?閾值函數(shù)?( Threshold Function )
?
?
?????? 以上3個激活函數(shù)都屬于線性函數(shù),下面介紹兩個常用的非線性激活函數(shù)。
(4) S形函數(shù)?( Sigmoid Function )
該函數(shù)的導函數(shù):
(5)?雙極S形函數(shù)?
該函數(shù)的導函數(shù):
S形函數(shù)與雙極S形函數(shù)的圖像如下:
圖3. S形函數(shù)與雙極S形函數(shù)圖像
雙極S形函數(shù)與S形函數(shù)主要區(qū)別在于函數(shù)的值域,雙極S形函數(shù)值域是(-1,1),而S形函數(shù)值域是(0,1)。
由于S形函數(shù)與雙極S形函數(shù)都是可導的(導函數(shù)是連續(xù)函數(shù)),因此適合用在BP神經(jīng)網(wǎng)絡中。(BP算法要求激活函數(shù)可導)
3.?神經(jīng)網(wǎng)絡模型?
?????? 神經(jīng)網(wǎng)絡是由大量的神經(jīng)元互聯(lián)而構成的網(wǎng)絡。根據(jù)網(wǎng)絡中神經(jīng)元的互聯(lián)方式,常見網(wǎng)絡結構主要可以分為下面3類:
(1)?前饋神經(jīng)網(wǎng)絡 ( Feedforward Neural Networks )
?????? 前饋網(wǎng)絡也稱前向網(wǎng)絡。這種網(wǎng)絡只在訓練過程會有反饋信號,而在分類過程中數(shù)據(jù)只能向前傳送,直到到達輸出層,層間沒有向后的反饋信號,因此被稱為前饋網(wǎng)絡。感知機( perceptron)與BP神經(jīng)網(wǎng)絡就屬于前饋網(wǎng)絡。
?????? 圖4 中是一個3層的前饋神經(jīng)網(wǎng)絡,其中第一層是輸入單元,第二層稱為隱含層,第三層稱為輸出層(輸入單元不是神經(jīng)元,因此圖中有2層神經(jīng)元)。
圖4. 前饋神經(jīng)網(wǎng)絡
?
對于一個3層的前饋神經(jīng)網(wǎng)絡N,若用X表示網(wǎng)絡的輸入向量,W1~W3表示網(wǎng)絡各層的連接權向量,F1~F3表示神經(jīng)網(wǎng)絡3層的激活函數(shù)。
那么神經(jīng)網(wǎng)絡的第一層神經(jīng)元的輸出為:
O1 = F1( XW1 )
第二層的輸出為:
O2 = F2 ( F1( XW1 ) W2 )
輸出層的輸出為:
O3 = F3( F2 ( F1( XW1 ) W2 ) W3 )
?????? 若激活函數(shù)F1~F3都選用線性函數(shù),那么神經(jīng)網(wǎng)絡的輸出O3將是輸入X的線性函數(shù)。因此,若要做高次函數(shù)的逼近就應該選用適當?shù)姆蔷€性函數(shù)作為激活函數(shù)。
(2)?反饋神經(jīng)網(wǎng)絡 ( Feedback Neural Networks )
?????? 反饋型神經(jīng)網(wǎng)絡是一種從輸出到輸入具有反饋連接的神經(jīng)網(wǎng)絡,其結構比前饋網(wǎng)絡要復雜得多。典型的反饋型神經(jīng)網(wǎng)絡有:Elman網(wǎng)絡和Hopfield網(wǎng)絡。
圖5. 反饋神經(jīng)網(wǎng)絡
?
(3)?自組織網(wǎng)絡?( SOM ,Self-Organizing Neural Networks )
?????? 自組織神經(jīng)網(wǎng)絡是一種無導師學習網(wǎng)絡。它通過自動尋找樣本中的內(nèi)在規(guī)律和本質(zhì)屬性,自組織、自適應地改變網(wǎng)絡參數(shù)與結構。
圖6. 自組織網(wǎng)絡
?
4.?神經(jīng)網(wǎng)絡工作方式?
?????? 神經(jīng)網(wǎng)絡運作過程分為學習和工作兩種狀態(tài)。
(1)神經(jīng)網(wǎng)絡的學習狀態(tài)?
?????? 網(wǎng)絡的學習主要是指使用學習算法來調(diào)整神經(jīng)元間的聯(lián)接權,使得網(wǎng)絡輸出更符合實際。學習算法分為有導師學習( Supervised Learning )與無導師學習( Unsupervised Learning )兩類。
???????有導師學習算法將一組訓練集 ( training set )送入網(wǎng)絡,根據(jù)網(wǎng)絡的實際輸出與期望輸出間的差別來調(diào)整連接權。有導師學習算法的主要步驟包括:
1)? 從樣本集合中取一個樣本(Ai,Bi);
2)? 計算網(wǎng)絡的實際輸出O;
3)? 求D=Bi-O;
4)? 根據(jù)D調(diào)整權矩陣W;
5) 對每個樣本重復上述過程,直到對整個樣本集來說,誤差不超過規(guī)定范圍。
BP算法就是一種出色的有導師學習算法。
???????無導師學習抽取樣本集合中蘊含的統(tǒng)計特性,并以神經(jīng)元之間的聯(lián)接權的形式存于網(wǎng)絡中。
?????? Hebb學習律是一種經(jīng)典的無導師學習算法。
(2)?神經(jīng)網(wǎng)絡的工作狀態(tài)?
?????? 神經(jīng)元間的連接權不變,神經(jīng)網(wǎng)絡作為分類器、預測器等使用。
下面簡要介紹一下Hebb學習率與Delta學習規(guī)則 。
(3)?無導師學習算法:Hebb學習率?
Hebb算法核心思想是,當兩個神經(jīng)元同時處于激發(fā)狀態(tài)時兩者間的連接權會被加強,否則被減弱。?
?????? 為了理解Hebb算法,有必要簡單介紹一下條件反射實驗。巴甫洛夫的條件反射實驗:每次給狗喂食前都先響鈴,時間一長,狗就會將鈴聲和食物聯(lián)系起來。以后如果響鈴但是不給食物,狗也會流口水。
圖7. 巴甫洛夫的條件反射實驗
?
受該實驗的啟發(fā),Hebb的理論認為在同一時間被激發(fā)的神經(jīng)元間的聯(lián)系會被強化。比如,鈴聲響時一個神經(jīng)元被激發(fā),在同一時間食物的出現(xiàn)會激發(fā)附近的另一個神經(jīng)元,那么這兩個神經(jīng)元間的聯(lián)系就會強化,從而記住這兩個事物之間存在著聯(lián)系。相反,如果兩個神經(jīng)元總是不能同步激發(fā),那么它們間的聯(lián)系將會越來越弱。
Hebb學習律可表示為:
?????? 其中wij表示神經(jīng)元j到神經(jīng)元i的連接權,yi與yj為兩個神經(jīng)元的輸出,a是表示學習速度的常數(shù)。若yi與yj同時被激活,即yi與yj同時為正,那么Wij將增大。若yi被激活,而yj處于抑制狀態(tài),即yi為正yj為負,那么Wij將變小。
(4)?有導師學習算法:Delta學習規(guī)則
Delta學習規(guī)則是一種簡單的有導師學習算法,該算法根據(jù)神經(jīng)元的實際輸出與期望輸出差別來調(diào)整連接權,其數(shù)學表示如下:
?
?????? 其中Wij表示神經(jīng)元j到神經(jīng)元i的連接權,di是神經(jīng)元i的期望輸出,yi是神經(jīng)元i的實際輸出,xj表示神經(jīng)元j狀態(tài),若神經(jīng)元j處于激活態(tài)則xj為1,若處于抑制狀態(tài)則xj為0或-1(根據(jù)激活函數(shù)而定)。a是表示學習速度的常數(shù)。假設xi為1,若di比yi大,那么Wij將增大,若di比yi小,那么Wij將變小。
?????? Delta規(guī)則簡單講來就是:若神經(jīng)元實際輸出比期望輸出大,則減小所有輸入為正的連接的權重,增大所有輸入為負的連接的權重。反之,若神經(jīng)元實際輸出比期望輸出小,則增大所有輸入為正的連接的權重,減小所有輸入為負的連接的權重。這個增大或減小的幅度就根據(jù)上面的式子來計算。
(5)有導師學習算法:BP算法?
采用BP學習算法的前饋型神經(jīng)網(wǎng)絡通常被稱為BP網(wǎng)絡。
圖8. 三層BP神經(jīng)網(wǎng)絡結構
?
BP網(wǎng)絡具有很強的非線性映射能力,一個3層BP神經(jīng)網(wǎng)絡能夠實現(xiàn)對任意非線性函數(shù)進行逼近(根據(jù)Kolrnogorov定理)。一個典型的3層BP神經(jīng)網(wǎng)絡模型如圖7所示。
BP網(wǎng)絡的學習算法占篇幅較大,我打算在下一篇文章中介紹。
?
第二節(jié)、神經(jīng)網(wǎng)絡實現(xiàn)?
?
1.?數(shù)據(jù)預處理?
?????? 在訓練神經(jīng)網(wǎng)絡前一般需要對數(shù)據(jù)進行預處理,一種重要的預處理手段是歸一化處理。下面簡要介紹歸一化處理的原理與方法。
(1)?什么是歸一化??
數(shù)據(jù)歸一化,就是將數(shù)據(jù)映射到[0,1]或[-1,1]區(qū)間或更小的區(qū)間,比如(0.1,0.9) 。
(2)?為什么要歸一化處理??
<1>輸入數(shù)據(jù)的單位不一樣,有些數(shù)據(jù)的范圍可能特別大,導致的結果是神經(jīng)網(wǎng)絡收斂慢、訓練時間長。
<2>數(shù)據(jù)范圍大的輸入在模式分類中的作用可能會偏大,而數(shù)據(jù)范圍小的輸入作用就可能會偏小。
<3>由于神經(jīng)網(wǎng)絡輸出層的激活函數(shù)的值域是有限制的,因此需要將網(wǎng)絡訓練的目標數(shù)據(jù)映射到激活函數(shù)的值域。例如神經(jīng)網(wǎng)絡的輸出層若采用S形激活函數(shù),由于S形函數(shù)的值域限制在(0,1),也就是說神經(jīng)網(wǎng)絡的輸出只能限制在(0,1),所以訓練數(shù)據(jù)的輸出就要歸一化到[0,1]區(qū)間。
<4>S形激活函數(shù)在(0,1)區(qū)間以外區(qū)域很平緩,區(qū)分度太小。例如S形函數(shù)f(X)在參數(shù)a=1時,f(100)與f(5)只相差0.0067。
(3)?歸一化算法?
一種簡單而快速的歸一化算法是線性轉換算法。線性轉換算法常見有兩種形式:
?????? <1>
y = ( x - min )/( max - min )
其中min為x的最小值,max為x的最大值,輸入向量為x,歸一化后的輸出向量為y 。上式將數(shù)據(jù)歸一化到 [ 0 , 1 ]區(qū)間,當激活函數(shù)采用S形函數(shù)時(值域為(0,1))時這條式子適用。
?????? <2>
y = 2 * ( x - min ) / ( max - min ) - 1
?????? 這條公式將數(shù)據(jù)歸一化到 [ -1 , 1 ] 區(qū)間。當激活函數(shù)采用雙極S形函數(shù)(值域為(-1,1))時這條式子適用。
(4) Matlab數(shù)據(jù)歸一化處理函數(shù)?
Matlab中歸一化處理數(shù)據(jù)可以采用premnmx , postmnmx , tramnmx 這3個函數(shù)。
<1> premnmx
語法:[pn,minp,maxp,tn,mint,maxt] = premnmx(p,t)
參數(shù):
pn: p矩陣按行歸一化后的矩陣
minp,maxp:p矩陣每一行的最小值,最大值
tn:t矩陣按行歸一化后的矩陣
mint,maxt:t矩陣每一行的最小值,最大值
作用:將矩陣p,t歸一化到[-1,1] ,主要用于歸一化處理訓練數(shù)據(jù)集。
<2> tramnmx
語法:[pn] = tramnmx(p,minp,maxp)
參數(shù):
minp,maxp:premnmx函數(shù)計算的矩陣的最小,最大值
pn:歸一化后的矩陣
作用:主要用于歸一化處理待分類的輸入數(shù)據(jù)。
<3> postmnmx
語法: [p,t] = postmnmx(pn,minp,maxp,tn,mint,maxt)
參數(shù):
minp,maxp:premnmx函數(shù)計算的p矩陣每行的最小值,最大值
mint,maxt:premnmx函數(shù)計算的t矩陣每行的最小值,最大值
作用:將矩陣pn,tn映射回歸一化處理前的范圍。postmnmx函數(shù)主要用于將神經(jīng)網(wǎng)絡的輸出結果映射回歸一化前的數(shù)據(jù)范圍。
2.?使用Matlab實現(xiàn)神經(jīng)網(wǎng)絡?
使用Matlab建立前饋神經(jīng)網(wǎng)絡主要會使用到下面3個函數(shù):
newff :前饋網(wǎng)絡創(chuàng)建函數(shù)
train:訓練一個神經(jīng)網(wǎng)絡
sim :使用網(wǎng)絡進行仿真
?下面簡要介紹這3個函數(shù)的用法。
(1) newff函數(shù)
<1>newff函數(shù)語法?
?????? newff函數(shù)參數(shù)列表有很多的可選參數(shù),具體可以參考Matlab的幫助文檔,這里介紹newff函數(shù)的一種簡單的形式。
語法:net = newff ( A, B, {C} ,‘trainFun’)
參數(shù):
A:一個n×2的矩陣,第i行元素為輸入信號xi的最小值和最大值;
B:一個k維行向量,其元素為網(wǎng)絡中各層節(jié)點數(shù);
C:一個k維字符串行向量,每一分量為對應層神經(jīng)元的激活函數(shù);
trainFun :為學習規(guī)則采用的訓練算法。
<2>常用的激活函數(shù)
常用的激活函數(shù)有:
a)?線性函數(shù)?(Linear transfer function)
f(x) = x
該函數(shù)的字符串為’purelin’。
?
b)?對數(shù)S形轉移函數(shù)( Logarithmic sigmoid transfer function )
??? 該函數(shù)的字符串為’logsig’。
c)?雙曲正切S形函數(shù)?(Hyperbolic tangent sigmoid transfer function )
也就是上面所提到的雙極S形函數(shù)。
?
該函數(shù)的字符串為’ tansig’。
Matlab的安裝目錄下的toolbox\nnet\nnet\nntransfer子目錄中有所有激活函數(shù)的定義說明。
<3>常見的訓練函數(shù)
??? 常見的訓練函數(shù)有:
traingd :梯度下降BP訓練函數(shù)(Gradient descent backpropagation)
traingdx :梯度下降自適應學習率訓練函數(shù)
<4>網(wǎng)絡配置參數(shù)
一些重要的網(wǎng)絡配置參數(shù)如下:
net.trainparam.goal ?:神經(jīng)網(wǎng)絡訓練的目標誤差
net.trainparam.show ??: 顯示中間結果的周期
net.trainparam.epochs :最大迭代次數(shù)
net.trainParam.lr ?? : 學習率
(2) train函數(shù)
??? 網(wǎng)絡訓練學習函數(shù)。
語法:[ net, tr, Y1, E ]? = train( net, X, Y )
參數(shù):
X:網(wǎng)絡實際輸入
Y:網(wǎng)絡應有輸出
tr:訓練跟蹤信息
Y1:網(wǎng)絡實際輸出
E:誤差矩陣
(3) sim函數(shù)
語法:Y=sim(net,X)
參數(shù):
net:網(wǎng)絡
X:輸入給網(wǎng)絡的K×N矩陣,其中K為網(wǎng)絡輸入個數(shù),N為數(shù)據(jù)樣本數(shù)
Y:輸出矩陣Q×N,其中Q為網(wǎng)絡輸出個數(shù)
(4) Matlab BP網(wǎng)絡實例?
?????? 我將Iris數(shù)據(jù)集分為2組,每組各75個樣本,每組中每種花各有25個樣本。其中一組作為以上程序的訓練樣本,另外一組作為檢驗樣本。為了方便訓練,將3類花分別編號為1,2,3 。
使用這些數(shù)據(jù)訓練一個4輸入(分別對應4個特征),3輸出(分別對應該樣本屬于某一品種的可能性大小)的前向網(wǎng)絡。
?????? Matlab程序如下:
%讀取訓練數(shù)據(jù) [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 : s output( i , class( i ) ) = 1 ; end%創(chuàng)建神經(jīng)網(wǎng)絡 net = newff( minmax(input) , [10 3] , { 'logsig' 'purelin' } , 'traingdx' ) ; %設置訓練參數(shù) net.trainparam.show = 50 ; net.trainparam.epochs = 500 ; net.trainparam.goal = 0.01 ; net.trainParam.lr = 0.01 ;%開始訓練 net = train( net, input , output' ) ; %讀取測試數(shù)據(jù) [t1 t2 t3 t4 c] = textread('testData.txt' , '%f%f%f%f%f',150);%測試數(shù)據(jù)歸一化 testInput = tramnmx ( [t1,t2,t3,t4]' , minI, maxI ) ; %仿真 Y = sim( net , testInput ) %統(tǒng)計識別正確率 [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 )
以上程序的識別率穩(wěn)定在95%左右,訓練100次左右達到收斂,訓練曲線如下圖所示:
圖9. 訓練性能表現(xiàn)
?
(5)參數(shù)設置對神經(jīng)網(wǎng)絡性能的影響?
?????? 我在實驗中通過調(diào)整隱含層節(jié)點數(shù),選擇不通過的激活函數(shù),設定不同的學習率,
?
<1>隱含層節(jié)點個數(shù)?
隱含層節(jié)點的個數(shù)對于識別率的影響并不大,但是節(jié)點個數(shù)過多會增加運算量,使得訓練較慢。
?
<2>激活函數(shù)的選擇?
?????? 激活函數(shù)無論對于識別率或收斂速度都有顯著的影響。在逼近高次曲線時,S形函數(shù)精度比線性函數(shù)要高得多,但計算量也要大得多。
?
<3>學習率的選擇?
?????? 學習率影響著網(wǎng)絡收斂的速度,以及網(wǎng)絡能否收斂。學習率設置偏小可以保證網(wǎng)絡收斂,但是收斂較慢。相反,學習率設置偏大則有可能使網(wǎng)絡訓練不收斂,影響識別效果。
?
3.?使用AForge.NET實現(xiàn)神經(jīng)網(wǎng)絡?
(1) AForge.NET簡介?
?????? AForge.NET是一個C#實現(xiàn)的面向人工智能、計算機視覺等領域的開源架構。AForge.NET源代碼下的Neuro目錄包含一個神經(jīng)網(wǎng)絡的類庫。
AForge.NET主頁:http://www.aforgenet.com/
AForge.NET代碼下載:http://code.google.com/p/aforge/
Aforge.Neuro工程的類圖如下:
?
圖10. AForge.Neuro類庫類圖
?
下面介紹圖9中的幾個基本的類:
Neuron — 神經(jīng)元的抽象基類
Layer — 層的抽象基類,由多個神經(jīng)元組成
Network —神經(jīng)網(wǎng)絡的抽象基類,由多個層(Layer)組成
IActivationFunction - 激活函數(shù)(activation function)的接口
IUnsupervisedLearning - 無導師學習(unsupervised learning)算法的接口ISupervisedLearning - 有導師學習(supervised learning)算法的接口
?
(2)使用Aforge建立BP神經(jīng)網(wǎng)絡?
?????? 使用AForge建立BP神經(jīng)網(wǎng)絡會用到下面的幾個類:
<1> ?SigmoidFunction : S形神經(jīng)網(wǎng)絡
構造函數(shù):public SigmoidFunction( double alpha )
參數(shù)alpha決定S形函數(shù)的陡峭程度。
<2>? ActivationNetwork :神經(jīng)網(wǎng)絡類
構造函數(shù):
public ActivationNetwork( IActivationFunction function, int inputsCount, params int[] neuronsCount )
???????????????????????? : base( inputsCount, neuronsCount.Length )
public virtual double[] Compute( double[] input )
?
參數(shù)意義:
inputsCount:輸入個數(shù)
neuronsCount :表示各層神經(jīng)元個數(shù)
<3>? BackPropagationLearning:BP學習算法
?構造函數(shù):
public BackPropagationLearning( ActivationNetwork network )
?參數(shù)意義:
network :要訓練的神經(jīng)網(wǎng)絡對象
BackPropagationLearning類需要用戶設置的屬性有下面2個:
learningRate :學習率
momentum :沖量因子
下面給出一個用AForge構建BP網(wǎng)絡的代碼。
?
// 創(chuàng)建一個多層神經(jīng)網(wǎng)絡,采用S形激活函數(shù),各層分別有4,5,3個神經(jīng)元//(其中4是輸入個數(shù),3是輸出個數(shù),5是中間層結點個數(shù)) ActivationNetwork network = new ActivationNetwork(new SigmoidFunction(2), 4, 5, 3);// 創(chuàng)建訓練算法對象 BackPropagationLearning teacher = new BackPropagationLearning(network);// 設置BP算法的學習率與沖量系數(shù) teacher.LearningRate = 0.1; teacher.Momentum = 0;int iteration = 1 ; // 迭代訓練500次 while( iteration < 500 ) {teacher.RunEpoch( trainInput , trainOutput ) ; ++iteration ; }//使用訓練出來的神經(jīng)網(wǎng)絡來分類,t為輸入數(shù)據(jù)向量 network.Compute(t)[0]?
?????? 改程序對Iris 數(shù)據(jù)進行分類,識別率可達97%左右 。
?? ??點擊下載源代碼
文章來自:http://www.cnblogs.com/heaad/??
轉載請保留出處,thx!
參考文獻?
[1] Andrew Kirillov. Neural Networks on C#. [Online]. ??
http://www.codeproject.com/KB/recipes/aforge_neuro.aspx? 2006.10
[2] Sacha Barber. AI : Neural Network for beginners. [Online].
http://www.codeproject.com/KB/recipes/NeuralNetwork_1.aspx? 2007.5
[3] Richard O. Duda, Peter E. Hart and David G. Stork. 模式分類. 機械工業(yè)出版社. 2010.4
[4] Wikipedia. Iris flower data set. [Online].??????
http://en.wikipedia.org/wiki/Iris_flower_data_set?
from:?http://www.cnblogs.com/heaad/archive/2011/03/07/1976443.html
總結
以上是生活随笔為你收集整理的Neural Networks神经网络编程入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 干货︱机器学习中防止过拟合的处理方法
- 下一篇: 第三章 改进神经网络的学习方式(上中)