Bp神經(jīng)網(wǎng)絡(luò)+C實(shí)現(xiàn)_第1頁
Bp神經(jīng)網(wǎng)絡(luò)+C實(shí)現(xiàn)_第2頁
Bp神經(jīng)網(wǎng)絡(luò)+C實(shí)現(xiàn)_第3頁
Bp神經(jīng)網(wǎng)絡(luò)+C實(shí)現(xiàn)_第4頁
Bp神經(jīng)網(wǎng)絡(luò)+C實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

Bp神經(jīng)網(wǎng)絡(luò)+C++實(shí)現(xiàn)

0前言

神經(jīng)網(wǎng)絡(luò)在我印象中一直比較神秘,正好最近學(xué)習(xí)了神經(jīng)網(wǎng)絡(luò),

特別是對Bp神經(jīng)網(wǎng)絡(luò)有了比較深入的了解,因此,總結(jié)以下心得,希

望對后來者有所幫助。

神經(jīng)網(wǎng)絡(luò)在機(jī)器學(xué)習(xí)中應(yīng)用比較廣泛,比如函數(shù)逼近,模式識別,

分類,數(shù)據(jù)壓縮,數(shù)據(jù)挖掘等領(lǐng)域。神經(jīng)網(wǎng)絡(luò)本身是一個(gè)比較龐大的

概念,從網(wǎng)絡(luò)結(jié)構(gòu)類別來劃分,大概有:多層前饋神經(jīng)網(wǎng)絡(luò)、徑向基

函數(shù)網(wǎng)絡(luò)(RBF)、自適應(yīng)諧振理論網(wǎng)絡(luò)(ART)、自組織映射網(wǎng)絡(luò)

(SOM)、級聯(lián)相關(guān)網(wǎng)絡(luò)、Elman網(wǎng)絡(luò)、Boltzmann機(jī)、受限

Boltzmann機(jī)等等。

下面一張圖是最近比較流行的網(wǎng)絡(luò)結(jié)構(gòu):

Amostlycompletechartof

OBackfedInputCell

NeuralNetworksDeepFeedForward(OFF)

InputCell02016FjodorvanVeen-

△NoisyInputCell

Perceptron(P)FeedForward(FF)FadialBasisNetwork(RBF)

?HiddenCell

OProbablisticHiddenCell

△SpikingHiddenCell

GatedRecurrentUnit(GRU)

OutputCell

OMatchInputOutputCell

?RecurrentCell

OMemoryCell

AutoEncoder(AE)VariationalAE(VAE)DenoisingAE(DAE)SparseAE(SAE)

DifferentMemoryCell

Kernel

ConvolutionorPool

MarkovChain(MC)HopfieldNetwork(HN)BoltzmannMachine(BM)RestrictedBM(RBM)DeepBeliefNetwork(DBN)

DeepConvolutionalNetwork(DCN)DeconvolutionalNetwork(DN)DeepConvolutionalInverseGraphicsNetwork(OCIGN)

GenerativeAdversarialNetwork(GAN)liquidStateMachine(LSM)ExtremeLearningMachine(ELM)EchoStateNetwork(ESN)

DeepResidualNetwork(CRN)KohonenNetwork(KN)SupportVectorMachine(SVM)NeuralTuringMachine(NTM)

今天我們要介紹的是Bp神經(jīng)網(wǎng)絡(luò),準(zhǔn)確的說是采用Bp算法進(jìn)行

訓(xùn)練的多層前饋神經(jīng)網(wǎng)絡(luò),Bp算法應(yīng)用比較廣泛。

1基本概念:

1.1神經(jīng)元模型

機(jī)器學(xué)習(xí)中所談?wù)摰纳窠?jīng)網(wǎng)絡(luò)源于生物上的神經(jīng)網(wǎng)絡(luò),實(shí)際上指

的是〃神經(jīng)網(wǎng)絡(luò)〃與〃機(jī)器學(xué)習(xí)〃的交叉部分,一個(gè)最簡單的M-P神

經(jīng)元模型如下圖所示:

