神經(jīng)網(wǎng)絡(luò)設(shè)計小結(jié)_第1頁
神經(jīng)網(wǎng)絡(luò)設(shè)計小結(jié)_第2頁
神經(jīng)網(wǎng)絡(luò)設(shè)計小結(jié)_第3頁
神經(jīng)網(wǎng)絡(luò)設(shè)計小結(jié)_第4頁
神經(jīng)網(wǎng)絡(luò)設(shè)計小結(jié)_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、3 數(shù)字版的神經(jīng)網(wǎng)絡(luò) (The Digital Version)上面我們看到了生物的大腦是由許多神經(jīng)細(xì)胞組成,同樣,模擬大腦的人工神經(jīng)網(wǎng)絡(luò)ANN是由許多叫做人工神經(jīng)細(xì)胞(Artificialneuron,也稱人工神經(jīng)原,或人工神經(jīng)元)的細(xì)小結(jié)構(gòu)模塊組成。人工神經(jīng)細(xì)胞就像真實神經(jīng)細(xì)胞的一個簡化版,但采用了電子方式來模擬實現(xiàn)。一個人工神經(jīng)網(wǎng)絡(luò)中需要使用多少個數(shù)的人工神經(jīng)細(xì)胞,差別可以非常大。有的神經(jīng)網(wǎng)絡(luò)只需要使用10個以內(nèi)的人工神經(jīng)細(xì)胞,而有的神經(jīng)網(wǎng)絡(luò)可能需要使用幾千個人工神經(jīng)細(xì)胞。這完全取決于這些人工神經(jīng)網(wǎng)絡(luò)準(zhǔn)備實際用來做什么。有趣的事實       有一

2、個叫 Hugo deGaris的同行,曾在一個雄心勃勃的工程中創(chuàng)建并訓(xùn)練了一個包含1000,000,000個人工神經(jīng)細(xì)胞的網(wǎng)絡(luò)。這個人工神經(jīng)網(wǎng)絡(luò)被他非常巧妙地建立起來了,它采用蜂房式自動機結(jié)構(gòu),目的就是為一機器客戶定制一個叫做CAM BrainMachine(“CAM大腦機器”)的機器(CAM就是Cellular AutomataMachine的縮寫)。此人曾自夸地宣稱這一人工網(wǎng)絡(luò)機器將會有一只貓的智能。許多神經(jīng)網(wǎng)絡(luò)研究人員認(rèn)為他是在“登星”了,但不幸的是,雇用他的公司在他的夢想尚未實現(xiàn)之前就破產(chǎn)了。此人現(xiàn)在猶他州,是猶他州大腦工程(Utah BrainProject)的領(lǐng)導(dǎo)。時間將會告訴我們

3、他的思想最終是否能變成實際有意義的東西。譯注 我想你現(xiàn)在可能很想知道,一個人工神經(jīng)細(xì)胞究竟是一個什么樣的東西?但是,它實際上什么東西也不像; 它只是一種抽象。還是讓我們來察看一下圖2吧,這是表示一個人工神經(jīng)細(xì)胞的一種形式。譯注Hugo de Garis現(xiàn)在為猶他州立大學(xué)教授,有關(guān)他和他的CAM機器,可在該校網(wǎng)站的一個網(wǎng)頁上看到報道,其上有真實的照片,見/degaris圖2 一個人工神經(jīng)細(xì)胞圖中,左邊幾個灰底圓中所標(biāo)字母w代表浮點數(shù),稱為權(quán)重(weight,或權(quán)值,權(quán)數(shù))。進入人工神經(jīng)細(xì)胞的每一個input(輸入)都與一個權(quán)重w相聯(lián)系,正是這些權(quán)重將決定神

