日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > 卷积神经网络 >内容正文

卷积神经网络

神经网络:卷积神经网络

發(fā)布時間:2025/7/25 卷积神经网络 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 神经网络:卷积神经网络 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

FROM:?http://www.cnblogs.com/ronny/p/ann_03.html

一、前言

這篇卷積神經(jīng)網(wǎng)絡(luò)是前面介紹的多層神經(jīng)網(wǎng)絡(luò)的進一步深入,它將深度學(xué)習(xí)的思想引入到了神經(jīng)網(wǎng)絡(luò)當(dāng)中,通過卷積運算來由淺入深的提取圖像的不同層次的特征,而利用神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程讓整個網(wǎng)絡(luò)自動調(diào)節(jié)卷積核的參數(shù),從而無監(jiān)督的產(chǎn)生了最適合的分類特征。這個概括可能有點抽象,我盡量在下面描述細(xì)致一些,但如果要更深入了解整個過程的原理,需要去了解DeepLearning。

這篇文章會涉及到卷積的原理與圖像特征提取的一般概念,并詳細(xì)描述卷積神經(jīng)網(wǎng)絡(luò)的實現(xiàn)。但是由于精力有限,沒有對人類視覺的分層以及機器學(xué)習(xí)等原理有進一步介紹,后面會在深度學(xué)習(xí)相關(guān)文章中展開描述。

二、卷積

卷積是分析數(shù)學(xué)中一種很重要的運算,其實是一個很簡單的概念,但是很多做圖像處理的人對這個概念都解釋不清,為了簡單起見,這里面我們只介紹離散形式的卷積,那么在圖像上,對圖像用一個卷積核進行卷積運算,實際上是一個濾波的過程。我們先看一下卷積的基本數(shù)學(xué)表示:

f(x,y)°w(x,y)=s=?aat=?bbw(s,t)f(x?s,y?t)

其中I=f(x,y)是一個圖像,f(x,y)是圖像I上面xy列上點的灰度值。而w(x,y)有太多名字叫了,濾波器、卷積核、響應(yīng)函數(shù)等等,而ab定義了卷積核即w(x,y)的大小。

從上面的式子中,可以很明顯的看到,卷積實際上是提供了一個權(quán)重模板,這個模板在圖像上滑動,并將中心依次與圖像中每一個像素對齊,然后對這個模板覆蓋的所有像素進行加權(quán),并將結(jié)果作為這個卷積核在圖像上該點的響應(yīng)。所以從整個卷積運算我們可以看到以下幾點:

1)卷積是一種線性運算

2)卷積核的大小,定義了圖像中任何一點參與運算的鄰域的大小。

3)卷積核上的權(quán)值大小說明了對應(yīng)的鄰域點對最后結(jié)果的貢獻能力,權(quán)重越大,貢獻能力越大。

4)卷積核沿著圖像所有像素移動并計算響應(yīng),會得到一個和原圖像等大圖像。

5)在處理邊緣上點時,卷積核會覆蓋到圖像外層沒有定義的點,這時候有幾種方法設(shè)定這些沒有定義的點,可以用內(nèi)層像素鏡像復(fù)制,也可以全設(shè)置為0。

三、卷積特征層

其實圖像特征提取在博客里的一些其他文章都有提過,這里我想說一下圖像特征提取與卷積的關(guān)系。其實大部分的圖像特征提取都依賴于卷積運算,比如顯著的邊緣特征就是用各種梯度卷積算子對圖像進行濾波的結(jié)果。一個圖像里目標(biāo)特征主要體現(xiàn)在像素與周圍像素之間形成的關(guān)系,這些鄰域像素關(guān)系形成了線條、角點、輪廓等。而卷積運算正是這種用鄰域點按一定權(quán)重去重新定義該點值的運算。

水平梯度的卷積算子:

豎直梯度的卷積算子:

根據(jù)深度學(xué)習(xí)關(guān)于人的視覺分層的理論,人的視覺對目標(biāo)的辨識是分層的,低層會提取一些邊緣特征,然后高一些層次進行形狀或目標(biāo)的認(rèn)知,更高層的會分析一些運動和行為。也就是說高層的特征是低層特征的組合,從低層到高層的特征表示越來越抽象,越來越能表現(xiàn)語義或者意圖。而抽象層面越高,存在的可能猜測就越少,就越利于分類。

而深度學(xué)習(xí)就是通過這種分層的自動特征提取來達到目標(biāo)分類,先構(gòu)建一些基本的特征層,然后用這些基礎(chǔ)特征去構(gòu)建更高層的抽象,更精準(zhǔn)的分類特征。

那整個卷積神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)也就很容易理解了,它在普通的多層神經(jīng)網(wǎng)絡(luò)的前面加了2層特征層,這兩層特征層是通過權(quán)重可調(diào)整的卷積運算實現(xiàn)的。

四、卷積神經(jīng)網(wǎng)絡(luò)