\4=1

該神經(jīng)元收到來自其他n個(gè)輸入神經(jīng)元傳遞過來的輸入信號(加

權(quán)和的形式),然后將其與神經(jīng)元的閾值進(jìn)行比較,通過激活函數(shù)進(jìn)

行處理,產(chǎn)生神經(jīng)元的輸出。

1.2常用激活函數(shù)

激活函數(shù)的作用是對其他所有神經(jīng)元傳過來的所有信號加權(quán)和進(jìn)

行處理,產(chǎn)生神經(jīng)元輸出。

下圖是常用的激活函數(shù),最簡單的是:階躍函數(shù),它簡單,最理

想,但是性質(zhì)最差(不連續(xù)/不光滑),因此在實(shí)際中,最常用的是

Sigmoid函數(shù)。

PlotEquationDerivative

Identity/f(c)=Xrs)=i

/

/..Wv=f0forx<0w/_fofor工a0

Binarystep_r_zt1forx>Q,⑺x龍(?for工=0

Logistic(a.k.a

)-l+LAx)=/(z)(l-/(z))

Softstep)人工

2

Tarfl/(工)=tanh(x)=2,1/")=1-/(x)2

1If

ArcTan/(1)=tan-1(z),⑺-工2+i

Rectified

“、f0forz<0...x(0forx<0

LinearUnit=tzforz>0/(X)=l1forz>0

(ReLU)

Parapeteric

a

Rectified//、(axforz<0f>\-fx<0

//(X)=lzforz>0(x

LinearUnit/㈤-(1forx>0

(PReLU)121/

Exponentialx

f>(Tx-Jf()+°hr4V。

LinearUnit八)-(1forx>0

(EUD⑶

70/、1/4.X\…1

1.3前饋神經(jīng)網(wǎng)絡(luò)

多層前饋神經(jīng)網(wǎng)絡(luò)的準(zhǔn)確定義:每一層神經(jīng)元與下一層神經(jīng)元全

互連,神經(jīng)元之間不存在同層連接,不存在跨層連接,如下圖所示就

是一個(gè)經(jīng)典的前饋神經(jīng)網(wǎng)絡(luò),

(隨便插一句,當(dāng)神經(jīng)網(wǎng)絡(luò)中隱層數(shù)越來越多,達(dá)到8-9層E寸,

就變成了一個(gè)深度

學(xué)習(xí)模型,我曾在一篇論文中看到網(wǎng)絡(luò)結(jié)構(gòu)有達(dá)128層的,關(guān)于

下面這塊,下面還會再敘述)O

2.標(biāo)準(zhǔn)Bp算法

2.0關(guān)于梯度

首先我們應(yīng)該清楚,一個(gè)多元函數(shù)的梯度方向是該函數(shù)值增大最

陡的方向。具體化到1元函數(shù)中時(shí),梯度方向首先是沿著曲線的切線

的,然后取切線向上增長的方向?yàn)樘荻确较颍?元或者多元函數(shù)中,梯

度向量為函數(shù)值f對每個(gè)變量的導(dǎo)數(shù),該向量的方向就是梯度的方向,

當(dāng)然向量的大小也就是梯度的大小。

梯度下降法(steepestdescendmethod)用來求解表達(dá)式最大或

者最小值的,屬于無約束優(yōu)化問題。梯度下降法的基本思想還是挺簡

單的,現(xiàn)假設(shè)我們要求函數(shù)f的最小值,首先得選取一個(gè)初始點(diǎn)后,然

后下一個(gè)點(diǎn)的產(chǎn)生時(shí)是沿著梯度直線方向,這里是沿著梯度的反方向

(因?yàn)榍蟮氖亲钚≈?,如果是求最大值的話則沿梯度的正方向即可),如

2.1神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)過程

神經(jīng)網(wǎng)絡(luò)在外界輸入樣本的刺激下不斷改變網(wǎng)絡(luò)的連接權(quán)值,以使

網(wǎng)絡(luò)的輸出不斷地接近期望的輸出,講幾個(gè)要點(diǎn):

(1)學(xué)習(xí)過程可以簡述為:

(2)學(xué)習(xí)的本質(zhì):對各連接權(quán)值以及所有功能神經(jīng)元的閾值動

態(tài)調(diào)整

注:可以將權(quán)值與閾值的學(xué)習(xí)統(tǒng)一為權(quán)值的學(xué)習(xí),即將閾值看成

一個(gè)〃啞節(jié)點(diǎn)〃,如下圖所示:

(3)權(quán)值調(diào)整規(guī)則:即在學(xué)習(xí)過程中網(wǎng)絡(luò)中各神經(jīng)元的連接權(quán)

變化所依據(jù)的一定的調(diào)整規(guī)則,(Bp算法中權(quán)值調(diào)整采用的是梯度下

降策略,下面會詳細(xì)介紹)

Bp網(wǎng)絡(luò)的學(xué)習(xí)流程如下圖所示:

(百度圖庫里搜的,能說明問題就行)

2.2權(quán)值調(diào)整策略:

首先說明一句』神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)屬于監(jiān)督學(xué)習(xí)的范疇。每輸入一個(gè)

