中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
神經(jīng)網(wǎng)絡(luò)編程入門

  本文主要內(nèi)容包括: (1) 介紹神經(jīng)網(wǎng)絡(luò)基本原理,(2)AForge.NET實(shí)現(xiàn)前向神經(jīng)網(wǎng)絡(luò)的方法,(3) Matlab實(shí)現(xiàn)前向神經(jīng)網(wǎng)絡(luò)的方法 。


0節(jié)、引例 

       本文以Fisher的Iris數(shù)據(jù)集作為神經(jīng)網(wǎng)絡(luò)程序的測(cè)試數(shù)據(jù)集。Iris數(shù)據(jù)集可以在http://en.wikipedia.org/wiki/Iris_flower_data_set  找到。這里簡要介紹一下Iris數(shù)據(jù)集:

有一批Iris花,已知這批Iris花可分為3個(gè)品種,現(xiàn)需要對(duì)其進(jìn)行分類。不同品種的Iris花的花萼長度、花萼寬度、花瓣長度、花瓣寬度會(huì)有差異。我們現(xiàn)有一批已知品種的Iris花的花萼長度、花萼寬度、花瓣長度、花瓣寬度的數(shù)據(jù)。

  一種解決方法是用已有的數(shù)據(jù)訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)用作分類器。

  如果你只想用C#或Matlab快速實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)來解決你手頭上的問題,或者已經(jīng)了解神經(jīng)網(wǎng)絡(luò)基本原理,請(qǐng)直接跳到第二節(jié)——神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)。


第一節(jié)、神經(jīng)網(wǎng)絡(luò)基本原理 

1. 人工神經(jīng)元(Artificial Neuron )模型 

       人工神經(jīng)元是神經(jīng)網(wǎng)絡(luò)的基本元素,其原理可以用下圖表示:

圖1. 人工神經(jīng)元模型

 

       圖中x1~xn是從其他神經(jīng)元傳來的輸入信號(hào),wij表示表示從神經(jīng)元j到神經(jīng)元i的連接權(quán)值,θ表示一個(gè)閾值 ( threshold ),或稱為偏置( bias )。則神經(jīng)元i的輸出與輸入的關(guān)系表示為:

 

  圖中yi表示神經(jīng)元i的輸出,函數(shù)f稱為激活函數(shù) ( Activation Function )或轉(zhuǎn)移函數(shù) ( Transfer Function ) ,net稱為凈激活(net activation)。若將閾值看成是神經(jīng)元i的一個(gè)輸入x0的權(quán)重wi0,則上面的式子可以簡化為:

 

  若用X表示輸入向量,用W表示權(quán)重向量,即:

X = [ x0 , x1 , x2 , ....... , xn ]

 

  則神經(jīng)元的輸出可以表示為向量相乘的形式:

 

 

       若神經(jīng)元的凈激活net為正,稱該神經(jīng)元處于激活狀態(tài)或興奮狀態(tài)(fire),若凈激活net為負(fù),則稱神經(jīng)元處于抑制狀態(tài)。

       圖1中的這種“閾值加權(quán)和”的神經(jīng)元模型稱為M-P模型 ( McCulloch-Pitts Model ),也稱為神經(jīng)網(wǎng)絡(luò)的一個(gè)處理單元( PE, Processing Element )


2. 常用激活函數(shù) 

       激活函數(shù)的選擇是構(gòu)建神經(jīng)網(wǎng)絡(luò)過程中的重要環(huán)節(jié),下面簡要介紹常用的激活函數(shù)。

(1) 線性函數(shù)( Liner Function )

 

(2) 斜面函數(shù)( Ramp Function )

 

(3) 閾值函數(shù)( Threshold Function )

 


 

       以上3個(gè)激活函數(shù)都屬于線性函數(shù),下面介紹兩個(gè)常用的非線性激活函數(shù)。

(4) S形函數(shù)( Sigmoid Function )

  該函數(shù)的導(dǎo)函數(shù):

(5) 雙極S形函數(shù) 

  該函數(shù)的導(dǎo)函數(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ù)都是可導(dǎo)的(導(dǎo)函數(shù)是連續(xù)函數(shù)),因此適合用在BP神經(jīng)網(wǎng)絡(luò)中。(BP算法要求激活函數(shù)可導(dǎo))