4、經(jīng)網(wǎng)絡(luò)的整體活躍性。你現(xiàn)在暫時可以設(shè)想所有這些權(quán)重都被設(shè)置到了-和之間的一個隨機小數(shù)。因為權(quán)重可正可負(fù),故能對與它關(guān)聯(lián)的輸入施加不同的影響,如果權(quán)重為正,就會有激發(fā)(excitory)作用,權(quán)重為負(fù),則會有抑制(inhibitory)作用。當(dāng)輸入信號進入神經(jīng)細(xì)胞時,它們的值將與它們對應(yīng)的權(quán)重相乘,作為圖中大圓的輸入。大圓的核是一個函數(shù),叫激勵函數(shù)(activationfunction),它把所有這些新的、經(jīng)過權(quán)重調(diào)整后的輸入全部加起來,形成單個的激勵值(activationvalue)。激勵值也是一浮點數(shù),且同樣可正可負(fù)。然后,再根據(jù)激勵值來產(chǎn)生函數(shù)的輸出也即神經(jīng)細(xì)胞的輸出:如果激勵值超過某個

5、閥值(作為例子我們假設(shè)閥值為1.0),就會產(chǎn)生一個值為1的信號輸出;如果激勵值小于閥值1.0,則輸出一個0。這是人工神經(jīng)細(xì)胞激勵函數(shù)的一種最簡單的類型。在這里,從激勵值產(chǎn)生輸出值是一個階躍函數(shù)譯注??匆豢磮D3后你就能猜到為什么有這樣的名稱。圖3 階躍激勵函數(shù)譯注 由圖可知階躍函數(shù)是一元的,而激勵函數(shù)既然能把多個輸入相加應(yīng)為多元,故需加以區(qū)別。如果到目前為止你對這些還沒有獲得很多感覺,那也不必?fù)?dān)心。竅門就是: 不要企圖去感覺它,暫時就隨波逐流地跟我一起向前走吧。在經(jīng)歷本章的若干處后,你最終就會開始弄清楚它們的意義。而現(xiàn)在,就放松一點繼續(xù)讀下去吧。3.1 現(xiàn)在需要一些數(shù)學(xué)了(Now for Som

6、e Math) 今后討論中,我將盡量把數(shù)學(xué)降低到絕對少量,但學(xué)習(xí)一些數(shù)學(xué)記號對下面還是很有用的。我將把數(shù)學(xué)一點一點地喂給你,在到達有關(guān)章節(jié)時向你介紹一些新概念。我希望采用這樣的方式能使你的頭腦能更舒適地吸收所有的概念,并使你在開發(fā)神經(jīng)網(wǎng)絡(luò)的每個階段都能看到怎樣把數(shù)學(xué)應(yīng)用到工作中?,F(xiàn)在首先讓我們來看一看,怎樣把我在此之前告訴你的所有知識用數(shù)學(xué)方式表達出來。 一個人工神經(jīng)細(xì)胞(從現(xiàn)在開始,我將把“人工神經(jīng)細(xì)胞”簡稱它為“神經(jīng)細(xì)胞”) 可以有任意n個輸入,n代表總數(shù)??梢杂孟旅娴臄?shù)學(xué)表達式來代表所有n個輸入:         x1, x2,

7、 x3, x4, x5, ., xn同樣 n 個權(quán)重可表達為:         w1, w2, w3, w4, w5 ., wn請記住,激勵值就是所有輸入與它們對應(yīng)權(quán)重的之乘積之總和,因此,現(xiàn)在就可以寫為:         a = w1x1 + w2x2 + w3x3 + w4x4 + w5x5 +.+ wnxn以這種方式寫下的求和式,我在第5章“建立一個更好的遺傳算法”中已提到,可以用希臘字母來簡化:注:神經(jīng)網(wǎng)絡(luò)的各個輸入,以及為各個神經(jīng)細(xì)胞的權(quán)重設(shè)置,都可以看作一個n維的