樣本,進(jìn)行正向傳播(輸入層一隱層一輸出層),得到輸出結(jié)果以后,計(jì)

算誤差,達(dá)不到期望后,將誤差進(jìn)行反向傳播(輸出層一隱層一輸入

層),采用梯度下降策略對所有權(quán)值和閾值進(jìn)行調(diào)整。

對訓(xùn)練例(耿,如),假定神經(jīng)網(wǎng)絡(luò)的輸出為yk=(片次…4),即

-=/(-一%),

則網(wǎng)絡(luò)在{xk,yk)上的均方誤差為

g_1'、/八"?.*、2

注:上面的Ek是根據(jù)第k個(gè)樣本數(shù)據(jù)算出的誤差,可以看出:標(biāo)

準(zhǔn)Bp算法每次迭代更新只針對單個(gè)樣例。

權(quán)值與閾值的調(diào)整公式如下:

(D采用感知機(jī)學(xué)習(xí)規(guī)則:VV

(2)梯度下降法:即以訓(xùn)練樣本被錯分的程度為目標(biāo)函數(shù),訓(xùn)練中每次出現(xiàn)錯誤時(shí)便使權(quán)系

數(shù)朝著目標(biāo)函數(shù)相對于權(quán)系數(shù)負(fù)梯度方向更新,知道目標(biāo)中沒有被錯分的樣本為止。

△w》=rjgjbh9j=/(1一磅)域-Vj)

△%=-V9jif

絹:--若微?需仆“一

△。訪=TJChXi,

QR.

△7h=-T)eh,瓦力=":學(xué)習(xí)率"

:十.1-右二?止匕:出東V/\小且工M人玨+皿山WzGA+n田詼苴工后二大T玨

上述公式的詳細(xì)推導(dǎo)過程見下圖:

篇標(biāo)本,舔力余乂夕八燈…

蝌及二彳⑹叫)

-E"舂笊-獷.

r,夕J-,

俸的栩酬移*

①dWq

也二"刀繇購惡二埠??巡必

J2的,??"5的Mj.叼

二陰7;),電-M〉bh

二瓶1-曲途琴心/

”人力?4lVhi二”丁,9,Zi_0F,/髡一曲b二刀9;b,,

訂年二2劭-%).

Q)Av7h.'\,

42萬瑞,楚歌二囁■賽篇二琳加巨產(chǎn)由—M

統(tǒng)林東二者端*二者須打一^^1臺網(wǎng)句人心)X;

:收入?、/少卜二k力瑞;二一力務(wù)w^.%b力"b力)冷’

\二力l^cHh^whj^jXf.^.ne^]

:----------------Y,

:助

y崢f翳火崎二寄?瑞二-哈力伽物

.二W-外)曾,中

彳3=〉/用二一力金,I-95(小■賽)--力加

'防/的4金

c..^.、U、,__lZ