3. 神經(jīng)網(wǎng)絡(luò)模型 

       神經(jīng)網(wǎng)絡(luò)是由大量的神經(jīng)元互聯(lián)而構(gòu)成的網(wǎng)絡(luò)。根據(jù)網(wǎng)絡(luò)中神經(jīng)元的互聯(lián)方式,常見網(wǎng)絡(luò)結(jié)構(gòu)主要可以分為下面3類:

(1) 前饋神經(jīng)網(wǎng)絡(luò) ( Feedforward Neural Networks )

       前饋網(wǎng)絡(luò)也稱前向網(wǎng)絡(luò)。這種網(wǎng)絡(luò)只在訓(xùn)練過程會(huì)有反饋信號(hào),而在分類過程中數(shù)據(jù)只能向前傳送,直到到達(dá)輸出層,層間沒有向后的反饋信號(hào),因此被稱為前饋網(wǎng)絡(luò)。感知機(jī)( perceptron)與BP神經(jīng)網(wǎng)絡(luò)就屬于前饋網(wǎng)絡(luò)。

       圖4 中是一個(gè)3層的前饋神經(jīng)網(wǎng)絡(luò),其中第一層是輸入單元,第二層稱為隱含層,第三層稱為輸出層(輸入單元不是神經(jīng)元,因此圖中有2層神經(jīng)元)。

圖4. 前饋神經(jīng)網(wǎng)絡(luò)

 

  對(duì)于一個(gè)3層的前饋神經(jīng)網(wǎng)絡(luò)N,若用X表示網(wǎng)絡(luò)的輸入向量,W1~W3表示網(wǎng)絡(luò)各層的連接權(quán)向量,F(xiàn)1~F3表示神經(jīng)網(wǎng)絡(luò)3層的激活函數(shù)。

  那么神經(jīng)網(wǎng)絡(luò)的第一層神經(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)絡(luò)的輸出O3將是輸入X的線性函數(shù)。因此,若要做高次函數(shù)的逼近就應(yīng)該選用適當(dāng)?shù)姆蔷€性函數(shù)作為激活函數(shù)。

(2) 反饋神經(jīng)網(wǎng)絡(luò) ( Feedback Neural Networks )

       反饋型神經(jīng)網(wǎng)絡(luò)是一種從輸出到輸入具有反饋連接的神經(jīng)網(wǎng)絡(luò),其結(jié)構(gòu)比前饋網(wǎng)絡(luò)要復(fù)雜得多。典型的反饋型神經(jīng)網(wǎng)絡(luò)有:Elman網(wǎng)絡(luò)和Hopfield網(wǎng)絡(luò)。

圖5. 反饋神經(jīng)網(wǎng)絡(luò)

 

(3) 自組織網(wǎng)絡(luò) ( SOM ,Self-Organizing Neural Networks )

       自組織神經(jīng)網(wǎng)絡(luò)是一種無導(dǎo)師學(xué)習(xí)網(wǎng)絡(luò)。它通過自動(dòng)尋找樣本中的內(nèi)在規(guī)律和本質(zhì)屬性,自組織、自適應(yīng)地改變網(wǎng)絡(luò)參數(shù)與結(jié)構(gòu)。

圖6. 自組織網(wǎng)絡(luò)

 

4. 神經(jīng)網(wǎng)絡(luò)工作方式 

       神經(jīng)網(wǎng)絡(luò)運(yùn)作過程分為學(xué)習(xí)和工作兩種狀態(tài)。

(1)神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)狀態(tài) 

       網(wǎng)絡(luò)的學(xué)習(xí)主要是指使用學(xué)習(xí)算法來調(diào)整神經(jīng)元間的聯(lián)接權(quán),使得網(wǎng)絡(luò)輸出更符合實(shí)際。學(xué)習(xí)算法分為有導(dǎo)師學(xué)習(xí)( Supervised Learning )無導(dǎo)師學(xué)習(xí)( Unsupervised Learning )兩類。

       有導(dǎo)師學(xué)習(xí)算法將一組訓(xùn)練集 ( training set )送入網(wǎng)絡(luò),根據(jù)網(wǎng)絡(luò)的實(shí)際輸出與期望輸出間的差別來調(diào)整連接權(quán)。有導(dǎo)師學(xué)習(xí)算法的主要步驟包括:

1)  從樣本集合中取一個(gè)樣本(Ai,Bi);