在原來的多層神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)中,每一層的所有結(jié)點會按照連續(xù)線的權(quán)重向前計算,成為下一層結(jié)點的輸出。而每一條權(quán)重連結(jié)線都彼此不同,互不共享。每一個下一層結(jié)點的值與前一層所有結(jié)點都相關(guān)。

與普通多層神經(jīng)網(wǎng)絡(luò)不同的是,卷積神經(jīng)網(wǎng)絡(luò)里,有特征抽取層與降維層,這些層的結(jié)點連結(jié)是部分連接且,一幅特征圖由一個卷積核生成,這一幅特征圖上的所有結(jié)點共享這一組卷積核的參數(shù)。

這里我們設(shè)計一個5層的卷積神經(jīng)網(wǎng)絡(luò),一個輸入層,一個輸出層,2個特征提取層,一個全連接的隱藏層。下面詳細(xì)說明每一層的設(shè)計思路。

在一般的介紹卷積神經(jīng)網(wǎng)絡(luò)的文章中你可能會看到在特征層之間還有2層降維層,在這里我們將卷積與降維同步進行,只用在卷積運算時,遍歷圖像中像素時按步長間隔遍歷即可。

輸入層:普通的多層神經(jīng)網(wǎng)絡(luò),第一層就是特征向量。一般圖像經(jīng)過人為的特征挑選,通過特征函數(shù)計算得到特征向量,并作為神經(jīng)網(wǎng)絡(luò)的輸入。而卷積神經(jīng)網(wǎng)絡(luò)的輸出層則為整個圖像,如上圖示例29*29,那么我們可以將圖像按列展開,形成841個結(jié)點。而第一層的結(jié)點向前沒有任何的連結(jié)線。

第1層:第1層是特征層,它是由6個卷積模板與第一層的圖像做卷積形成的6幅13*13的圖像。也就是說這一層中我們算上一個偏置權(quán)重,一共有只有(5*5+1)*6=156權(quán)重參數(shù),但是,第二層的結(jié)點是將6張圖像按列展開,即有6*13*13=1014個結(jié)點。

而第2層構(gòu)建的真正難點在于,連結(jié)線的設(shè)定,當(dāng)前層的結(jié)點并不是與前一層的所有結(jié)點相連,而是只與25鄰域點連接,所以第二層一定有(25+1)*13*13*6=26364條連線,但是這些連結(jié)線共享了156個權(quán)值。按前面多層網(wǎng)絡(luò)C++的設(shè)計中,每個連線對象有2個成員,一個是權(quán)重的索引,一個是上一層結(jié)點的索引,所以這里面要正確的設(shè)置好每個連線的索引值,這也是卷積神經(jīng)網(wǎng)絡(luò)與一般全連結(jié)層的區(qū)別。

第2層:第2層也是特征層,它是由50個特征圖像組成,每個特征圖像是5*5的大小,這個特征圖像上的每一點都是由前一層6張?zhí)卣鲌D像中每個圖像取25個鄰域點最后在一起加權(quán)而成,所以每個點也就是一個結(jié)點有(5*5+1)*6=156個連結(jié)線,那么當(dāng)前層一共有5*5*50=1250個結(jié)點,所以一共有195000個權(quán)重連結(jié)線,但是只有(5*5+1)*6*50=7800個權(quán)重參數(shù),每個權(quán)重連結(jié)線的值都可以在7800個權(quán)重參數(shù)數(shù)組中找到索引。

所以第3層的關(guān)鍵也是,如何建立好每根連結(jié)線的權(quán)重索引與與前一層連結(jié)的結(jié)點的索引。

第3層:和普通多神經(jīng)網(wǎng)絡(luò)沒有區(qū)別了,是一個隱藏層,有100個結(jié)點構(gòu)成,每個結(jié)點與上一層中1250個結(jié)點相聯(lián),共有125100個權(quán)重與125100個連結(jié)線。

第4層:輸出層,它個結(jié)點個數(shù)與分類數(shù)目有關(guān),假設(shè)這里我們設(shè)置為10類,則輸出層為10個結(jié)點,相應(yīng)的期望值的設(shè)置在多層神經(jīng)網(wǎng)絡(luò)里已經(jīng)介紹過了,每個輸出結(jié)點與上面隱藏層的100個結(jié)點相連,共有(100+1)*10=1010條連結(jié)線,1010個權(quán)重。

從上面可以看出,卷積神經(jīng)網(wǎng)絡(luò)的核心在于卷積層的創(chuàng)建,所以在設(shè)計CNNLayer類的時候,需要兩種創(chuàng)建網(wǎng)絡(luò)層的成員函數(shù),一個用于創(chuàng)建普通的全連接層,一個用于創(chuàng)建卷積層。

