




已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
BP神經(jīng)網(wǎng)絡(luò)演示程序及代碼說(shuō)明為了配合PPT講解BP神經(jīng)網(wǎng)絡(luò)原理的需要,這幾天寫(xiě)了這個(gè)基于BP神經(jīng)網(wǎng)絡(luò)的演示程序,主界面如圖:關(guān)于BP神經(jīng)網(wǎng)絡(luò)的基本原理,我覺(jué)得沒(méi)有太多的必要在這里講得很細(xì),如果讀者不是很清楚,可以先看看相關(guān)書(shū)籍或論文,可以推薦幾個(gè)如: 1.的第4章,Tom.M.Mitchell著,此書(shū)非常好,把BP原理講得非常透徹,由其是誤差的公式推導(dǎo),比別的書(shū)都說(shuō)得清楚一點(diǎn),該書(shū)出過(guò)中文版,由曾華軍等人翻譯. 2.,這本手冊(cè)第5章就是歷史上第一次提出將BP算法應(yīng)用于神經(jīng)網(wǎng)絡(luò)的,非常值得一看.網(wǎng)上能下到最新版(第二版的DRAFT版)的PDF,時(shí)間是2010年2月份的,很新了. 3.韓力群教授寫(xiě)的幾本神經(jīng)網(wǎng)絡(luò)的書(shū),都很不錯(cuò),講得比較淺顯易懂 4.,這本書(shū)的第7章講BP,講得很細(xì),值得看,電子版網(wǎng)上能下到. 5.網(wǎng)上的教程也不少,比如這個(gè): /articles/backpropagation-neural-network/ 6.實(shí)在理解不了,試著聯(lián)系我吧,我也樂(lè)意與您溝通,我的聯(lián)系方式在這個(gè)演示程序的About對(duì)話(huà)框內(nèi)能找到. 在這里主要提幾點(diǎn): 1.BP神經(jīng)網(wǎng)絡(luò)屬于監(jiān)督學(xué)習(xí)范疇,除了給定訓(xùn)練樣本數(shù)據(jù)外,必須給出該樣本對(duì)應(yīng)的標(biāo)記 2.學(xué)習(xí)率和沖量項(xiàng)設(shè)置有一定講究,不能隨意,大了可能不收斂,小了收斂慢 3.隱藏層節(jié)點(diǎn)個(gè)數(shù)需要多少,沒(méi)有理論指導(dǎo),都是經(jīng)驗(yàn)指導(dǎo) 4.是采用標(biāo)準(zhǔn)梯度下降,還是delta法則,關(guān)系不大,只要學(xué)習(xí)率足夠小,delta法則可逼近標(biāo)準(zhǔn)梯度下降法. 5.BP神經(jīng)網(wǎng)絡(luò)的性能和樣本訓(xùn)練前的前期處理有密切關(guān)系,識(shí)別率低,不一定是網(wǎng)絡(luò)不好,可能是特征提取不好,特征組合有問(wèn)題,等等,很多原因. 下面講一下,怎么運(yùn)行這個(gè)演示程序: 1.下載本文附帶的壓縮包,并解壓至某路徑,比如: D: 2.注冊(cè)控件,可以雙擊那個(gè)reg_ax.bat文件即可,它會(huì)自動(dòng)注冊(cè)同一路徑下的facerecognization.dll文件,這是我寫(xiě)的用于顯 示PGM圖片的ActiveX控件,不注冊(cè)的話(huà),就不能顯示圖片了,顯示效果如上面的截圖(所有圖片分辯率為32*30,所以有點(diǎn)小),注冊(cè)后就不要移動(dòng) 這個(gè)dll文件,否則需要再次注冊(cè)(明白COM組件的工作原理就會(huì)知道了) 3.通過(guò)1,2兩步,現(xiàn)在就可以正常運(yùn)行BPNNTest.exe這個(gè)程序了.運(yùn)行后界面如上圖,不過(guò)這時(shí)還沒(méi)有訓(xùn)練神經(jīng)網(wǎng)絡(luò). 下載人臉庫(kù): BP網(wǎng)絡(luò)需要先訓(xùn)練,我寫(xiě)程序時(shí)使用的是CMU的人臉庫(kù),下載地址是:/afs//project/theo-8/faceimages/faces_4.tar.Z人臉圖片用的是32*30分辨率,PGM格式的圖片,文件名命名規(guī)則是:人名_人臉朝向_心情_(kāi)是否戴太陽(yáng)鏡_4.pgm,例 如:danieln_left_angry_open_4.pgm,因此,從這個(gè)文件名中,我們可以得到四個(gè)信息,分別是:人名,朝向,心情,是否戴太陽(yáng) 鏡,而文件本身的數(shù)據(jù)可以作為訓(xùn)練網(wǎng)絡(luò)的特征向量,而這四個(gè)信息則均可以用于特征向量對(duì)應(yīng)的標(biāo)記. 將上面鏈接下載的人臉庫(kù)解壓至某一路徑下,如D盤(pán)根目錄下,會(huì)發(fā)現(xiàn)faces_4文件夾內(nèi)有很多子文件夾,分別名為:an2i,at33.等,而這些子文件夾內(nèi)就是各自的pgm圖片文件. 因?yàn)?BP神經(jīng)網(wǎng)絡(luò)需要訓(xùn)練和測(cè)試兩個(gè)樣本集,你可以隨便把faces_4中的某個(gè)(或某幾個(gè))文件夾從中剪切出來(lái),作為測(cè)試樣本集,而其余的作為訓(xùn)練樣本集.比如,將tammo文件夾從中剪切到D:下.最終形成的目錄結(jié)構(gòu)應(yīng)該類(lèi)似于這樣: 訓(xùn)練樣本集: D:faces_4很多子文件夾很多pgm文件 測(cè)試樣本集: D:tammo很多pgm文件 注意faces_4內(nèi)都是目錄,而tammo內(nèi)都是pgm文件,這很重要,因?yàn)槲椰F(xiàn)在程序?qū)懙镁褪前催@個(gè)方式處理的. 準(zhǔn)備工作就續(xù),現(xiàn)在就可以訓(xùn)練和測(cè)試網(wǎng)絡(luò)了: 1.選擇訓(xùn)練集點(diǎn)擊對(duì)話(huà)框左上角的Select按鈕,彈出對(duì)話(huà)框,先擇之前解壓后的faces_4文件夾:選中faces_4文件夾后,點(diǎn)擊OK按鈕(你的電腦可能是確定按鈕),程序會(huì)讀取文件夾內(nèi)所含PGM圖片信息,并顯示讀到的第一張圖片. 2.訓(xùn)練BP網(wǎng)絡(luò) 2.1 你可以選擇訓(xùn)練BP網(wǎng)絡(luò)去學(xué)習(xí)什么功能,默認(rèn)是學(xué)習(xí)Direction,即人臉朝向,你可以通過(guò)對(duì)話(huà)框左上角的ComboBox選擇四種類(lèi)型:人名,朝向,心情,是否戴太陽(yáng)鏡 2.2 選擇迭代次數(shù)(iterate time)或停止迭代誤差(Stop Error),兩者默認(rèn)值為100000和0.003,即分別表示迭代到100000次時(shí)停止(不管誤差多少),或迭代直到誤差小于指定值時(shí)停止(可能會(huì) 迭代很多很多次).這里說(shuō)明一下,程序里,我為了讓每張人臉圖片都被訓(xùn)練到相同次數(shù),使得這里的100000次是訓(xùn)練的下界,到達(dá)100000次迭代時(shí), 可能還沒(méi)有訓(xùn)練到樣本集中最后一個(gè)樣本,因此會(huì)多訓(xùn)練幾次,如最上面的截圖中,一共迭代了100215次.另外,由于程序使用的是delta法則來(lái)訓(xùn)練本 樣,這里的誤差是每個(gè)樣本訓(xùn)練完后的平均誤差,而不是當(dāng)前訓(xùn)練圖片的誤差. 2.3 確定隱藏層神經(jīng)元個(gè)數(shù)(Hidden layer units),默認(rèn)為3個(gè)(網(wǎng)絡(luò)只含一個(gè)隱藏層,多層網(wǎng)絡(luò)其實(shí)也一樣),由于所需隱單元個(gè)數(shù)的多少目前仍而理論依據(jù),因此當(dāng)隱層個(gè)數(shù)太少,無(wú)法達(dá)到識(shí)別率時(shí),考慮調(diào)大一點(diǎn),不過(guò)由于隱層個(gè)數(shù)調(diào)大后,權(quán)值會(huì)增加,訓(xùn)練會(huì)明顯變慢.另外,當(dāng)BP網(wǎng)絡(luò)要學(xué)習(xí)目標(biāo)比較復(fù)雜時(shí),隱層單元個(gè)數(shù)不因過(guò)少,不然可能無(wú)法收斂. 2.3* 為什么不用設(shè)置輸入層和輸出層單元個(gè)數(shù)? 因?yàn)?為了方便,程序自動(dòng)讀取圖片,分析文件的分辯率自動(dòng)確定輸入層單元個(gè)數(shù)(沒(méi)有做特征提取,就是圖片像素?cái)?shù)),通過(guò)分析樣本集中目標(biāo)值的可取個(gè)數(shù),自動(dòng)確定輸出層單元個(gè)數(shù),比如,分析樣本集文件后,得到所有Direction可取的值就只有4種,于是,如果采用1of n方式設(shè)計(jì)輸出層單元(本程序采用的方式),就有4個(gè)輸出單元. 2.4 確定學(xué)習(xí)速率(learning rate)和沖量(momentum),默認(rèn)值都是0.3,我沒(méi)嘗試過(guò)很多值,大概設(shè)了一下,不要設(shè)太大,可能導(dǎo)致無(wú)法收斂,太小會(huì)收斂很慢,是很慢很慢,不信你把兩個(gè)值都調(diào)成0.03,迭代100000次后的誤差仍然很大. 2.5 參數(shù)都設(shè)好了,點(diǎn)擊Train按鈕 開(kāi)始訓(xùn)練吧,對(duì)話(huà)框下方的Status會(huì)動(dòng)態(tài)顯示當(dāng)前迭代的次數(shù),而圖片下方也會(huì)動(dòng)態(tài)更新當(dāng)前迭代中的圖片路徑.要說(shuō)明的是:如果迭代次數(shù)少,很快就 會(huì)訓(xùn)練完,如果次數(shù)多的話(huà),就看你電腦的性能了,在我的老本本(T40p)上,迭代100000次,大概是90幾秒,現(xiàn)在的電腦速度都很快,訓(xùn)練時(shí)間應(yīng)該 會(huì)更短.雖然我沒(méi)有訓(xùn)練到將誤差降到小于0.003以下(我的電腦老,且以上參數(shù)沒(méi)有嘗試優(yōu)化過(guò)),但在訓(xùn)練100000次左右或更多的時(shí)候,識(shí)別精度已 經(jīng)可以達(dá)到80%左右,或以上(這和測(cè)試樣本有關(guān)),另外由于創(chuàng)建神經(jīng)網(wǎng)絡(luò)時(shí),我讓隱層至輸出層權(quán)值隨機(jī)生成,就算同樣訓(xùn)練100000次,結(jié)束時(shí)的誤差 也不會(huì)一樣.總之一句,你有足夠時(shí)間,并且電腦足夠快,一是嘗試調(diào)整學(xué)習(xí)率和沖量,二是迭代遍數(shù)多一點(diǎn),讓誤差可以再小一點(diǎn),這樣識(shí)別精度可能會(huì)更高. 2.5*為什么上面說(shuō)是可能,因?yàn)檫^(guò)度追求小的誤差會(huì)導(dǎo)致過(guò)度擬合,這里不展開(kāi)詳述. 2.6 訓(xùn)練完后,左邊的列表框(Error List)會(huì)列出訓(xùn)練過(guò)程的一些信息,包括這次訓(xùn)練總共花了多少時(shí)間(最上一行),第幾次(time)迭代,當(dāng)前迭代誤差(cur_err),平均誤差(avg_err). 3.測(cè)試BP網(wǎng)絡(luò) 測(cè)試功能,位于主對(duì)話(huà)框右上角,我做了兩個(gè),上面的一組select和varify按扭用于測(cè)試單張人臉圖片,下面一組select和varify按扭用于批量測(cè)試人臉圖片,并統(tǒng)計(jì)準(zhǔn)確率. 3.1 測(cè)試單張圖片 3.1.1 點(diǎn)右上第一個(gè)Select按鈕彈出打開(kāi)文件對(duì)話(huà)框:選中一張沒(méi)有訓(xùn)練過(guò)的人臉圖片(pgm格式),點(diǎn)擊Open按鈕(你的電腦可能是打開(kāi)銨鈕) 3.1.2 然后點(diǎn)擊右上的Varify按鈕,會(huì)顯示網(wǎng)絡(luò)對(duì)選中圖片的測(cè)試結(jié)果,結(jié)果顯示在下面的列表框(Varify Result)內(nèi),內(nèi)容如下:解釋一下: 一條橫線上面的四行表示: 網(wǎng)絡(luò)第幾個(gè)輸出單元=值,橫線下面的straight表示根據(jù)輸出層每個(gè)單元的值得出的結(jié)果:人臉朝向是正面(straight).正確與否可通過(guò)與文件名相應(yīng)信息比較可知. 3.2 人臉圖片批量測(cè)試 3.2.1 點(diǎn)右上第二個(gè)Select按鈕彈出打開(kāi)文件夾對(duì)話(huà)框:選擇之前存放測(cè)試樣本集人臉圖片的文件夾,如D:tammo,這個(gè)文件夾內(nèi)都是用于測(cè)試的pgm人臉圖片. 如果操作無(wú)誤,按鈕左邊會(huì)顯示選中文夾中的第一張人臉圖片. 3.2.2 然后點(diǎn)擊下面的Varify按鈕,會(huì)顯示網(wǎng)絡(luò)對(duì)選中文夾內(nèi)所有人臉圖片的測(cè)試結(jié)果,結(jié)果顯示在下面的列表框(Varify Result)內(nèi),內(nèi)容形式如下:解釋一下:由于文夾內(nèi)可能會(huì)有很多人臉文件,于輸出信息會(huì)有很多,但每個(gè)文件的測(cè)試輸出 信息都如3.1.2節(jié)中類(lèi)似,要說(shuō)明的有三點(diǎn):(1)最上面輸出被測(cè)試文件名.(2)輸出結(jié)果和正確結(jié)果有比較, 如:straightup,左邊straight為網(wǎng)絡(luò)輸出結(jié)果,右邊up為正確結(jié)果(從文件名中獲取),由于兩個(gè)內(nèi)容不同,所以該 圖片測(cè)試結(jié)果是錯(cuò)誤,即WRONG,如正確則顯示RIGHT.(3)最后顯示總的正確率,如上圖:Accurecy:83.33%. 4.保存和讀取BP網(wǎng)絡(luò)訓(xùn)練結(jié)果花了好長(zhǎng)時(shí)間練訓(xùn)的網(wǎng)絡(luò),關(guān)閉軟件后再打開(kāi)又要重新再訓(xùn)練,太傷心了,于是我做了保存與讀取功能. 4.1 保存功能 先要訓(xùn)練好網(wǎng)絡(luò),然后點(diǎn)擊左下角的Save按鈕,彈出如下保存對(duì)話(huà)框:選擇要保存的徑,取個(gè)好聽(tīng)的名字,然后點(diǎn)Save按鈕,搞定. 4.2 從已保存文件中加載BP網(wǎng)絡(luò) 點(diǎn)擊左下角的Load按鈕,彈出如下打開(kāi)對(duì)話(huà)框:找到相應(yīng)的.bp后綴的文件,點(diǎn)Open,加載成功后,下方的Status:會(huì)顯示:Load from 某路徑文件名.到這里,這個(gè)演示程序的使用講完了,下面簡(jiǎn)單講講程序代碼的實(shí)現(xiàn) 5.BP神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)嘛,說(shuō)實(shí)話(huà),比較簡(jiǎn)單,只要你理解了BP的原理,加上一定的編程能力,實(shí)現(xiàn)這個(gè)算法就不難了,我用CBPNN類(lèi)封裝了BP網(wǎng)絡(luò),除了實(shí)現(xiàn)基本的BP網(wǎng)絡(luò)的功能之外,添加了保存和加載網(wǎng)絡(luò)的功能.目前只實(shí)現(xiàn)3層BPNN,下面把源碼放上來(lái): 5.1 CBPNN類(lèi)的頭文件:/*This BPNN class is created by Vincent Gao(c_gao),2009-10-31.you cat use it as any purposes as you want,but you must keepthis comment on these files,if you have any problems,please contact me at:e-mail: c_blog: this class can create a three lays BackPropogation NeuralNetwork,to create it you can call the InitBPNN() function,to train the network,call Train().if you want to use this code in your project,please tell me that through my e-mail. thanks.*/#pragma once#include #include #define DEFAULT_ETA 0.05 /默認(rèn)學(xué)習(xí)率#define DEFAULT_MOMENTUM 0 /默認(rèn)沖量#define BPNN_SAVEFILE_FLAG BPNN /BP網(wǎng)絡(luò)保存文件的標(biāo)記#define BPNN_SAVEFILE_SEPCHAR n /保存文件的分隔符#define ABS(x) (x)0?(x):(-(x)typedef std:vectorstd:pairstd:string,std:vector target_type;class CBPNNpublic: CBPNN(void); CBPNN(void);public: bool InitBPNN(int nInput,int nOutput,int nHidden); bool LoadInputUnit(const double* data,int count,double scale); bool LoadTarget(const double* data,int count,double scale=1.0); double Train(double eta,double momentum); void Test(const double* data,int nDimentions,double scale,std:vector& vecOutput); const double* GetOutput(); bool SaveBPNNFile(const char* sSavePath,const char* sTargetName,int nIterateTime,double fStopError,target_type* pvecTarget=NULL); bool LoadBPNNFile(const char* sSavePath,target_type* pvecTarget);protected: void ReleaseBPNN(); double Sigmoid(double x);/激活函數(shù) void LayerForward(); double OutputError(); double HiddenError(); void AdjustWeights();protected: int m_nInput; int m_nOutput; int m_nHidden; double* m_InputUnit; double* m_HiddenUnit; double* m_OutputUnit; /即如圖(先保存o1單元的所有權(quán),再保存o2的權(quán),上層同理) / output layer o / / / hidden layer o1 o2 / /| / input layer o o o /最下層為輸入層,最上層為輸出層,即網(wǎng)絡(luò)走向:從下向上 double* m_I2HWeight; double* m_H2OWeight; double* m_preI2HWeight; double* m_preH2OWeight; double* m_OutputError; double* m_HiddenError; double* m_Target; double m_eta;/learning rate double m_momentum;/momentum for updating the weight;簡(jiǎn)單說(shuō)明:激活函數(shù)使用sigmoid函數(shù),輸入層至隱藏層權(quán)值保存在m_I2HWeight內(nèi),隱藏層至輸出層權(quán)值保存在m_H2OWeight 內(nèi),m_preI2HWeight和m_preH2OWeight記錄上次迭代中的delta權(quán)值,用于計(jì)算權(quán)值更新公式中的沖量 項(xiàng).m_OutputError和m_HiddenError分別保存輸出層和隱藏層的誤差. m_InputUnit,m_HiddenUnit和m_OutputUnit分別保存輸入向量值,隱藏層輸出值和輸出層輸出值,m_Target用于保 存目標(biāo)向量值.m_eta和m_momentum分別是學(xué)習(xí)率和沖量. 5.2 CBPNN類(lèi)的源碼(CPP)文件#include stdafx.h /如果不用VC,或用VC但不用預(yù)編譯頭,請(qǐng)不要include stdafx.h這個(gè)文件#include BPNN.h#include time.h#include math.hCBPNN:CBPNN(void) m_nInput=0; m_nOutput=0; m_nHidden=0; m_InputUnit=NULL; m_HiddenUnit=NULL; m_OutputUnit=NULL; m_I2HWeight=NULL; m_H2OWeight=NULL; m_OutputError=NULL; m_HiddenError=NULL; m_Target=NULL; m_preI2HWeight=NULL; m_preH2OWeight=NULL; m_eta=m_momentum=0.0;CBPNN:CBPNN(void) ReleaseBPNN();bool CBPNN:InitBPNN(int nInput,int nOutput,int nHidden) ReleaseBPNN(); m_nInput=nInput+1; m_nOutput=nOutput; m_nHidden=nHidden+1; m_InputUnit = new doublem_nInput; if(!m_InputUnit) return false; m_OutputUnit= new doublem_nOutput; if(!m_OutputUnit) return false; m_HiddenUnit= new doublem_nHidden; if(!m_HiddenUnit) return false; m_OutputError= new doublem_nOutput; if(!m_OutputError) return false; m_HiddenError= new doublem_nHidden; if(!m_HiddenError) return false; m_Target= new doublem_nOutput; if(!m_Target) return false; memset(m_InputUnit,0,sizeof(double)*(m_nInput); memset(m_OutputUnit,0,sizeof(double)*(m_nOutput); memset(m_HiddenUnit,0,sizeof(double)*(m_nHidden); memset(m_OutputError,0,sizeof(double)*(m_nOutput); memset(m_HiddenError,0,sizeof(double)*(m_nHidden); memset(m_Target,0,sizeof(double)*(m_nOutput); int nI2HW=(m_nHidden-1)*(m_nInput); int nH2OW=(m_nHidden)*(m_nOutput); m_I2HWeight= new doublenI2HW; if(!m_I2HWeight) return false; m_H2OWeight= new doublenH2OW; if(!m_H2OWeight) return false; srand( (unsigned)time( NULL ) ); double r=0.0; int i=0; for(i=0; inI2HW; i+) m_I2HWeighti=0;/rand()*1.0/RAND_MAX;/0.000005;/-0.005+rand()*1.0/RAND_MAX;/-0.05到0.05之間 for(i=0; inH2OW; i+) m_H2OWeighti=rand()*1.0/RAND_MAX/100;/rand()*1.0/RAND_MAX/10000;/-0.5+rand()*1.0/RAND_MAX; m_preI2HWeight= new doublenI2HW; m_preH2OWeight= new doublenH2OW; memset(m_preI2HWeight,0,sizeof(double)*nI2HW); memset(m_preH2OWeight,0,sizeof(double)*nH2OW);/ memset(m_I2HWeight,0,sizeof(double)*nInput*nHidden);/ memset(m_H2OWeight,0,sizeof(double)*nHidden*nOutput); m_eta=DEFAULT_ETA; m_momentum=DEFAULT_MOMENTUM; return true;void CBPNN:ReleaseBPNN() if(m_InputUnit) delete m_InputUnit; if(m_HiddenUnit) delete m_HiddenUnit; if(m_OutputUnit) delete m_OutputUnit; if(m_I2HWeight) delete m_I2HWeight; if(m_H2OWeight) delete m_H2OWeight; if(m_OutputError) delete m_OutputError; if(m_HiddenError) delete m_HiddenError; if(m_Target) delete m_Target; if(m_preH2OWeight) delete m_preH2OWeight; if(m_preI2HWeight) delete m_preI2HWeight; m_InputUnit=NULL; m_HiddenUnit=NULL; m_OutputUnit=NULL; m_I2HWeight=NULL; m_H2OWeight=NULL; m_OutputError=NULL; m_HiddenError=NULL; m_Target=NULL; m_preH2OWeight=NULL; m_preI2HWeight=NULL;bool CBPNN:LoadInputUnit(const double* data,int count,double scale) if(count != m_nInput-1) return false; /m_InputUnit0 即 x0 始終為 1 for(int i=0; icount; i+) m_InputUniti+1=datai/scale; m_InputUnit0=1.0; return true;bool CBPNN:LoadTarget(const double* data,int count,double scale) if(count != m_nOutput) return false; /m_Target0 即 x0 始終為 1 for(int i=0; icount; i+) m_Targeti=datai/scale; return true;double CBPNN:Sigmoid(double x) return (1.0 / (1.0 + exp(-x);void CBPNN:LayerForward() double sum; int i=0,j=0; m_InputUnit0 = 1.0; for (i = 1; i m_nHidden; i+) sum = 0.0; for (j = 0; j m_nInput; j+) sum += m_I2HWeight(i-1)*m_nInput+j * m_InputUnitj;/按.h文件中的順序格式來(lái)訪問(wèn)weightij m_HiddenUniti = Sigmoid(sum); / m_HiddenUnit0=1.0; for(i=0; i m_nOutput; i+) sum=0.0; for(j=0; j m_nHidden; j+) sum+=m_H2OWeighti*m_nHidden+j * m_HiddenUnitj; m_OutputUniti=Sigmoid(sum); double CBPNN:OutputError() double o, t, errsum; errsum = 0.0; for (int i = 0; i m_nOutput; i+) o = m_OutputUniti; t = m_Targeti; m_OutputErrori = o * (1.0 - o) * (t - o); errsum += ABS(m_OutputErrori); return errsum;double CBPNN:HiddenError() double h, sum, errsum; errsum = 0.0; /對(duì)網(wǎng)絡(luò)的每個(gè)隱藏單元計(jì)算它的誤差項(xiàng) for (int i = 1; i m_nHidden; i+) h = m_HiddenUniti; sum = 0.0; for (int j= 0; j m_nOutput; j+) sum += m_OutputErrorj * m_H2OWeightj*m_nOutput+i;/按.h文件中的順序格式來(lái)訪問(wèn)m_H2OWeightij m_HiddenErrori = h * (1.0 - h) * sum; errsum += ABS(m_HiddenErrori); return errsum;void CBPNN:AdjustWeights() int i=0,j=0; double delta_w=0.0; for(j=0; jm_nOutput; j+) for(i=0; im_nHidden; i+) delta_w = ( ( m_eta * m_OutputErrorj * m_HiddenUniti)+(m_momentum*m_preH2OWeightj*m_nHidden+i) ); m_H2OWeightj*m_nHidden+i+=delta_w; m_preH2OWeightj*m_nHidden+i=delta_w; / for(j=1; jm_nHidden; j+) for(i=0; im_nInput; i+) delta_w=( ( m_eta * m_HiddenErrorj * m_InputUniti)+(m_momentum*m_preI2HWeight(j-1)*m_nInput+i) ); m_I2HWeight(j-1)*m_nInput+i+=delta_w; m_preI2HWeight(j-1)*m_nInput+i=delta_w; double CBPNN:Train(double eta,double momentum) m_eta=eta; m_momentum=momentum; double err_o=0.0; double err_h=0.0; double err=0.0; /1. LayerForward(); /2. err_o=OutputError(); err_h=HiddenError(); /3. AdjustWeights(); err=err_o+err_h; return err;const double* CBPNN:GetOutput() return m_OutputUnit;void CBPNN:Test(const double* data,int nDimentions,double scale,std:vector& vecOutput) LoadInputUnit(data,nDimentions,scale); LayerForward(); vecOutput.clear(); for(int i=0; isize() =0 ) return false; if(pvecTarget & (*pvecTarget)0.second).size() begin(); it!=pvecTarget-end(); it+) fprintf(fp,%s%c,it-first.c_str(),BPNN_SAVEFILE_SEPCHAR); for(i=0; isecond)i,BPNN_SAVEFILE_SEPCHAR); /保存三層單元值xij/ for(i=0; im_nInput; i+)/ fprintf(fp
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 人防工程制式銷(xiāo)售合同范本
- 分散采購(gòu)服務(wù)合同范本
- 農(nóng)村燃?xì)獍惭b合同范例
- 協(xié)助寵物國(guó)際托運(yùn)合同范本
- 農(nóng)田租賃合同范本
- 專(zhuān)利轉(zhuǎn)讓入股合同范本
- 養(yǎng)魚(yú)合作轉(zhuǎn)讓合同范本
- 公版采購(gòu)合同范本
- 單位解聘教師合同范本
- 買(mǎi)賣(mài)中介公司合同范本
- 人教版小學(xué)數(shù)學(xué)一年級(jí)下冊(cè)教案
- 《住院患者身體約束的護(hù)理》團(tuán)體標(biāo)準(zhǔn)解讀課件
- 新版人音版小學(xué)音樂(lè)一年級(jí)下冊(cè)全冊(cè)教案
- 2024年黑龍江建筑職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)全面
- MOOC 跨文化交際通識(shí)通論-揚(yáng)州大學(xué) 中國(guó)大學(xué)慕課答案
- CBT主要技術(shù)精品課件
- 常用液壓元件型號(hào)對(duì)照表230
- 項(xiàng)目章程模板范文
- 泰山產(chǎn)業(yè)領(lǐng)軍人才工程系統(tǒng)
- 輪扣架支模體系材料量計(jì)算
- 主題班會(huì)教案《讀書(shū)好讀好書(shū)好讀書(shū)》班會(huì)方案
評(píng)論
0/150
提交評(píng)論