2.3BP神經(jīng)網(wǎng)絡(luò)總結(jié)

(1)BP神經(jīng)網(wǎng)絡(luò)一般用于分類或者逼近問題。

如果用于分類,則激活函數(shù)一般選用Sigmoid函數(shù)或者硬極限函

數(shù),如果用于函數(shù)逼近,則輸出層節(jié)點(diǎn)用線性函數(shù)。

(2)BP神經(jīng)網(wǎng)絡(luò)在訓(xùn)練數(shù)據(jù)時(shí)可以采用增量學(xué)習(xí)或者批量學(xué)習(xí)。

一增量學(xué)習(xí)要求輸入模式要有足夠的隨機(jī)性,對輸入模式的噪聲

比較敏感,即對于劇烈變化的輸入模式,訓(xùn)練效果比較差,適合在線

處理。

一批量學(xué)習(xí)不存在輸入模式次序問題,穩(wěn)定性好,但是只適合離

線處理。

(3)如何確定隱層數(shù)以及每個(gè)隱含層節(jié)點(diǎn)個(gè)數(shù)

Pre隱含層節(jié)點(diǎn)個(gè)數(shù)不確定,那么應(yīng)該設(shè)置為多少才合適呢(隱含

層節(jié)點(diǎn)個(gè)數(shù)的多少對神經(jīng)網(wǎng)絡(luò)的性能是有影響的)?

有一個(gè)經(jīng)驗(yàn)公式可以確定隱含層節(jié)點(diǎn)數(shù)目:

h=y/m+n+a

.(其中h:隱含層節(jié)點(diǎn)數(shù)目,m:為輸入層節(jié)點(diǎn)數(shù)目,n:為輸出層

節(jié)點(diǎn)數(shù)目,a:為之間的調(diào)節(jié)常數(shù))。

2.4標(biāo)準(zhǔn)BP神經(jīng)網(wǎng)絡(luò)的缺陷

(1)容易形成局部極小值而得不到全局最優(yōu)值。

(采用梯度下降法),如果僅有一個(gè)局部極小值二〉全局最小,多

個(gè)局部極小二〉不一定全局最小。這就要求對初始權(quán)值和閥值有要求,

要使得初始權(quán)值和閥值隨機(jī)性足夠好,可以多次隨機(jī)來實(shí)現(xiàn)。

(2)訓(xùn)練次數(shù)多使得學(xué)習(xí)效率低,收斂速度慢。

每次更新只針對單個(gè)樣本;不同樣例出現(xiàn)〃抵消〃現(xiàn)象。

(3)過擬合問題

通過不斷訓(xùn)練,訓(xùn)練誤差達(dá)到很低,但測試誤差可能會上升(泛

化性能差).

解決策略:

1,〃早停〃:

即將樣本劃分成訓(xùn)練集和驗(yàn)證集,訓(xùn)練集用來算梯度,更新權(quán)值

和閾值,驗(yàn)證集用來估計(jì)誤差,當(dāng)訓(xùn)練集誤差降低而驗(yàn)證集誤差升高

時(shí)就停止訓(xùn)練,返回具有最小驗(yàn)證集誤差的權(quán)值和閾值。

2,〃正則化方法〃:

_tm(v***'CSLUS人

,即在誤差目標(biāo)中增加一個(gè)用于描述網(wǎng)絡(luò)復(fù)雜程度的部分,其中

參數(shù)人常用交叉驗(yàn)證來確定。

2.5BP算法的改進(jìn)

(1)累積BP算法

目的:為了減小整個(gè)訓(xùn)練集的全局誤差,而不針對某一特定樣本

1/W?

B*4rL乙A..9\Lr?

(更新策略做相應(yīng)調(diào)整)

(2)利用動量法改進(jìn)BP算法

(標(biāo)準(zhǔn)Bp學(xué)習(xí)過程易震蕩,收斂速度慢)

增加動量項(xiàng),引入動量項(xiàng)是為了加速算法收斂,即如下公式:

a為動量系數(shù),通常0<a<0.9o

(3)自適應(yīng)調(diào)節(jié)學(xué)習(xí)率n

調(diào)整的基本指導(dǎo)思想是:在學(xué)習(xí)收斂的情況下,增大n,以縮短學(xué)

習(xí)時(shí)間;當(dāng)n偏大致使不能收斂(即發(fā)生震蕩)時(shí),要及時(shí)減小n,直

到收斂為止。

3工程搭建與C++實(shí)現(xiàn)

實(shí)驗(yàn)平臺:vs2013

項(xiàng)目包含文件:

個(gè)>QKK(H:)>BpNet>Bphet>

項(xiàng)目流程如下圖所示:

初始化網(wǎng)絡(luò)結(jié)構(gòu)

(3層前饋神經(jīng)網(wǎng)絡(luò))

用測試數(shù)據(jù)測試

(1)Bp.h

#ifndef_BP_H_

#define_BP_H_

#include<vector>

〃參數(shù)設(shè)置

#defineLAYER3〃三層神經(jīng)網(wǎng)絡(luò)

#defineNUM10〃每層的最多節(jié)點(diǎn)數(shù)

#defineA30.0

#defineB10.0//A和B是S型函數(shù)的參數(shù)

#defineITERS1000〃最大訓(xùn)練次數(shù)

#defineETA_W0.0035〃權(quán)值調(diào)整率

#defineETA.B0.001〃閥值調(diào)整率

#defineERROR0.002〃單個(gè)樣本允許的誤差

#defineACCU0.005〃每次迭代允許的誤差

〃類型

#defineTypedouble

#defineVectorstd::vector

structData

(

Vector<Type>x;〃輸入屬性

Vector<Type>y;〃輸出屬性

);

classBP{

public:

voidGetData(constVector<Data>);

voidTrain();

Vector<Type>ForeCast(constVector<Type>);

voidForCastFromFile(BP*&);

voidReadFile(constchar*InutFileNamejntm,intn);

voidReadTestFile(constchar*InputFileName,intmzintn);

voidWriteToFile(constchar*OutPutFileName);

private:

voidInitNetWorkO;〃初始化網(wǎng)絡(luò)

voidGetNumsO;〃獲取輸入、輸出和隱含層節(jié)點(diǎn)數(shù)

voidForwardTransfer();〃正向傳播子過程

voidReverseTransfer(int);〃逆向傳播子過程

voidCalcDelta(int);〃計(jì)算w和b的調(diào)整量

voidUpdateNetWork();〃更新權(quán)值和閥值

TypeGetError(int);〃計(jì)算單個(gè)樣本的誤差

TypeGetAccuQ;〃計(jì)算所有樣本的精度

TypeSigmoid(constType);〃計(jì)算Sigmoid的值

voidsplit(char*bufferzVector<Type>&vec);

private:

intin_num;〃輸入層節(jié)點(diǎn)數(shù)

intou_num;〃輸出層節(jié)點(diǎn)數(shù)

inthd_num;〃隱含層節(jié)點(diǎn)數(shù)

Vector<Data>data;〃樣木數(shù)據(jù)

Vector<Vector<Type>>testdata;〃測試數(shù)據(jù)

Vector<Vector<Type>>result;〃測試結(jié)果

introwLen;〃樣本數(shù)量

intrestrowLen;〃測試樣本數(shù)量

Typew[LAYER][NUM][NUM];//BP網(wǎng)絡(luò)的權(quán)值

Typeb[LAYER][NUM];//BP網(wǎng)絡(luò)節(jié)點(diǎn)的閥值

Typex[LAYER][NUM];〃每個(gè)神經(jīng)元的值經(jīng)S型函數(shù)轉(zhuǎn)化后

的輸出值,輸入層就為原值

Typed[LAYER][NUM];〃記錄delta學(xué)習(xí)規(guī)則中delta的值,

使用delta規(guī)則來調(diào)整聯(lián)接權(quán)重Wij(t+l)=Wij(t)+a(Yj-Aj(t))Oi(t)

);

#endif//_BP_H_

(2)Bp.cpp

#include<string.h>

#include<stdio.h>

#include<math.h>

#include<assert.h>

#include<cstdlib>

#include<fstream>

#include<iostream>

usingnamespacestd;

#include"Bp.h"

〃獲取訓(xùn)練所有樣本數(shù)據(jù)

voidBP::GetData(constVector<Data>_data)

data=_data;

)