8、向量。你在許多技術(shù)文獻中常??梢钥吹绞且赃@樣的方式來引用的。 下面我們來考察在程序中應(yīng)該怎樣實現(xiàn)?假設(shè)輸入數(shù)組和權(quán)重數(shù)組均已初始化為xn和wn,則求和的代碼如下:double activation = 0;for(int i=0; i<n; +i)activation += x * w;圖4以圖形的方式表示了此方程。請別忘記,如果激勵值超過了閥值,神經(jīng)細(xì)胞就輸出1;如果激活小于閥值,則神經(jīng)細(xì)胞的輸出為0。這和一個生物神經(jīng)細(xì)胞的興奮和抑制是等價的。我們假設(shè)一個神經(jīng)細(xì)胞有5個輸入,他們的權(quán)重w都初始化成正負(fù)1之間的隨機值(-1 < w < 1) 。 表2說明了激勵值的求和計算過程

9、。 圖4 神經(jīng)細(xì)胞的激勵函數(shù)         如果我們假定激活所需閥值=1,則因激勵值1.1 > 激活閥值,所以這個神經(jīng)細(xì)胞將輸出1。 在進一步讀下去之前,請你一定要確切弄懂激勵函數(shù)怎樣計算。表2  神經(jīng)細(xì)胞激勵值的計算             輸 入                     

10、    權(quán) 重                         輸入*權(quán)重的乘積                         運行后總和              

11、                    1                         0.5                         0

12、.5                         0.5                                   0          

13、;               -0.2                         0                         0.5     &

14、#160;                            1                          -0.3                

15、          -0.3                          0.2                                   1

16、                         0.9                         0.9                    

17、;      1.1                                   0                         0.1     

18、                    0                         1.1            3.2  行,我知道什么是神經(jīng)細(xì)胞了,但用它來干什么呢?大腦里的生物神經(jīng)細(xì)胞和其他的神經(jīng)

19、細(xì)胞是相互連接在一起的。為了創(chuàng)建一個人工神經(jīng)網(wǎng)絡(luò),人工神經(jīng)細(xì)胞也要以同樣方式相互連接在一起。為此可以有許多不同的連接方式,其中最容易理解并且也是最廣泛地使用的,就是如圖5所示那樣,把神經(jīng)細(xì)胞一層一層地連結(jié)在一起。這一種類型的神經(jīng)網(wǎng)絡(luò)就叫前饋網(wǎng)絡(luò)(feedforwordnetwork)。這一名稱的由來,就是因為網(wǎng)絡(luò)的每一層神經(jīng)細(xì)胞的輸出都向前饋送(feed)到了它們的下一層(在圖中是畫在它的上面的那一層),直到獲得整個網(wǎng)絡(luò)的輸出為止。圖5 一個前饋網(wǎng)絡(luò) 由圖可知,網(wǎng)絡(luò)共有三層(譯注:輸入層不是神經(jīng)細(xì)胞,神經(jīng)細(xì)胞只有兩層)。輸入層中的每個輸入都饋送到了隱藏層,作為該層每一個神經(jīng)細(xì)胞的輸入;然后,從

20、隱藏層的每個神經(jīng)細(xì)胞的輸出都連到了它下一層(即輸出層)的每一個神經(jīng)細(xì)胞。圖中僅僅畫了一個隱藏層,作為前饋網(wǎng)絡(luò),一般地可以有任意多個隱藏層。但在對付你將處理的大多數(shù)問題時一層通常是足夠的。事實上,有一些問題甚至根本不需要任何隱藏單元,你只要把那些輸入直接連結(jié)到輸出神經(jīng)細(xì)胞就行了。另外,我為圖5選擇的神經(jīng)細(xì)胞的個數(shù)也是完全任意的。每一層實際都可以有任何數(shù)目的神經(jīng)細(xì)胞,這完全取決于要解決的問題的復(fù)雜性。但神經(jīng)細(xì)胞數(shù)目愈多,網(wǎng)絡(luò)的工作速度也就愈低,由于這一緣故,以及為了其他的幾種原因(我將在第9章作出解釋),網(wǎng)絡(luò)的規(guī)??偸且蟊3直M可能的小。 到此我能想象你或許已對所有這些信息感到有些茫然了。我認(rèn)為,

