關於caffe 是如何卷積的一點總結

  最近,在看caffe源碼時,偶然在網上看到一個問題?以爲挺有意思,因而,仔細的查了相關資料,並將總結寫在這裏,供你們迷惑時,起到一點啓示做用吧。html

       問題的題目是CNN中的一個卷積層輸入64個通道的特徵子圖,輸出256個通道的特徵子圖,那麼,該層一共包含多少個卷積核?git

對於上面這個問題,目前有兩種答案,每一種答案的區別是所基於的卷積核的維度不一樣而致使的。下面是兩種答案的解析過程:github

第一種答案:卷積核是二維的(caffe源碼中以卷積核二維轉化成相應矩陣),那麼就須要64*256個卷積核來對輸入特徵子圖進行卷積,其中,輸入的每一個通道對應64種不一樣的卷積核進行卷積,再將64種卷積核獲得的卷積結果合併成一張輸出特徵子圖;這樣,就會獲得256個通道的特徵子圖。ide

第二種答案:卷積核是三維的(caffe大神賈楊清老師的回答中就是這麼認爲的),那麼一個卷積核的表示爲C*H*W(C:通道數,H:卷積核的高,W:卷積核寬)。那麼對於輸入的特徵子圖,就須要一個大小爲64*h*w的卷積核進行卷積,獲得一張特徵子圖。這樣,就須要256個不一樣卷積核,每一個卷積核的通道數爲64,從而獲得256個通道的特徵子圖。學習

  顯然,這兩種答案都有必定的依據,無論如何認爲,其最終的目的都是要將卷積層複雜的卷積問題轉化爲矩陣的相乘問題,從而大大的提升計算速度。spa

  那麼,確定有不少朋友,尤爲是像我這種深度學習的菜鳥,一開始仍是比較迷糊的,對於上面的解釋仍是不知所云。那麼,下面,我就來對這兩種觀點進行具體分析,不足之處,但願你們能指出來,共同窗習。3d

一,卷積核是二維的orm

  咱們知道,在caffe中卷積層的運算是首先經過img2col()將各個卷積核和輸入特徵子圖轉化爲向量,而後多個卷積核或輸入特徵子圖的向量組合成爲矩陣;接下來,經過矩陣相乘運算獲得卷積的結果,再經過col2img()將向量轉化爲特徵子圖。M個卷積核卷積一張輸入圖像的矩陣計算以下圖所示:htm

圖來自http://www.cnblogs.com/laiqun/p/6055498.htmlblog

其中,M表示二維卷積核的個數,K=k*k表示二維卷積核的大小;這樣,每一個k*k大小的二維卷積核轉化爲一個行向量,M個二維卷積覈對應M個行向量就獲得了M*K的卷積矩陣A。

再說矩陣B:假設輸入的每張特徵子大小爲r*r,二維卷積核的大小爲k*k,擴展大小pad,步長爲stride,那麼對於每張特徵子圖,按卷積核每次卷積圖像的大小k*k,將該塊卷積的圖像轉化爲行向量,長度也爲k*k=K,這樣,依據卷積核與輸入圖像卷積的過程,將每一次卷積核卷積的區域轉化爲一個行向量,各個行向量按照卷積前後順序以列進行排列,從而獲得了矩陣B。此外,對於卷積後獲得的二維特徵子圖的大小,在caffe中的計算公式以下(這裏假設,輸入圖像和卷積和大小都是q*q的,即長與寬相等):

  輸出特徵子圖大小:n*n=[(r+2*pad-k)/strde+1]*[(r+2*pad-k)/strde+1]

若是咱們令pad=0,stride=1,那麼就會變成咱們熟悉的形式,即n*n=[(r-k)+1]*[(r-k)/+1]。好比,輸入特徵圖大小爲32*32,卷積核大小爲3*3,那麼輸出的特徵子圖大小爲(32-3+1)*(32-3+1)=28*28。

  好了,如今咱們知道了矩陣B的列N=n*n,而後經過矩陣相乘運行,即A*BT=(M*K)*(N*K)T=(M*K)*(K*N)=(M*N)=C,即獲得了最終的矩陣C。固然,在caffe中可能會存在偏置項,那麼這個矩陣C還要加上偏置矩陣P,而後獲得最終的輸出矩陣D,再經過col2img()將D中的每一行轉化爲一張特徵圖,就獲得了輸出的各個特徵子圖,從而完成了該卷積層的卷積運算。

二,卷積核是三維的

  對於卷積核是三維的狀況,主要參考的是賈楊清老師在知乎上的一個解答。即認爲每一個輸入圖像和每一個卷積核的大小表示爲C*H*W,即:

 

  由上圖知道,一個輸入特徵圖的表示是C*H*W(通道數*長*寬),一個卷積核的大小表示爲C*K*K(注意:這裏,若是認爲卷積核是三維的,就必須保證卷積核的通道數跟輸入特徵圖的通道數相同,不然卷積失敗),那麼根據卷積核一次卷積的圖像區域,將該區域圖像轉化爲行向量,即獲得一個C*k*k的行向量。

  按此方式,將一張圖像按照卷積的順序獲得的行向量按列排列,就獲得了最終的特徵矩陣以下:

上圖知道,對於一個C*H*W的圖像,按照卷積核大小進行卷積,轉化爲的特徵矩陣大小爲:(H*W)*(C*K*K)。

那麼,對於多個卷積核而言,將多個卷積核轉化爲卷積矩陣過程以下:

這裏,卷積核的個數爲Cout,每一個卷積核的大小爲C*K*K,同理,將每一個卷積核轉化爲一個行向量C*K*K,按照卷積核個數按列排列,就獲得卷積矩陣Cout*(C*K*K)。

  最後,將卷積矩陣與輸入特徵矩陣的轉置進行相乘,就獲得了最終的輸出特徵矩陣[Cout*(C*K*K)]*[(H*W)*(C*K*K)]T=[Cout*(C*K*K)]*[(C*K*K)*(H*W)]=Cout*(H*W)。這樣,再將輸出矩陣的每一行轉化爲一張特徵圖,就獲得了Cout張輸出特徵子圖。而這,也就印證了:卷積層輸出的特徵圖個數等於卷積核的個數。

  以上,就是對兩種對於卷積核的維度不一樣見解的具體分析,無論怎麼定義,都有其充分的理由和實踐證實。而且,最重要的是,無論卷積覈定義爲二維仍是三維,都是爲了數據轉化爲矩陣的形式,從而將卷積層的複雜的卷積過程,轉化爲矩陣的相乘的簡單運算,大大的提升了計算的速度。

  最後,經過一個具體的例子,來看一下將卷積轉化爲矩陣運算的過程:

 

參考連接:http://www.cnblogs.com/laiqun/p/6055498.html

     https://www.zhihu.com/question/28385679

     Convolution in Caffe: a memo · Yangqing/caffe Wiki · GitHub 

              High Performance Convolutional Neural Networks for Document Processing
相關文章
相關標籤/搜索