caffe中的卷積的計算細節和1x1卷積作用

2021-07-25 12:02:10 字數 2704 閱讀 6261

在卷積神經網路中,卷積算是乙個必不可少的操作,

下圖是乙個簡單的各層的關係。

可以看出乙個很好的擴充套件的關係,下面是整個卷積的大概的過程

圖中上半部分是傳統的卷積的操作,下圖是乙個矩陣的相乘的操作。

下圖是在乙個卷積層中將卷積操作展開的具體操作過程,他裡面按照卷積核的大小取資料然後展開,在同一張圖里的不同卷積核選取的逐行擺放,不同n的話,就在同一行後面繼續拼接,不同個可以是多個通道,但是需要注意的是同一行裡面每一段都應該對應的是原圖中中乙個位置的卷積視窗。

從上圖可以清晰的看到卷積的計算過程是 

將乙個三通道的rgb的影象拆分成三張單通道的影象,然後針對每乙個通道都有乙個k個卷積核,進行卷積操作,從圖中可以清晰看到每乙個通道的對應的k個卷積和都是不同的,但是在計算完成之後,在將對應的卷積的結果進行疊加,即可,這樣就得到整個卷積層的特徵影象了。下一步就是其他的操作。

下圖是在乙個卷積層中將卷積操作展開的具體操作過程,他裡面按照卷積核的大小取資料然後展開,在同一張圖里的不同卷積核選取的逐行擺放,不同n的話,就在同一行後面繼續拼接,不同個可以是多個通道,但是需要注意的是同一行裡面每一段都應該對應的是原圖中中乙個位置的卷積視窗。

對於卷積層中的卷積操作,還有乙個

group的概念要說明一下,groups是代表filter組的個數。引入gruop主要是為了選擇性的連線卷基層的輸入端和輸出端的channels,否則引數會太多。每乙個group和1/ group的input通道和 1/group的output

通道進行卷積操作。比如有4個input, 8個output,那麼1-4屬於第一組,5-8屬於第二個gruop

reference:

我來說說我的理解,我認為1×1的卷積大概有兩個方面的作用吧:

1. 實現跨通道的互動和資訊整合

2. 進行卷積核通道數的降維和公升維

下面詳細解釋一下:

1. 1×1的卷積層(可能)引起人們的重視是在nin的結構中,**中林敏師兄的想法是利用mlp代替傳統的線性卷積核,從而提高網路的表達能力。文中同時利用了跨通道pooling的角度解釋,認為文中提出的mlp其實等價於在傳統卷積核後面接cccp層,從而實現多個feature map的線性組合,實現跨通道的資訊整合。

而cccp層是等價於1×1卷積的,因此細看nin的caffe實現,就是在每個傳統卷積層後面接了兩個cccp層(其實就是接了兩個1×1的卷積層)。

2. 進行降維和公升維引起人們重視的(可能)是在googlenet裡。對於每乙個inception模組(如下圖),原始模組是左圖,右圖中是加入了1×1卷積進行降維的。雖然左圖的卷積核都比較小,但是當輸入和輸出的通道數很大時,乘起來也會使得卷積核引數變的很大,而右圖加入1×1卷積後可以降低輸入的通道數,卷積核引數、運算複雜度也就跟著降下來了。

以googlenet的3a模組為例,輸入的feature map是28×28×192/

3a模組中1×1卷積通道為64/

3×3卷積通道為128,5×5卷積通道為32/

如果是左圖結構,那麼卷積核引數為1×1×192×64+3×3×192×128+5×5×192×32

而右圖對3×3和5×5卷積層前分別加入了通道數為96和16的1×1卷積層,這樣卷積核引數就變成了1×1×192×64+(1×1×192×96+3×3×96×128)+(1×1×192×16+5×5×16×32),引數大約減少到原來的三分之一。同時在並行pooling層後面加入1×1卷積層後也可以降低輸出的feature map數量,左圖pooling後feature map是不變的,再加卷積層得到的feature map,會使輸出的feature map擴大到416,如果每個模組都這樣,網路的輸出會越來越大。而右圖在pooling後面加了通道為32的1×1卷積,使得輸出的feature map數降到了256。googlenet利用1×1的卷積降維後,得到了更為緊湊的網路結構,雖然總共有22層,但是引數數量卻只是8層的alexnet的十二分之一(當然也有很大一部分原因是去掉了全連線層)。

最近大熱的msra的resnet同樣也利用了1×1卷積,並且是在3×3卷積層的前後都使用了,不僅進行了降維,還進行了公升維,使得卷積層的輸入和輸出的通道數都減小,引數數量進一步減少,如下圖的結構。(不然真不敢想象152層的網路要怎麼跑起來tat)

cnn裡的卷積大都是多通道的feature map和多通道的卷積核之間的操作(輸入的多通道的feature map和一組卷積核做卷積求和得到乙個輸出的feature map),如果使用1x1的卷積核,這個操作實現的就是多個feature map的線性組合,可以實現feature map在通道個數上的變化。接在普通的卷積層的後面,配合啟用函式,就可以實現network in network的結構了

caffe中的卷積

如上,將三維的操作轉換到二維上面去做,然後呼叫gemm庫進行矩陣間的運算得到最後結果。兩個矩陣相乘,需要中間的那個維度相同,這個相同的維度就是c k k,其中c是feature map的維度,k為卷積核的邊長。按照卷積核在feature map上面滑窗的順序將其展開成二維的。在三維上面看,就是卷積核...

Caffe中卷積層的實現

出處 將尺寸為k k的卷積核在某個位置對應的feature map區域表示為k k的一維向量 將feature map各個通道對應的向量之間,串聯起來 那麼尺寸k k的卷積核在某個位置對應的各個通道的feature map,組合起來就是長度為c k k的一維向量。當卷積核對應到新的位置上,又得到新的...

Caffe的卷積原理

caffe中的卷積計算是將卷積核矩陣和輸入影象矩陣變換為兩個大的矩陣a與b,然後a與b進行矩陣相乘得到結果c 利用gpu進行矩陣相乘的高效性 三個矩陣的說明如下 1 在矩陣a中 m為卷積核個數,k k k,等於卷積核大小,即第乙個矩陣每行為乙個卷積核向量 是將二維的卷積核轉化為一維 總共有m行,表示...