21、在這種情況下,我能做的最好的事情,就是向你介紹一個神經(jīng)網(wǎng)絡(luò)在現(xiàn)實世界中的實際應(yīng)用例子,它有望使你自己的大腦神經(jīng)細(xì)胞得到興奮!不錯吧?好的,下面就來了.    你可能已聽到或讀到過神經(jīng)網(wǎng)絡(luò)常常用來作模式識別。這是因為它們善于把一種輸入狀態(tài)(它所企圖識別的模式)映射到一種輸出狀態(tài)(它曾被訓(xùn)練用來識別的模式)。下面我們來看它是怎么完成的。我們以字符識別作為例子。設(shè)想有一個由8x8個格子組成的一塊面板。每一個格子里放了一個小燈,每個小燈都可獨立地被打開(格子變亮)或關(guān)閉(格子變黑),這樣面板就可以用來顯示十個數(shù)字符號。圖6顯示了數(shù)字“4”。 圖6  用于字符顯示

22、的矩陣格點要解決這一問題,我們必需設(shè)計一個神經(jīng)網(wǎng)絡(luò),它接收面板的狀態(tài)作為輸入,然后輸出一個1或0;輸出1代表ANN確認(rèn)已顯示了數(shù)字“4”,而輸出0表示沒有顯示“4”。因此,神經(jīng)網(wǎng)絡(luò)需要有64個輸入(每一個輸入代表面板的一個具體格點)和由許多神經(jīng)細(xì)胞組成的一個隱藏層,還有僅有一個神經(jīng)細(xì)胞的輸出層,隱藏層的所有輸出都饋送到它。我真希望你能在你的頭腦中畫出這個圖來,因為要我為你把所有這些小圓和連線統(tǒng)統(tǒng)畫出來確實不是一樁愉快的事<一笑>。一旦神經(jīng)網(wǎng)絡(luò)體系創(chuàng)建成功后,它必須接受訓(xùn)練來認(rèn)出數(shù)字“4”。為此可用這樣一種方法來完成:先把神經(jīng)網(wǎng)的所有權(quán)重初始化為任意值。然后給它一系列的輸入,在本例中

23、,就是代表面板不同配置的輸入。對每一種輸入配置,我們檢查它的輸出是什么,并調(diào)整相應(yīng)的權(quán)重。如果我們送給網(wǎng)絡(luò)的輸入模式不是“4”,則我們知道網(wǎng)絡(luò)應(yīng)該輸出一個0。因此每個非“4”字符時的網(wǎng)絡(luò)權(quán)重應(yīng)進行調(diào)節(jié),使得它的輸出趨向于0。當(dāng)代表“4”的模式輸送給網(wǎng)絡(luò)時,則應(yīng)把權(quán)重調(diào)整到使輸出趨向于1。 如果你考慮一下這個網(wǎng)絡(luò),你就會知道要把輸出增加到10是很容易的。然后通過訓(xùn)練,就可以使網(wǎng)絡(luò)能識別0到9的所有數(shù)字。但為什么我們到此停止呢?我們還可以進一步增加輸出,使網(wǎng)絡(luò)能識別字母表中的全部字符。這本質(zhì)上就是手寫體識別的工作原理。對每個字符,網(wǎng)絡(luò)都需要接受許多訓(xùn)練,使它認(rèn)識此文字的各種不同的版本。到最后,網(wǎng)絡(luò)

