這篇卷積神經網路是前面介紹的多層神經網路的進一步深入,它將深度學習的思想引入到了神經網路當中,通過卷積運算來由淺入深的提取影象的不同層次的特徵,而利用神經網路的訓練過程讓整個網路自動調節卷積核的引數,從而無監督的產生了最適合的分類特徵。這個概括可能有點抽象,我盡量在下面描述細緻一些,但如果要更深入了解整個過程的原理,需要去了解deeplearning。
卷積是分析數學中一種很重要的運算,其實是乙個很簡單的概念,但是很多做影象處理的人對這個概念都解釋不清,為了簡單起見,這裡面我們只介紹離散形式的卷積,那麼在影象上,對影象用乙個卷積核進行卷積運算,實際上是乙個濾波的過程。我們先看一下卷積的基本數學表示:
$$f(x,y)\circ w(x,y)=\sum_^a \sum_^b w(s,t)f(x-s,y-t)$$
其中$i=f(x,y)$是乙個影象,$f(x,y)$是影象i上面$x$行$y$列上點的灰度值。而$w(x,y)$有太多名字叫了,濾波器、卷積核、響應函式等等,而$a$和$b$定義了卷積核即$w(x,y)$的大小。
從上面的式子中,可以很明顯的看到,卷積實際上是提供了乙個權重模板,這個模板在影象上滑動,並將中心依次與影象中每乙個畫素對齊,然後對這個模板覆蓋的所有畫素進行加權,並將結果作為這個卷積核在影象上該點的響應。所以從整個卷積運算我們可以看到以下幾點:
1)卷積是一種線性運算
2)卷積核的大小,定義了影象中任何一點參與運算的鄰域的大小。
3)卷積核上的權值大**明了對應的鄰域點對最後結果的貢獻能力,權重越大,貢獻能力越大。
4)卷積核沿著影象所有畫素移動並計算響應,會得到乙個和原影象等大影象。
5)在處理邊緣上點時,卷積核會覆蓋到影象外層沒有定義的點,這時候有幾種方法設定這些沒有定義的點,可以用內層畫素映象複製,也可以全設定為0。
其實影象特徵提取在部落格裡的一些其他文章都有提過,這裡我想說一下影象特徵提取與卷積的關係。其實大部分的影象特徵提取都依賴於卷積運算,比如顯著的邊緣特徵就是用各種梯度卷積運算元對影象進行濾波的結果。乙個影象裡目標特徵主要體現在畫素與周圍畫素之間形成的關係,這些鄰域畫素關係形成了線條、角點、輪廓等。而卷積運算正是這種用鄰域點按一定權重去重新定義該點值的運算。
水平梯度的卷積運算元:
豎直梯度的卷積運算元:
根據深度學習關於人的視覺分層的理論,人的視覺對目標的辨識是分層的,低層會提取一些邊緣特徵,然後高一些層次進行形狀或目標的認知,更高層的會分析一些運動和行為。也就是說高層的特徵是低層特徵的組合,從低層到高層的特徵表示越來越抽象,越來越能表現語義或者意圖。而抽象層面越高,存在的可能猜測就越少,就越利於分類。
而深度學習就是通過這種分層的自動特徵提取來達到目標分類,先構建一些基本的特徵層,然後用這些基礎特徵去構建更高層的抽象,更精準的分類特徵。
那整個卷積神經網路的結構也就很容易理解了,它在普通的多層神經網路的前面加了2層特徵層,這兩層特徵層是通過權重可調整的卷積運算實現的。
與普通多層神經網路不同的是,卷積神經網路裡,有特徵抽取層與降維層,這些層的結點鏈結是部分連線且,一幅特徵圖由乙個卷積核生成,這一幅特徵圖上的所有結點共享這一組卷積核的引數。
這裡我們設計乙個5層的卷積神經網路,乙個輸入層,乙個輸出層,2個特徵提取層,乙個全連線的隱藏層。下面詳細說明每一層的設計思路。
在一般的介紹卷積神經網路的文章中你可能會看到在特徵層之間還有2層降維層,在這裡我們將卷積與降維同步進行,只用在卷積運算時,遍歷影象中畫素時按步長間隔遍歷即可。
輸入層:普通的多層神經網路,第一層就是特徵向量。一般影象經過人為的特徵挑選,通過特徵函式計算得到特徵向量,並作為神經網路的輸入。而卷積神經網路的輸出層則為整個影象,如上圖示例29*29,那麼我們可以將影象按列展開,形成841個結點。而第一層的結點向前沒有任何的鏈結線。
第1層:第1層是特徵層,它是由6個卷積模板與第一層的影象做卷積形成的6幅13*13的影象。也就是說這一層中我們算上乙個偏置權重,一共有只有(5*5+1)*6=156權重引數,但是,第二層的結點是將6張影象按列展開,即有6*13*13=1014個結點。
而第2層構建的真正難點在於,鏈結線的設定,當前層的結點並不是與前一層的所有結點相連,而是只與25鄰域點連線,所以第二層一定有(25+1)*13*13*6=26364條連線,但是這些鏈結線共享了156個權值。按前面多層網路c++的設計中,每個連線物件有2個成員,乙個是權重的索引,乙個是上一層結點的索引,所以這裡面要正確的設定好每個連線的索引值,這也是卷積神經網路與一般全鏈結層的區別。
第2層:第2層也是特徵層,它是由50個特徵影象組成,每個特徵影象是5*5的大小,這個特徵影象上的每一點都是由前一層6張特徵影象中每個影象取25個鄰域點最後在一起加權而成,所以每個點也就是乙個結點有(5*5+1)*6=156個鏈結線,那麼當前層一共有5*5*50=1250個結點,所以一共有195000個權重鏈結線,但是只有(5*5+1)*6*50=7800個權重引數,每個權重鏈結線的值都可以在7800個權重引數陣列中找到索引。
所以第3層的關鍵也是,如何建立好每根鏈結線的權重索引與與前一層鏈結的結點的索引。
第3層:和普通多神經網路沒有區別了,是乙個隱藏層,有100個結點構成,每個結點與上一層中1250個結點相聯,共有125100個權重與125100個鏈結線。
第4層:輸出層,它箇結點個數與分類數目有關,假設這裡我們設定為10類,則輸出層為10個結點,相應的期望值的設定在多層神經網路裡已經介紹過了,每個輸出結點與上面隱藏層的100個結點相連,共有(100+1)*10=1010條鏈結線,1010個權重。
從上面可以看出,卷積神經網路的核心在於卷積層的建立,所以在設計cnnlayer類的時候,需要兩種建立網路層的成員函式,乙個用於建立普通的全連線層,乙個用於建立卷積層。
1建立普通層,在前面介紹的多層神經網路中已經給出過**,它接收兩個引數,乙個是前面一層結點數,乙個是當前層結點數。class
cnnlayer29
//建立卷積層
10void
createconvlayer(unsigned curnumberofneurals, unsigned prenumberofneurals, unsigned prenumberoffeatmaps, unsigned curnumberoffeatmaps);
11//
建立 普通層
12void
createlayer(unsigned curnumberofneurals,unsigned prenumberofneurals);
13void backpropagate(vector& derrwrtdxn, vector& derrwrtdxnm, double
eta);
14 };
而卷積層的建立則複雜的多,所有鏈結線的索引值的確定需要對整個網路有較清楚的了解。這裡設計的createconvlayer函式,它接收4個引數,分別對應,當前層結點數,前一層結點數,前一層特徵圖的個數和當前層特徵影象的個數。
下面是c++**,要理解這一部分可以會稍有點難度,因為特徵圖實際中都被按列展開了,所以鄰域這個概念會比較抽象,我們考慮把特徵影象還原,從影象的角度去考慮。
1整個網路結構搭建好以後,訓練只用按照多層神經網路那樣訓練即可,其中的權值更新策略都是一致的。所以總體來說,卷積神經網路與普通的多層神經網路,就是結構上不同。卷積神經網路多了特徵提取層與降維層,他們之間結點的鏈結方式是部分鏈結,多個鏈結線共享權重。而多層神經網路前後兩層之間結點是全鏈結。除了這以外,權值更新、訓練、識別都是一致的。void
cnnlayer::createconvlayer
2(unsigned curnumberofneurals, unsigned prenumberofneurals, unsigned prenumberoffeatmaps, unsigned curnumberoffeatmaps)314
//建立所有鏈結線
1516
for (unsigned i = 0; i != curnumberoffeatmaps; i++)
1736
m_neurals.push_back(neural);37}
38}39}
40}41 }
訓練得到一組權值,也就是說在這組權值下網路可以更好的提取影象特徵用於分類識別。
神經網路 卷積神經網路
1.卷積神經網路概覽 來自吳恩達課上一張,通過對應位置相乘求和,我們從左邊矩陣得到了右邊矩陣,邊緣是白色寬條,當畫素大一些時候,邊緣就會變細。觀察卷積核,左邊一列權重高,右邊一列權重低。輸入,左邊的部分明亮,右邊的部分灰暗。這個學到的邊緣是權重大的寬條 都是30 表示是由亮向暗過渡,下面這個圖左邊暗...
卷積神經網路和神經網路
在神經網路中,每一層的每個神經元都與下一層的每個神經元相連 如下圖 這種連線關係叫全連線 full connected 如果以影象識別為例,輸入就是是每個畫素點,那麼每乙個畫素點兩兩之間的關係 無論相隔多遠 都被下一層的神經元 計算 了。這種全連線的方法用在影象識別上面就顯得太 笨 了,因為影象識別...
卷積神經網路 有趣的卷積神經網路
一 前言 最近一直在研究深度學習,聯想起之前所學,感嘆數學是一門樸素而神奇的科學。f g m1 m2 r 萬有引力描述了宇宙星河運轉的規律,e mc 描述了恆星發光的奧秘,v h d哈勃定律描述了宇宙膨脹的奧秘,自然界的大部分現象和規律都可以用數學函式來描述,也就是可以求得乙個函式。神經網路 簡單又...