voidBP::split(char*bufferzVector<Type>&vec)

(

char*p=strtok(buffer,"z");/At

while(p!=NULL)

(

vec.push_back(atof(p));

p=strtok(NULL/"\n");

)

)

voidBP::ReadFile(constchar*InutFileName,intmJntn)

(

FILE*pFile;

//Test

//pFile=fopen("D:\\testSet.txt\"r");

M

pFile=fopen(InutFileNamez"r);

if(!pFile)

(

printf("openfile%sfailed...\n"/InutFileName);

exit(O);

)

//initdataSet

char*buffer=newchar[100];

Vector<Type>temp;

while(fgets(buffer,100,pFile))

(

Datat;

temp.clearO;

split(bufferztemp);

//data[x].push_back(temp);

for(inti=0;i<temp.size();i++)

(

if(i<m)

t.x.push_back(temp[i]);

else

t.y.push_back(temp[i]);

)

data.push_back(t);

)

//initrowLen

rowLen=data.size();

)

voidBP::ReadTestFile(constchar*InputFileName,intm,int

n)

(

FILE*pFile;

pFile=fopen(InputFileName,"r");

if(IpFile)

printf("openfile%sfailed...\n"/InputFileName);

exit(O);

)

//initdataSet

char*buffer=newchar[100];

Vector<Type>temp;

while(fgets(buffer,100,pFile))

(

Vector<Type>t;

temp.clearO;

split(bufferztemp);

for(inti=0;i<temp.size();i++)

(

t.push_back(temp[i]);

)

testdata.push_back(t);

)

restrowLen=testdata.size();

)

voidBP::WriteToFile(constchar*OutPutFileName)

(

ofstreamfout;

fout.open(OutPutFileName);

if(!fout)

cout<<"fileresult.txtopenfailed"<<endl;

exit(O);

)

Vector<Vector<Type>>::iteratorit=testdata.begin();

Vector<Vector<Type>>::iteratoritx=result.begin();

while(it!=testdata.end())

(

Vector<Type>::iteratoritt=(*it).begin();

Vector<Type>::iteratorittx=(*itx).begin();

while(itt!=(*it).end())

(

fout<<(*itt)<<

itt++;

)

fout<<"\t";

while(ittx!=(*itx).end())

(

fout<<(*ittx)<<

ittx++;

)

it++;

itx++;

fout<<"\n";

)

)

〃開始進(jìn)行訓(xùn)練

voidBP::Train()

printf("BegintotrainBPNetWork!\n");

GetNums();

InitNetWork();

intnum=data.sizeQ;

for(intiter=0;iter<=ITERS;iter++)

(

for(intent=0;ent<num;cnt++)

(

〃第一層輸入節(jié)點(diǎn)賦值

for(inti=0;i<in_num;i++)

x[0][i]=data.at(cnt).x[i];

while(1)

(

ForwardTransfer();

if(GetError(cnt)<ERROR)〃如果誤差比較小,則針對單個(gè)樣

本跳出循環(huán)

break;

ReverseTransfer(cnt);

)

)

printf("Thisisthe%dthtrainningNetWork!\n"ziter);

Typeaccu=GetAccuQ;〃每一輪學(xué)習(xí)的均方誤差E

printf("AIISamplesAccuracyis%lf\n"/accu);

if(accu<ACCU)break;

)

printf("TheBPNetWorktrainEnd!\n");

)

〃根據(jù)訓(xùn)練好的網(wǎng)絡(luò)來預(yù)測輸出值

Vector<Type>BP::ForeCast(constVector<Type>data)