2)  計(jì)算網(wǎng)絡(luò)的實(shí)際輸出O;

3)  求D=Bi-O;

4)  根據(jù)D調(diào)整權(quán)矩陣W;

5) 對(duì)每個(gè)樣本重復(fù)上述過程,直到對(duì)整個(gè)樣本集來說,誤差不超過規(guī)定范圍。

  BP算法就是一種出色的有導(dǎo)師學(xué)習(xí)算法。

       無導(dǎo)師學(xué)習(xí)抽取樣本集合中蘊(yùn)含的統(tǒng)計(jì)特性,并以神經(jīng)元之間的聯(lián)接權(quán)的形式存于網(wǎng)絡(luò)中。

       Hebb學(xué)習(xí)律是一種經(jīng)典的無導(dǎo)師學(xué)習(xí)算法。

(2) 神經(jīng)網(wǎng)絡(luò)的工作狀態(tài) 

       神經(jīng)元間的連接權(quán)不變,神經(jīng)網(wǎng)絡(luò)作為分類器、預(yù)測(cè)器等使用。

  下面簡要介紹一下Hebb學(xué)習(xí)率與Delta學(xué)習(xí)規(guī)則 。

(3) 無導(dǎo)師學(xué)習(xí)算法:Hebb學(xué)習(xí)率 

  Hebb算法核心思想是,當(dāng)兩個(gè)神經(jīng)元同時(shí)處于激發(fā)狀態(tài)時(shí)兩者間的連接權(quán)會(huì)被加強(qiáng),否則被減弱。 

       為了理解Hebb算法,有必要簡單介紹一下條件反射實(shí)驗(yàn)。巴甫洛夫的條件反射實(shí)驗(yàn):每次給狗喂食前都先響鈴,時(shí)間一長,狗就會(huì)將鈴聲和食物聯(lián)系起來。以后如果響鈴但是不給食物,狗也會(huì)流口水。

圖7. 巴甫洛夫的條件反射實(shí)驗(yàn)

 

  受該實(shí)驗(yàn)的啟發(fā),Hebb的理論認(rèn)為在同一時(shí)間被激發(fā)的神經(jīng)元間的聯(lián)系會(huì)被強(qiáng)化。比如,鈴聲響時(shí)一個(gè)神經(jīng)元被激發(fā),在同一時(shí)間食物的出現(xiàn)會(huì)激發(fā)附近的另一個(gè)神經(jīng)元,那么這兩個(gè)神經(jīng)元間的聯(lián)系就會(huì)強(qiáng)化,從而記住這兩個(gè)事物之間存在著聯(lián)系。相反,如果兩個(gè)神經(jīng)元總是不能同步激發(fā),那么它們間的聯(lián)系將會(huì)越來越弱。

  Hebb學(xué)習(xí)律可表示為:

       其中wij表示神經(jīng)元j到神經(jīng)元i的連接權(quán),yi與yj為兩個(gè)神經(jīng)元的輸出,a是表示學(xué)習(xí)速度的常數(shù)。若yi與yj同時(shí)被激活,即yi與yj同時(shí)為正,那么Wij將增大。若yi被激活,而yj處于抑制狀態(tài),即yi為正yj為負(fù),那么Wij將變小。

(4) 有導(dǎo)師學(xué)習(xí)算法:Delta學(xué)習(xí)規(guī)則

  Delta學(xué)習(xí)規(guī)則是一種簡單的有導(dǎo)師學(xué)習(xí)算法,該算法根據(jù)神經(jīng)元的實(shí)際輸出與期望輸出差別來調(diào)整連接權(quán),其數(shù)學(xué)表示如下:

 

       其中Wij表示神經(jīng)元j到神經(jīng)元i的連接權(quán),di是神經(jīng)元i的期望輸出,yi是神經(jīng)元i的實(shí)際輸出,xj表示神經(jīng)元j狀態(tài),若神經(jīng)元j處于激活態(tài)則xj為1,若處于抑制狀態(tài)則xj為0或-1(根據(jù)激活函數(shù)而定)。a是表示學(xué)習(xí)速度的常數(shù)。假設(shè)xi為1,若di比yi大,那么Wij將增大,若di比yi小,那么Wij將變小。

       Delta規(guī)則簡單講來就是:若神經(jīng)元實(shí)際輸出比期望輸出大,則減小所有輸入為正的連接的權(quán)重,增大所有輸入為負(fù)的連接的權(quán)重。反之,若神經(jīng)元實(shí)際輸出比期望輸出小,則增大所有輸入為正的連接的權(quán)重,減小所有輸入為負(fù)的連接的權(quán)重。這個(gè)增大或減小的幅度就根據(jù)上面的式子來計(jì)算。

