前一段時(shí)間做了一個(gè)數(shù)字識(shí)別的小系統(tǒng),基于BP神經(jīng)網(wǎng)絡(luò)算法的,用MFC做的交互。在實(shí)現(xiàn)過(guò)程中也試著去找一些源碼,總體上來(lái)講,這些源碼的可移植性都不好,多數(shù)將交互部分和核心算法代碼雜糅在一起,這樣不僅代碼閱讀困難,而且重要的是核心算法不具備可移植性。設(shè)計(jì)模式,設(shè)計(jì)模式的重要性啊!于是自己將BP神經(jīng)網(wǎng)絡(luò)的核心算法用標(biāo)準(zhǔn)C++實(shí)現(xiàn),這樣可移植性就有保證的,然后在核心算法上實(shí)現(xiàn)基于不同GUI庫(kù)的交互(MFC,QT)是能很快的搭建好系統(tǒng)的。下面邊介紹BP算法的原理(請(qǐng)看《數(shù)字圖像處理與機(jī)器視覺(jué)》非常適合做工程的伙伴),邊給出代碼的實(shí)現(xiàn),最后給出基于核心算法構(gòu)建交互的例子。
人工神經(jīng)網(wǎng)絡(luò)的理論基礎(chǔ)
1.感知器
感知器是一種具有簡(jiǎn)單的兩種輸出的人工神經(jīng)元,如下圖所示。
2.線性單元
只有1和-1兩種輸出的感知器實(shí)際上限制了其處理和分類的能力,下圖是一種簡(jiǎn)單的推廣,即不帶閾值的感知器。
3.誤差準(zhǔn)則
使用的是一個(gè)常用的誤差度量標(biāo)準(zhǔn),平方誤差準(zhǔn)則。公式如下。
其中D為訓(xùn)練樣本,td為訓(xùn)練觀測(cè)值d的訓(xùn)練輸出,ot為觀測(cè)值d的實(shí)際觀測(cè)值。如果是個(gè)凸函數(shù)就好了(搞數(shù)學(xué)的,一聽(tīng)到凸函數(shù)就很高興,呵呵?。€是可以用梯度下降的方法求其參數(shù)w。
4.梯度下降推導(dǎo)
在高等數(shù)學(xué)中梯度的概念實(shí)際上就是一個(gè)方向向量,也就是方向?qū)?shù)最大的方向,也就是說(shuō)沿著這個(gè)方向,函數(shù)值的變化速度最快。我們這里是做梯度下降,那么就是沿著梯度的負(fù)方向更新參數(shù)w的值來(lái)快速達(dá)到E函數(shù)值的最小了。這樣梯度下降算法的步驟基本如下:
1)初始化參數(shù)w(隨機(jī),或其它方法)。
2)求梯度。
3)沿梯度方向更新參數(shù)w,可以添加一個(gè)學(xué)習(xí)率,也就是按多大的步子下降。
4)重復(fù)1),2),3)直到達(dá)到設(shè)置的條件(迭代次數(shù),或者E的減小量小于某個(gè)閾值)。
梯度的表達(dá)式如下:
那么如何求梯度呢?就是復(fù)合函數(shù)求導(dǎo)的過(guò)程,如下:
其中xid為樣本中第d個(gè)觀測(cè)值對(duì)應(yīng)的一個(gè)輸入分量xi。這樣,訓(xùn)練過(guò)程中參數(shù)w的更新表達(dá)式如下(其中添加了一個(gè)學(xué)習(xí)率,也就是下降的步長(zhǎng)):
于是參數(shù)wi的更新增量為:
對(duì)于學(xué)習(xí)率選擇的問(wèn)題,一般較小是能夠保證收斂的,看下圖吧。
5.增量梯度下降
對(duì)于4中的梯度下降算法,其缺點(diǎn)是有時(shí)收斂速度慢,如果在誤差曲面上存在多個(gè)局部極小值,算法不能保證能夠找到全局極小值。為了改善這些缺點(diǎn),提出了增量梯度下降算法。增量梯度下降,與4中的梯度下降的不同之處在于,4中對(duì)參數(shù)w的更新是根據(jù)整個(gè)樣本中的觀測(cè)值的誤差來(lái)計(jì)算的,而增量梯度下降算法是根據(jù)樣本中單個(gè)觀測(cè)值的誤差來(lái)計(jì)算w的更新。
6.梯度檢驗(yàn)
這是一個(gè)比較實(shí)用的內(nèi)容,如何確定自己的代碼就一定沒(méi)有錯(cuò)呢?因?yàn)樵谇筇荻鹊臅r(shí)候是很容易犯錯(cuò)誤的,我就犯過(guò)了,嗨,調(diào)了兩天才找出來(lái),一個(gè)數(shù)組下表寫(xiě)錯(cuò)了,要是早一點(diǎn)看看斯坦福大學(xué)的深度學(xué)習(xí)基礎(chǔ)教程就好了,這里只是截圖一部分,有時(shí)間去仔細(xì)看看吧。
多層神經(jīng)網(wǎng)絡(luò)
好了有了前面的基礎(chǔ),我們現(xiàn)在就可以進(jìn)行實(shí)戰(zhàn)了,構(gòu)造多層神經(jīng)網(wǎng)絡(luò)。
1.Sigmoid神經(jīng)元
Sigmoid神經(jīng)元可由下圖表示:
2.神經(jīng)網(wǎng)絡(luò)層
一個(gè)三層的BP神經(jīng)網(wǎng)絡(luò)可由下圖表示:
3.神經(jīng)元和神經(jīng)網(wǎng)絡(luò)層的標(biāo)準(zhǔn)C++定義
由2中的三層BP神經(jīng)網(wǎng)絡(luò)的示意圖中可以看出,隱藏層和輸出層是具有類似的結(jié)構(gòu)的。神經(jīng)元和神經(jīng)網(wǎng)絡(luò)層的定義如下:
1 |
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4772瀏覽量
100845
原文標(biāo)題:BP神經(jīng)網(wǎng)絡(luò)原理及C++實(shí)戰(zhàn)
文章出處:【微信號(hào):C_Expert,微信公眾號(hào):C語(yǔ)言專家集中營(yíng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論