24、不單能認(rèn)識已經(jīng)訓(xùn)練的筆跡,還顯示了它有顯著的歸納和推廣能力。也就是說,如果所寫文字換了一種筆跡,它和訓(xùn)練集中所有字跡都略有不同,網(wǎng)絡(luò)仍然有很大幾率來認(rèn)出它。正是這種歸納推廣能力,使得神經(jīng)網(wǎng)絡(luò)已經(jīng)成為能夠用于無數(shù)應(yīng)用的一種無價的工具,從人臉識別、醫(yī)學(xué)診斷,直到跑馬賽的預(yù)測,另外還有電腦游戲中的bot(作為游戲角色的機器人)的導(dǎo)航,或者硬件的robot(真正的機器人)的導(dǎo)航。     這種類型的訓(xùn)練稱作有監(jiān)督的學(xué)習(xí)(supervisedlearnig),用來訓(xùn)練的數(shù)據(jù)稱為訓(xùn)練集(trainingset)。調(diào)整權(quán)重可以采用許多不同的方法。對本類問題最常用的方法

25、就是反向傳播(backpropagation,簡稱backprop或BP)方法。有關(guān)反向傳播問題,我將會在本書的后面,當(dāng)你已能訓(xùn)練神經(jīng)網(wǎng)絡(luò)來識別鼠標(biāo)走勢時,再來進行討論。在本章剩余部分我將集中注意力來考察另外的一種訓(xùn)練方式,即根本不需要任何導(dǎo)師來監(jiān)督的訓(xùn)練,或稱無監(jiān)督學(xué)習(xí)(unsupervised learnig)。     這樣我已向你介紹了一些基本的知識,現(xiàn)在讓我們來考察一些有趣的東西,并向你介紹第一個代碼工程。4.4  CNeuralNet.h(神經(jīng)網(wǎng)絡(luò)類的頭文件)在CNeuralNet.h 文件中,我們定義了人工神經(jīng)細(xì)胞的結(jié)構(gòu)

26、、定義了人工神經(jīng)細(xì)胞的層的結(jié)構(gòu)、以及人工神經(jīng)網(wǎng)絡(luò)本身的結(jié)構(gòu)。首先我們來考察人工神經(jīng)細(xì)胞的結(jié)構(gòu)。4.4.1  SNeuron(神經(jīng)細(xì)胞的結(jié)構(gòu)) 這是很簡單的結(jié)構(gòu)。人工神經(jīng)細(xì)胞的結(jié)構(gòu)中必須有一個正整數(shù)來紀(jì)錄它有多少個輸入,還需要有一個向量std:vector來表示它的權(quán)重。請記住,神經(jīng)細(xì)胞的每一個輸入都要有一個對應(yīng)的權(quán)重。Struct SNeuron     / 進入神經(jīng)細(xì)胞的輸入個數(shù)     int m_NumInputs;        