1 class CNNlayer 2 { 3 private: 4 CNNlayer* preLayer; 5 vector<CNNneural> m_neurals; 6 vector<double> m_weights; 7 public: 8 CNNlayer(){ preLayer = nullptr; } 9 // 創(chuàng)建卷積層 10 void createConvLayer(unsigned curNumberOfNeurals, unsigned preNumberOfNeurals, unsigned preNumberOfFeatMaps, unsigned curNumberOfFeatMaps); 11 // 創(chuàng)建 普通層 12 void createLayer(unsigned curNumberOfNeurals,unsigned preNumberOfNeurals); 13 void backPropagate(vector<double>& dErrWrtDxn, vector<double>& dErrWrtDxnm, double eta); 14 };

?

創(chuàng)建普通層,在前面介紹的多層神經(jīng)網(wǎng)絡(luò)中已經(jīng)給出過代碼,它接收兩個參數(shù),一個是前面一層結(jié)點數(shù),一個是當(dāng)前層結(jié)點數(shù)。

而卷積層的創(chuàng)建則復(fù)雜的多,所有連結(jié)線的索引值的確定需要對整個網(wǎng)絡(luò)有較清楚的了解。這里設(shè)計的createConvLayer函數(shù),它接收4個參數(shù),分別對應(yīng),當(dāng)前層結(jié)點數(shù),前一層結(jié)點數(shù),前一層特征圖的個數(shù)和當(dāng)前層特征圖像的個數(shù)。

下面是C++代碼,要理解這一部分可以會稍有點難度,因為特征圖實際中都被按列展開了,所以鄰域這個概念會比較抽象,我們考慮把特征圖像還原,從圖像的角度去考慮。

1 void CNNlayer::createConvLayer 2 (unsigned curNumberOfNeurals, unsigned preNumberOfNeurals, unsigned preNumberOfFeatMaps, unsigned curNumberOfFeatMaps) 3 { 4 // 前一層和當(dāng)前層特征圖的結(jié)點數(shù) 5 unsigned preImgSize = preNumberOfNeurals / preNumberOfFeatMaps; 6 unsigned curImgSize = curNumberOfNeurals / curNumberOfFeatMaps; 7 8 // 初始化權(quán)重 9 unsigned numberOfWeights = preNumberOfFeatMaps*curNumberOfFeatMaps*(5 * 5 + 1); 10 for (unsigned i = 0; i != numberOfWeights; i++) 11 { 12 m_weights.push_back(0.05*rand() / RAND_MAX); 13 } 14 // 建立所有連結(jié)線 15 16 for (unsigned i = 0; i != curNumberOfFeatMaps; i++) 17 { 18 unsigned imgRow = sqrt(preImgSize); //上一層特征圖像的大小 ,imgRow=imgCol 19 // 間隙2進行取樣,鄰域周圍25個點 20 for (int c = 2; c < imgRow-2; c= c+ 2) 21 { 22 for (int r = 2; r < imgRow-2; r =r + 2) 23 { 24 CNNneural neural; 25 for (unsigned k = 0; k != preNumberOfNeurals; k++) 26 { 27 for (int kk = 0; kk < (5*5+1); kk ++) 28 { 29 CNNconnection connection; 30 // 權(quán)重的索引 31 connection.weightIdx = i*(curNumberOfFeatMaps*(5 * 5 + 1)) + k*(5 * 5 + 1) + kk; 32 // 結(jié)點的索引 33 connection.neuralIdx = k*preImgSize + c*imgRow + r; 34 neural.m_connections.push_back(connection); 35 } 36 m_neurals.push_back(neural); 37 } 38 } 39 } 40 } 41 }

?

五、訓(xùn)練與識別

整個網(wǎng)絡(luò)結(jié)構(gòu)搭建好以后,訓(xùn)練只用按照多層神經(jīng)網(wǎng)絡(luò)那樣訓(xùn)練即可,其中的權(quán)值更新策略都是一致的。所以總體來說,卷積神經(jīng)網(wǎng)絡(luò)與普通的多層神經(jīng)網(wǎng)絡(luò),就是結(jié)構(gòu)上不同。卷積神經(jīng)網(wǎng)絡(luò)多了特征提取層與降維層,他們之間結(jié)點的連結(jié)方式是部分連結(jié),多個連結(jié)線共享權(quán)重。而多層神經(jīng)網(wǎng)絡(luò)前后兩層之間結(jié)點是全連結(jié)。除了這以外,權(quán)值更新、訓(xùn)練、識別都是一致的。

訓(xùn)練得到一組權(quán)值,也就是說在這組權(quán)值下網(wǎng)絡(luò)可以更好的提取圖像特征用于分類識別。

關(guān)于源碼的問題:個人非常不推薦直接用別人的源碼,所以我的博客里所有文章不會給出整個工程的源碼,但是會給出一些核心函數(shù)的代碼,如果你仔細(xì)閱讀文章,一定能夠很好的理解算法的核心思想。嘗試著去自己實現(xiàn),會對你的理解更有幫助。有什么疑問可以直接在下面留言。

?


總結(jié)

以上是生活随笔為你收集整理的神经网络:卷积神经网络的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。