(

intn=data.sizeO;

assert(n==in_num);

for(inti=0;i<in_num;i++)

x[0][i]=data[i];

ForwardTransfer();

Vector<Type>v;

for(inti=0;i<ou_num;i++)

v.push_back(x[2][i]);

returnv;

)

voidBP::ForCastFromFile(BP*&pBp)

(

Vector<Vector<Type>>::iteratorit=testdata.begin();

Vector<Type>ou;

while(it!=testdata.end())

(

ou=pBp->ForeCast(*it);

result.push_back(ou);

it++;

)

)

〃獲取網(wǎng)絡(luò)節(jié)點(diǎn)數(shù)

voidBP::GetNums()

(

in_num=data[O].x.size();〃獲取輸入層節(jié)點(diǎn)數(shù)

ou.num=data[O].y.size();〃獲取輸出層節(jié)點(diǎn)數(shù)

hd_num=(int)sqrt((in_num+ou_num)*1.0)+5;〃獲取隱

含層節(jié)點(diǎn)數(shù)

if(hd_num>NUM)hd_num=NUM;〃隱含層數(shù)

目不能超過最大設(shè)置

)

〃初始化網(wǎng)絡(luò)

voidBP::InitNetWork()

(

memset(wz0,sizeof(w));〃初始化權(quán)值和閥值為0,也可以初

始化隨機(jī)值

memset(bz0,sizeof(b));

)

〃工作信號正向傳遞子過程

voidBP::ForwardTransfer()

(

〃計(jì)算隱含層各個(gè)節(jié)點(diǎn)的輸出值

for(intj=0;j<hd_num;j++)

(

Typet=0;

for(inti=0;i<in_num;i++)

t+=w[l][i][j]*x[0][i];

t+=b[l][j];

x[l][j]=Sigmoid(t);

)

〃計(jì)算輸出層各節(jié)點(diǎn)的輸出值

for(intj=0;j<ou_num;j++)

(

Typet=0;

for(inti=0;i<hd_num;i++)

t+=w[2][i][j]*x[l][i];

t+=b[2][j];

x[2][j]=Sigmoid(t);

)

)

〃計(jì)算單個(gè)樣本的誤差

TypeBP::GetError(intent)

(

Typeans=0;

for(inti=0;i<ou_num;i++)

ans+=0.5*(x[2][i]-data.at(cnt).y[i])*(x[2][i]

data.at(cnt).y[i]);

returnans;

)

〃誤差信號反向傳遞子過程

voidBP::ReverseTransfer(intent)

CalcDelta(cnt);

UpdateNetWork();

)

〃計(jì)算所有樣本的精度

TypeBP::GetAccu()

(

Typeans=0;

intnum=data.size();

for(inti=0;i<num;i++)

(

intm=data.at(i).x.size();

for(intj=0;j<m;j++)

x[0][j]=data.at(i).x[j];

ForwardTransfer();

intn=data.at(i).y.size();〃樣本輸出的維度

for(intj=0;j<n;j++)

ans+=0.5*(x[2][j]-data.at(i).y[j])*(x[2][j]-data.at(i).y[j]);//

對第i個(gè)樣本算均方誤差

)

returnans/num;

〃計(jì)算調(diào)整量

voidBP::CalcDelta(intent)

(

〃計(jì)算輸出層的delta值

for(inti=0;i<ou_num;i++)

d[2][i]=(x[2][i]-data.at(cnt).y[i])*x[2][i]*(A-x[2][i])/(A*

B);

〃計(jì)算隱含層的delta值

for(inti=0;i<hd_num;i++)

Typet=0;

for(intj=0;j<ou_num;j++)

t+=w[2][i][j]*d[2][j];

d[l][i]=t*x[l][i]*(A-x[l][i])/(A*B);

)

)

〃根據(jù)計(jì)算出的調(diào)整量對BP網(wǎng)絡(luò)進(jìn)行調(diào)整

voidBP::UpdateNetWork()

(

〃隱含層和輸出層之間權(quán)值和閥值調(diào)整

for(inti=0;i<

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論