27、;  / 為每一輸入提供的權(quán)重     vector<double> m_vecWeight;          /構(gòu)造函數(shù)     SNeuron(int NumInputs);  以下就是SNeuron 結(jié)構(gòu)體的構(gòu)造函數(shù)形式:SNeuron:SNeuron(int NumInputs): m_NumInputs(NumInputs+1)(    

28、60;/ 我們要為偏移值也附加一個權(quán)重,因此輸入數(shù)目上要 +1     for (int i=0; i<NumInputs+1; +i)              / 把權(quán)重初始化為任意的值         m_vecWeight.push_back(RandomClamped();     由上可以看出,構(gòu)造函數(shù)把送進神經(jīng)細(xì)胞的輸入數(shù)目NumInpu

29、ts作為一個變元,并為每個輸入創(chuàng)建一個隨機的權(quán)重。所有權(quán)重值在-1和1之間。        這是什么? 我聽見你在說。這里多出了一個權(quán)重! 不錯,我很高興看到你能注意到這一點,因為這一個附加的權(quán)重十分重要。但要解釋它為什么在那里,我必須更多地介紹一些數(shù)學(xué)知識。回憶一下你就能記得,激勵值是所有輸入*權(quán)重的乘積的總和,而神經(jīng)細(xì)胞的輸出值取決于這個激勵值是否超過某個閥值(t)。這可以用如下的方程來表示:         w1x1 + w2x2 + w3x3 +.+ wnxn >

30、;= t上式是使細(xì)胞輸出為的條件。因為網(wǎng)絡(luò)的所有權(quán)重需要不斷演化(進化),如果閥值的數(shù)據(jù)也能一起演化,那將是非常重要的。要實現(xiàn)這一點不難,你使用一個簡單的詭計就可以讓閥值變成權(quán)重的形式。從上面的方程兩邊各減去t,得:        w1x1 + w2x2 + w3x3 +.+ wnxn t >= 0這個方程可以再換用一種形式寫出來,如下:        w1x1 + w2x2 + w3x3 +.+ wnxn + t *(1) >= 0到此,我希望你已能看出,閥值t

31、為什么可以想像成為始終乘以輸入為-的權(quán)重了。這個特殊的權(quán)重通常叫偏移(bias),這就是為什么每個神經(jīng)細(xì)胞初始化時都要增加一個權(quán)重的理由?,F(xiàn)在,當(dāng)你演化一個網(wǎng)絡(luò)時,你就不必再考慮閥值問題,因為它已被內(nèi)建在權(quán)重向量中了。怎么樣,想法不錯吧?為了讓你心中絕對敲定你所學(xué)到的新的人工神經(jīng)細(xì)胞是什么樣子,請再參看一下圖12。圖12 帶偏移的人工神經(jīng)細(xì)胞。4.4.2  SNeuronLayer(神經(jīng)細(xì)胞層的結(jié)構(gòu)) 神經(jīng)細(xì)胞層SNeuronLayer的結(jié)構(gòu)很簡單;它定義了一個如圖13中所示的由虛線包圍的神經(jīng)細(xì)胞SNeuron所組成的層。 圖13 一個神經(jīng)細(xì)胞層。以下就是層的定義的源代碼,

32、它應(yīng)該不再需要任何進一步的解釋:struct SNeuronLayer   / 本層使用的神經(jīng)細(xì)胞數(shù)目  int                  m_NumNeurons;      / 神經(jīng)細(xì)胞的層  vector<SNeuron>   m_vecNeurons; SNeuronLayer(int NumNeurons, int NumInp

33、utsPerNeuron);;4.4.3  CNeuralNet(神經(jīng)網(wǎng)絡(luò)類)這是創(chuàng)建神經(jīng)網(wǎng)絡(luò)對象的類。讓我們來通讀一下這一個類的定義:class CNeuralNetprivate:    int                m_NumInputs;    int                m_NumOutputs; 

34、  int                m_NumHiddenLayers;    int       m_NeuronsPerHiddenLyr;    / 為每一層(包括輸出層)存放所有神經(jīng)細(xì)胞的存儲器     vector<SNeuronLayer>  m_vecLayers;所有private成員由其名稱容易得到理解。需要由本類定義的就是輸入的個

35、數(shù)、輸出的個數(shù)、隱藏層的數(shù)目、以及每個隱藏層中神經(jīng)細(xì)胞的個數(shù)等幾個參數(shù)。public:     CNeuralNet();該構(gòu)造函數(shù)利用ini文件來初始化所有的Private成員變量,然后再調(diào)用CreateNet來創(chuàng)建網(wǎng)絡(luò)。     / 由SNeurons創(chuàng)建網(wǎng)絡(luò)     void    CreateNet();我過一會兒馬上就會告訴你這個函數(shù)的代碼。     / 從神經(jīng)網(wǎng)絡(luò)得到(讀出)權(quán)重   

36、  vector<double>   GetWeights()const;由于網(wǎng)絡(luò)的權(quán)重需要演化,所以必須創(chuàng)建一個方法來返回所有的權(quán)重。這些權(quán)重在網(wǎng)絡(luò)中是以實數(shù)型向量形式表示的,我們將把這些實數(shù)表示的權(quán)重編碼到一個基因組中。當(dāng)我開始談?wù)摫竟こ痰倪z傳算法時,我將為您確切說明權(quán)重如何進行編碼。    / 返回網(wǎng)絡(luò)的權(quán)重的總數(shù)    int GetNumberOfWeights()const;    / 用新的權(quán)重代替原有的權(quán)重    void PutWeights(v

37、ector<double> &weights);        這一函數(shù)所做的工作與函數(shù)GetWeights所做的正好相反。當(dāng)遺傳算法執(zhí)行完一代時,新一代的權(quán)重必須重新插入神經(jīng)網(wǎng)絡(luò)。為我們完成這一任務(wù)的是PutWeight方法。        / S形響應(yīng)曲線    inline double Sigmoid(double activation, double response);     當(dāng)已知

38、一個神經(jīng)細(xì)胞的所有輸入*重量的乘積之和時,這一方法將它送入到S形的激勵函數(shù)。     / 根據(jù)一組輸入,來計算輸出     vector<double> Update(vector<double> &inputs);對此Update函數(shù)函數(shù)我馬上就會來進行注釋的。; / 類定義結(jié)束  CNeuralNet:CreateNet(創(chuàng)建神經(jīng)網(wǎng)絡(luò)的方法) 我在前面沒有對CNeuralNet的2個方法加以注釋,這是因為我要為你顯示它們的更完整的代碼。這2個方法

39、的第一個是網(wǎng)絡(luò)創(chuàng)建方法CreateNet。它的工作就是把由細(xì)胞層SNeuronLayers所收集的神經(jīng)細(xì)胞SNeurons聚在一起來組成整個神經(jīng)網(wǎng)絡(luò),代碼為:void CNeuralNet:CreateNet()    / 創(chuàng)建網(wǎng)絡(luò)的各個層    if (m_NumHiddenLayers > 0)            /創(chuàng)建第一個隱藏層譯注      m_vecLayers.push_back(SNeuronLayer(m_N

40、euronsPerHiddenLyr,                                           m_NumInputs);     for( int i=O; i<m_NumHiddenLayers-l; +i)   

41、0;         m_vecLayers.push_back(SNeuronLayer(m_NeuronsPerHiddenLyr,                                             &#

42、160;    m_NeuronsPerHiddenLyr);      譯注如果允許有多個隱藏層,則由接著for循環(huán)即能創(chuàng)建其余的隱藏層。      / 創(chuàng)建輸出層      m_vecLayers.push_back(SNeuronLayer(m_NumOutput,m_NeuronsPerHiddenLyr);   else /無隱藏層時,只需創(chuàng)建輸出層        &

43、#160; / 創(chuàng)建輸出層        m_vecLayers.push_back(SNeuronLayer(m_NumOutputs, m_NumInputs);     CNeuralNet:Update(神經(jīng)網(wǎng)絡(luò)的更新方法)Update函數(shù)(更新函數(shù))稱得上是神經(jīng)網(wǎng)絡(luò)的“主要勞動力”了。這里,輸入網(wǎng)絡(luò)的數(shù)據(jù)input是以雙精度向量std:vector的數(shù)據(jù)格式傳遞進來的。Update函數(shù)通過對每個層的循環(huán)來處理輸入*權(quán)重的相乘與求和,再以所得的和數(shù)作為激勵值,通過S形函數(shù)來

44、計算出每個神經(jīng)細(xì)胞的輸出,正如我們前面最后幾頁中所討論的那樣。Update函數(shù)返回的也是一個雙精度向量std:vector,它對應(yīng)的就是人工神經(jīng)網(wǎng)絡(luò)的所有輸出。       請你自己花兩分鐘或差不多的時間來熟悉一下如下的Update函數(shù)的代碼,這能使你正確理解我們繼續(xù)要講的其他內(nèi)容:vector<double> CNeuralNet:Update(vector<double> &inputs)     / 保存從每一層產(chǎn)生的輸出     vec

45、tor<double> outputs;     int cWeight = 0;      / 首先檢查輸入的個數(shù)是否正確     if (inputs.size() != m_NumInputs)                / 如果不正確,就返回一個空向量          return outputs;           / 對每一層,.     for (int i=0; i<m_NumHiddenLayers+1; +i)            if (i>O)                     inputs = ou

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論