(5)有導(dǎo)師學(xué)習(xí)算法:BP算法 

  采用BP學(xué)習(xí)算法的前饋型神經(jīng)網(wǎng)絡(luò)通常被稱為BP網(wǎng)絡(luò)。

圖8. 三層BP神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)

 

  BP網(wǎng)絡(luò)具有很強(qiáng)的非線性映射能力,一個(gè)3層BP神經(jīng)網(wǎng)絡(luò)能夠?qū)崿F(xiàn)對(duì)任意非線性函數(shù)進(jìn)行逼近(根據(jù)Kolrnogorov定理)。一個(gè)典型的3層BP神經(jīng)網(wǎng)絡(luò)模型如圖7所示。

  BP網(wǎng)絡(luò)的學(xué)習(xí)算法占篇幅較大,我打算在下一篇文章中介紹。

 

第二節(jié)、神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn) 

 

1. 數(shù)據(jù)預(yù)處理 

       在訓(xùn)練神經(jīng)網(wǎng)絡(luò)前一般需要對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,一種重要的預(yù)處理手段是歸一化處理。下面簡要介紹歸一化處理的原理與方法。

(1) 什么是歸一化? 

數(shù)據(jù)歸一化,就是將數(shù)據(jù)映射到[0,1]或[-1,1]區(qū)間或更小的區(qū)間,比如(0.1,0.9) 。

(2) 為什么要?dú)w一化處理? 

<1>輸入數(shù)據(jù)的單位不一樣,有些數(shù)據(jù)的范圍可能特別大,導(dǎo)致的結(jié)果是神經(jīng)網(wǎng)絡(luò)收斂慢、訓(xùn)練時(shí)間長。

<2>數(shù)據(jù)范圍大的輸入在模式分類中的作用可能會(huì)偏大,而數(shù)據(jù)范圍小的輸入作用就可能會(huì)偏小。

<3>由于神經(jīng)網(wǎng)絡(luò)輸出層的激活函數(shù)的值域是有限制的,因此需要將網(wǎng)絡(luò)訓(xùn)練的目標(biāo)數(shù)據(jù)映射到激活函數(shù)的值域。例如神經(jīng)網(wǎng)絡(luò)的輸出層若采用S形激活函數(shù),由于S形函數(shù)的值域限制在(0,1),也就是說神經(jīng)網(wǎng)絡(luò)的輸出只能限制在(0,1),所以訓(xùn)練數(shù)據(jù)的輸出就要?dú)w一化到[0,1]區(qū)間。

<4>S形激活函數(shù)在(0,1)區(qū)間以外區(qū)域很平緩,區(qū)分度太小。例如S形函數(shù)f(X)在參數(shù)a=1時(shí),f(100)與f(5)只相差0.0067。

(3) 歸一化算法 

  一種簡單而快速的歸一化算法是線性轉(zhuǎn)換算法。線性轉(zhuǎn)換算法常見有兩種形式:

       <1>

y = ( x - min )/( max - min )

  其中min為x的最小值,max為x的最大值,輸入向量為x,歸一化后的輸出向量為y 。上式將數(shù)據(jù)歸一化到 [ 0 , 1 ]區(qū)間,當(dāng)激活函數(shù)采用S形函數(shù)時(shí)(值域?yàn)?0,1))時(shí)這條式子適用。

       <2>

y = 2 * ( x - min ) / ( max - min ) - 1

       這條公式將數(shù)據(jù)歸一化到 [ -1 , 1 ] 區(qū)間。當(dāng)激活函數(shù)采用雙極S形函數(shù)(值域?yàn)?-1,1))時(shí)這條式子適用。

(4) Matlab數(shù)據(jù)歸一化處理函數(shù) 

  Matlab中歸一化處理數(shù)據(jù)可以采用premnmx , postmnmx , tramnmx 這3個(gè)函數(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] ,主要用于歸一化處理訓(xùn)練數(shù)據(jù)集。

<2> tramnmx

語法:[pn] = tramnmx(p,minp,maxp)

參數(shù):

minp,maxp:premnmx函數(shù)計(jì)算的矩陣的最小,最大值

pn:歸一化后的矩陣

作用:主要用于歸一化處理待分類的輸入數(shù)據(jù)。

<3> postmnmx

語法: [p,t] =postmnmx(pn,minp,maxp,tn,mint,maxt)

參數(shù):

minp,maxp:premnmx函數(shù)計(jì)算的p矩陣每行的最小值,最大值

mint,maxt:premnmx函數(shù)計(jì)算的t矩陣每行的最小值,最大值

作用:將矩陣pn,tn映射回歸一化處理前的范圍。postmnmx函數(shù)主要用于將神經(jīng)網(wǎng)絡(luò)的輸出結(jié)果映射回歸一化前的數(shù)據(jù)范圍。

2. 使用Matlab實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò) 

使用Matlab建立前饋神經(jīng)網(wǎng)絡(luò)主要會(huì)使用到下面3個(gè)函數(shù):

newff :前饋網(wǎng)絡(luò)創(chuàng)建函數(shù)

train:訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)

sim :使用網(wǎng)絡(luò)進(jìn)行仿真

 下面簡要介紹這3個(gè)函數(shù)的用法。

(1) newff函數(shù)

<1>newff函數(shù)語法 

       newff函數(shù)參數(shù)列表有很多的可選參數(shù),具體可以參考Matlab的幫助文檔,這里介紹newff函數(shù)的一種簡單的形式。

語法:net = newff ( A, B, {C} ,‘trainFun’)

參數(shù):

A:一個(gè)n?2的矩陣,第i行元素為輸入信號(hào)xi的最小值和最大值;

B:一個(gè)k維行向量,其元素為網(wǎng)絡(luò)中各層節(jié)點(diǎn)數(shù);

C:一個(gè)k維字符串行向量,每一分量為對(duì)應(yīng)層神經(jīng)元的激活函數(shù);

trainFun :為學(xué)習(xí)規(guī)則采用的訓(xùn)練算法

<2>常用的激活函數(shù)

  常用的激活函數(shù)有:

  a) 線性函數(shù) (Linear transfer function)

f(x) = x

  該函數(shù)的字符串為’purelin’。

 

b) 對(duì)數(shù)S形轉(zhuǎn)移函數(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>常見的訓(xùn)練函數(shù)

    常見的訓(xùn)練函數(shù)有:

traingd :梯度下降BP訓(xùn)練函數(shù)(Gradient descentbackpropagation)

traingdx :梯度下降自適應(yīng)學(xué)習(xí)率訓(xùn)練函數(shù)

<4>網(wǎng)絡(luò)配置參數(shù)

一些重要的網(wǎng)絡(luò)配置參數(shù)如下:

net.trainparam.goal  :神經(jīng)網(wǎng)絡(luò)訓(xùn)練的目標(biāo)誤差

net.trainparam.show   : 顯示中間結(jié)果的周期

net.trainparam.epochs ?。鹤畲蟮螖?shù)

net.trainParam.lr    : 學(xué)習(xí)率

(2) train函數(shù)

    網(wǎng)絡(luò)訓(xùn)練學(xué)習(xí)函數(shù)。

語法:[ net, tr, Y1, E ]  = train( net, X, Y )

參數(shù):

X:網(wǎng)絡(luò)實(shí)際輸入

Y:網(wǎng)絡(luò)應(yīng)有輸出

tr:訓(xùn)練跟蹤信息

Y1:網(wǎng)絡(luò)實(shí)際輸出

E:誤差矩陣

(3) sim函數(shù)

語法:Y=sim(net,X)

參數(shù):

net:網(wǎng)絡(luò)

X:輸入給網(wǎng)絡(luò)的K?N矩陣,其中K為網(wǎng)絡(luò)輸入個(gè)數(shù),N為數(shù)據(jù)樣本數(shù)

Y:輸出矩陣Q?N,其中Q為網(wǎng)絡(luò)輸出個(gè)數(shù)

(4) Matlab BP網(wǎng)絡(luò)實(shí)例 

       我將Iris數(shù)據(jù)集分為2組,每組各75個(gè)樣本,每組中每種花各有25個(gè)樣本。其中一組作為以上程序的訓(xùn)練樣本,另外一組作為檢驗(yàn)樣本。為了方便訓(xùn)練,將3類花分別編號(hào)為1,2,3 。

  使用這些數(shù)據(jù)訓(xùn)練一個(gè)4輸入(分別對(duì)應(yīng)4個(gè)特征),3輸出(分別對(duì)應(yīng)該樣本屬于某一品種的可能性大?。┑那跋蚓W(wǎng)絡(luò)。

       Matlab程序如下:

%讀取訓(xùn)練數(shù)據(jù)
[f1,f2,f3,f4,class] = textread('trainData.txt' , '%f%f%f%f%f',150);

%特征值歸一化
[input,minI,maxI] = premnmx( [f1 , f2 , f3 , f4 ]') ;

%構(gòu)造輸出矩陣
s = length( class) ;
output = zeros( s , 3 ) ;
for i = 1 : s
output( i , class( i ) ) = 1 ;
end

%創(chuàng)建神經(jīng)網(wǎng)絡(luò)
net = newff( minmax(input) , [10 3] , { 'logsig' 'purelin' } , 'traingdx' ) ;

%設(shè)置訓(xùn)練參數(shù)
net.trainparam.show = 50 ;
net.trainparam.epochs = 500 ;
net.trainparam.goal = 0.01 ;
net.trainParam.lr = 0.01 ;

%開始訓(xùn)練
net = train( net, input , output' ) ;

%讀取測(cè)試數(shù)據(jù)
[t1 t2 t3 t4 c] = textread('testData.txt' , '%f%f%f%f%f',150);

%測(cè)試數(shù)據(jù)歸一化
testInput = tramnmx ( [t1,t2,t3,t4]' , minI, maxI ) ;

%仿真
Y = sim( net , testInput )

%統(tǒng)計(jì)識(shí)別正確率
[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('識(shí)別率是 %3.3f%%',100 * hitNum / s2 )


  以上程序的識(shí)別率穩(wěn)定在95%左右,訓(xùn)練100次左右達(dá)到收斂,訓(xùn)練曲線如下圖所示:

圖9. 訓(xùn)練性能表現(xiàn)

 

(5)參數(shù)設(shè)置對(duì)神經(jīng)網(wǎng)絡(luò)性能的影響 

       我在實(shí)驗(yàn)中通過調(diào)整隱含層節(jié)點(diǎn)數(shù),選擇不通過的激活函數(shù),設(shè)定不同的學(xué)習(xí)率,

 

<1>隱含層節(jié)點(diǎn)個(gè)數(shù) 

  隱含層節(jié)點(diǎn)的個(gè)數(shù)對(duì)于識(shí)別率的影響并不大,但是節(jié)點(diǎn)個(gè)數(shù)過多會(huì)增加運(yùn)算量,使得訓(xùn)練較慢。

 

<2>激活函數(shù)的選擇 

       激活函數(shù)無論對(duì)于識(shí)別率或收斂速度都有顯著的影響。在逼近高次曲線時(shí),S形函數(shù)精度比線性函數(shù)要高得多,但計(jì)算量也要大得多。

 

<3>學(xué)習(xí)率的選擇 

       學(xué)習(xí)率影響著網(wǎng)絡(luò)收斂的速度,以及網(wǎng)絡(luò)能否收斂。學(xué)習(xí)率設(shè)置偏小可以保證網(wǎng)絡(luò)收斂,但是收斂較慢。相反,學(xué)習(xí)率設(shè)置偏大則有可能使網(wǎng)絡(luò)訓(xùn)練不收斂,影響識(shí)別效果。

 

3. 使用AForge.NET實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò) 

(1) AForge.NET簡介 

       AForge.NET是一個(gè)C#實(shí)現(xiàn)的面向人工智能、計(jì)算機(jī)視覺等領(lǐng)域的開源架構(gòu)。AForge.NET源代碼下的Neuro目錄包含一個(gè)神經(jīng)網(wǎng)絡(luò)的類庫。

AForge.NET主頁:http://www.aforgenet.com/

AForge.NET代碼下載:http://code.google.com/p/aforge/

Aforge.Neuro工程的類圖如下:

 

圖10. AForge.Neuro類庫類圖

 

下面介紹圖9中的幾個(gè)基本的類:

Neuron —神經(jīng)元的抽象基類

Layer — 層的抽象基類,由多個(gè)神經(jīng)元組成

Network —神經(jīng)網(wǎng)絡(luò)的抽象基類,由多個(gè)層(Layer)組成

IActivationFunction - 激活函數(shù)(activation function)的接口

IUnsupervisedLearning - 無導(dǎo)師學(xué)習(xí)(unsupervised learning)算法的接口ISupervisedLearning - 有導(dǎo)師學(xué)習(xí)(supervised learning)算法的接口

 

(2)使用Aforge建立BP神經(jīng)網(wǎng)絡(luò) 

       使用AForge建立BP神經(jīng)網(wǎng)絡(luò)會(huì)用到下面的幾個(gè)類:

<1>  SigmoidFunction : S形神經(jīng)網(wǎng)絡(luò)

  構(gòu)造函數(shù):public SigmoidFunction( doublealpha )

   參數(shù)alpha決定S形函數(shù)的陡峭程度。

<2>  ActivationNetwork :神經(jīng)網(wǎng)絡(luò)類

  構(gòu)造函數(shù):

  public ActivationNetwork( IActivationFunction function, int inputsCount, paramsint[] neuronsCount )

                         : base(inputsCount, neuronsCount.Length )

  public virtual double[] Compute( double[]input )

 

參數(shù)意義:

inputsCount:輸入個(gè)數(shù)

neuronsCount?。罕硎靖鲗由窠?jīng)元個(gè)數(shù)

<3>  BackPropagationLearning:BP學(xué)習(xí)算法

 構(gòu)造函數(shù):

public BackPropagationLearning( ActivationNetwork network )

 參數(shù)意義:

network :要訓(xùn)練的神經(jīng)網(wǎng)絡(luò)對(duì)象

BackPropagationLearning類需要用戶設(shè)置的屬性有下面2個(gè):

learningRate :學(xué)習(xí)率

momentum :沖量因子

下面給出一個(gè)用AForge構(gòu)建BP網(wǎng)絡(luò)的代碼。

 

// 創(chuàng)建一個(gè)多層神經(jīng)網(wǎng)絡(luò),采用S形激活函數(shù),各層分別有4,5,3個(gè)神經(jīng)元
//(其中4是輸入個(gè)數(shù),3是輸出個(gè)數(shù),5是中間層結(jié)點(diǎn)個(gè)數(shù))
ActivationNetwork network = new ActivationNetwork(
new SigmoidFunction(2), 4, 5, 3);

// 創(chuàng)建訓(xùn)練算法對(duì)象
BackPropagationLearning teacher = new
BackPropagationLearning(network);

// 設(shè)置BP算法的學(xué)習(xí)率與沖量系數(shù)
teacher.LearningRate = 0.1;
teacher.Momentum = 0;

int iteration = 1 ;

// 迭代訓(xùn)練500次
while( iteration < 500 )
{
teacher.RunEpoch( trainInput , trainOutput ) ;
++iteration ;
}

//使用訓(xùn)練出來的神經(jīng)網(wǎng)絡(luò)來分類,t為輸入數(shù)據(jù)向量
network.Compute(t)[0]

 

       改程序?qū)ris 數(shù)據(jù)進(jìn)行分類,識(shí)別率可達(dá)97%左右 。


     點(diǎn)擊下載源代碼


  文章來自:http://www.cnblogs.com/heaad/  

  轉(zhuǎn)載請(qǐng)保留出處,thx!


參考文獻(xiàn) 

[1] AndrewKirillov. 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. 模式分類. 機(jī)械工業(yè)出版社. 2010.4

[4] Wikipedia. Irisflower data set. [Online].      

http://en.wikipedia.org/wiki/Iris_flower_data_set 

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
BP神經(jīng)網(wǎng)絡(luò)
SVM與神經(jīng)網(wǎng)絡(luò)模型在股票預(yù)測(cè)中的應(yīng)用研究
人工神經(jīng)網(wǎng)絡(luò)(ANN)簡述
BP神經(jīng)網(wǎng)絡(luò)推導(dǎo)過程詳解
[DL學(xué)習(xí)筆記]從人工神經(jīng)網(wǎng)絡(luò)到卷積神經(jīng)網(wǎng)絡(luò)
Coursera公開課筆記: 斯坦福大學(xué)機(jī)器學(xué)習(xí)第九課“神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)(Neural Networks: Learning)”
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服