摘要:在卷積神經網路中,通過使用filters提取不同的特徵,這些filters的權重是在訓練期間自動學習的,然後將所有這些提取的特徵“組合”以做出決策。
本文分享自華為雲社群《神經網路常用卷積總結》,原文作者:fdafad 。
進行卷積的目的是從輸入中提取有用的特徵。在影像處理中,可以選擇各種各樣的filters。每種型別的filter都有助於從輸入影像中提取不同的特徵,例如水平/垂直/對角線邊緣等特徵。在卷積神經網路中,通過使用filters提取不同的特徵,這些filters的權重是在訓練期間自動學習的,然後將所有這些提取的特徵“組合”以做出決策。
目錄:
- 2D卷積
- 3D卷積
- 1*1卷積
- 空間可分離卷積
- 深度可分離卷積
- 分組卷據
- 擴充套件卷積
- 反摺積
- Involution
2D卷積
單通道:在深度學習中,卷積本質上是對訊號按元素相乘累加得到卷積值。對於具有1個通道的影像,下圖演示了卷積的運算形式:
這裡的filter是一個3 x 3的矩陣,元素為[[0,1,2],[2,2,0],[0,1,2]]。filter在輸入資料中滑動。在每個位置,它都在進行逐元素的乘法和加法。每個滑動位置以一個數字結尾,最終輸出為3 x 3矩陣。
多通道:由於影像一般具有RGB3個通道,所以卷積一般多用於多通道輸入的場景。下圖演示了多通道輸入場景的運算形式:
這裡輸入層是一個5 x 5 x 3矩陣,有3個通道,filters是3 x 3 x 3矩陣。首先,filters中的每個kernels分別應用於輸入層中的三個通道,執行三次卷積,產生3個尺寸為3×3的通道:
然後將這三個通道相加(逐個元素相加)以形成一個單個通道(3 x 3 x 1),該通道是使用filters(3 x 3 x 3矩陣)對輸入層(5 x 5 x 3矩陣)進行卷積的結果:
3D卷積
在上一個插圖中,可以看出,這實際上是在完成3D-卷積。但通常意義上,仍然稱之為深度學習的2D-卷積。因為filters的深度和輸入層的深度相同,3D-filters僅在2個維度上移動(影像的高度和寬度),得到的結果為單通道。通過將2D-卷積的推廣,在3D-卷積定義為filters的深度小於輸入層的深度(即卷積核的個數小於輸入層通道數),故3D-filters需要在三個維度上滑動(輸入層的長、寬、高)。在filters上滑動的每個位置執行一次卷積操作,得到一個數值。當filters滑過整個3D空間,輸出的結構也是3D的。2D-卷積和3D-卷積的主要區別為filters滑動的空間維度,3D-卷積的優勢在於描述3D空間中的物件關係。3D關係在某一些應用中十分重要,如3D-物件的分割以及醫學影像的重構等。
1*1卷積
對於1*1卷積而言,表面上好像只是feature maps中的每個值乘了一個數,但實際上不僅僅如此,首先由於會經過啟用層,所以實際上是進行了非線性對映,其次就是可以改變feature maps的channel數目。
上圖中描述了:在一個維度為 H x W x D 的輸入層上的操作方式。經過大小為 1 x 1 x D 的filters的 1 x 1 卷積,輸出通道的維度為 H x W x 1。如果我們執行 N 次這樣的 1 x 1 卷積,然後將這些結果結合起來,我們能得到一個維度為 H x W x N 的輸出層。
空間可分離卷積
在一個可分離卷積中,我們可以將核心操作拆分成多個步驟。我們用y = conv(x,k)表示卷積,其中y是輸出影像,x是輸入影像,k是核心。這一步很簡單。接下來,我們假設k可以由下面這個等式計算得出:k = k1.dot(k2)。這將使它成為一個可分離的卷積,因為我們可以通過對k1和k2做2個一維卷積來取得相同的結果,而不是用k做二維卷積。
以通常用於影像處理的Sobel核心為例。你可以通過乘以向量[1,0,-1]和[1,2,1] .T獲得相同的核心。在執行相同的操作時,你只需要6個而不是9個引數。
深度可分離卷積
空間可分離卷積(上一小節),而在深度學習中,深度可分離卷積將執行一個空間卷積,同時保持通道獨立,然後進行深度卷積操作。假設我們在一個16輸入通道和32輸出通道上有一個3x3的卷積層。那麼將要發生的就是16個通道中的每一個都由32個3x3的核心進行遍歷,從而產生512(16x32)的特徵對映。接下來,我們通過將每個輸入通道中的特徵對映相加從而合成一個大的特徵對映。由於我們可以進行此操作32次,因此我們得到了期望的32個輸出通道。那麼,針對同一個示例,深度可分離卷積的表現又是怎樣的呢?我們遍歷16個通道,每一個都有一個3x3的核心,可以給出16個特徵對映。現在,在做任何合併操作之前,我們將遍歷這16個特徵對映,每個都含有32個1x1的卷積,然後才逐此開始新增。這導致與上述4608(16x32x3x3)個引數相反的656(16x3x3 + 16x32x1x1)個引數。下面再進行詳細說明。前面部分所提到的 2D 卷積核 1x1 卷積。讓我們先快速過一下標準的 2D 卷積。舉一個具體的案例,假設輸入層的大小為 7 x 7 x 3(高 x 寬 x 通道),過濾器大小為 3 x 3 x 3,經過一個過濾器的 2D 卷積後,輸出層的大小為 5 x 5 x 1(僅有 1 個通道)。如下圖所示:
一般來說,兩個神經網路層間應用了多個過濾器,現在假設過濾器個數為 128。128 次 2D 卷積得到了 128 個 5 x 5 x 1 的輸出對映。然後將這些對映堆疊為一個大小為 5 x 5 x 128 的單個層。空間維度如高和寬縮小了,而深度則擴大了。如下圖所示:
接下來看看使用深度可分離卷積如何實現同樣的轉換。首先,我們在輸入層上應用深度卷積。我們在 2D 卷積中分別使用 3 個卷積核(每個過濾器的大小為 3 x 3 x 1),而不使用大小為 3 x 3 x 3 的單個過濾器。每個卷積核僅對輸入層的 1 個通道做卷積,這樣的卷積每次都得出大小為 5 x 5 x 1 的對映,之後再將這些對映堆疊在一起建立一個 5 x 5 x 3 的影像,最終得出一個大小為 5 x 5 x 3 的輸出影像。這樣的話,影像的深度保持與原來的一樣。
深度可分離卷積—第一步:在 2D 卷積中分別使用 3 個卷積核(每個過濾器的大小為 3 x 3 x 1),而不使用大小為 3 x 3 x 3 的單個過濾器。每個卷積核僅對輸入層的 1 個通道做卷積,這樣的卷積每次都得出大小為 5 x 5 x 1 的對映,之後再將這些對映堆疊在一起建立一個 5 x 5 x 3 的影像,最終得出一個大小為 5 x 5 x 3 的輸出影像。深度可分離卷積的第二步是擴大深度,我們用大小為 1x1x3 的卷積核做 1x1 卷積。每個 1x1x3 卷積核對 5 x 5 x 3 輸入影像做卷積後都得出一個大小為 5 x 5 x1 的對映。
這樣的話,做 128 次 1x1 卷積後,就可以得出一個大小為 5 x 5 x 128 的層。
分組卷積
Group convolution 分組卷積,最早在AlexNet中出現,由於當時的硬體資源有限,訓練AlexNet時卷積操作不能全部放在同一個GPU處理,因此作者把feature maps分給多個GPU分別進行處理,最後把多個GPU的結果進行融合。
下面描述分組卷積是如何實現的。首先,傳統的 2D 卷積步驟如下圖所示。在這個案例中,通過應用 128 個過濾器(每個過濾器的大小為 3 x 3 x 3),大小為 7 x 7 x 3 的輸入層被轉換為大小為 5 x 5 x 128 的輸出層。針對通用情況,可概括為:通過應用 Dout 個卷積核(每個卷積核的大小為 h x w x Din),可將大小為 Hin x Win x Din 的輸入層轉換為大小為 Hout x Wout x Dout 的輸出層。在分組卷積中,過濾器被拆分為不同的組,每一個組都負責具有一定深度的傳統 2D 卷積的工作。下圖的案例表示得更清晰一些。
擴張卷積
擴張卷積引入另一個卷積層的引數被稱為擴張率。這定義了核心中值之間的間距。擴張速率為2的3x3核心將具有與5x5核心相同的視野,而只使用9個引數。 想象一下,使用5x5核心並刪除每個間隔的行和列。(如下圖所示)系統能以相同的計算成本,提供更大的感受野。擴張卷積在實時分割領域特別受歡迎。 在需要更大的觀察範圍,且無法承受多個卷積或更大的核心,可以才用它。
直觀上,空洞卷積通過在卷積核部分之間插入空間讓卷積核「膨脹」。這個增加的引數 l(空洞率)表明了我們想要將卷積核放寬到多大。下圖顯示了當 l=1,2,4 時的卷積核大小。(當l=1時,空洞卷積就變成了一個標準的卷積)。
反摺積
這裡提到的反摺積跟1維訊號處理的反摺積計算是很不一樣的,FCN作者稱為backwards convolution,有人稱Deconvolution layer is a very unfortunate name and should rather be called a transposed convolutional layer. 我們可以知道,在CNN中有con layer與pool layer,con layer進行對影像卷積提取特徵,pool layer對影像縮小一半篩選重要特徵,對於經典的影像識別CNN網路,如IMAGENET,最後輸出結果是1X1X1000,1000是類別種類,1x1得到的是。FCN作者,或者後來對end to end研究的人員,就是對最終1x1的結果使用反摺積(事實上FCN作者最後的輸出不是1X1,是圖片大小的32分之一,但不影響反摺積的使用)。這裡影像的反摺積與圖6的full卷積原理是一樣的,使用了這一種反摺積手段使得影像可以變大,FCN作者使用的方法是這裡所說反摺積的一種變體,這樣就可以獲得相應的畫素值,影像可以實現end to end。
目前使用得最多的deconvolution有2種:
方法1:full卷積, 完整的卷積可以使得原來的定義域變大
方法2:記錄pooling index,然後擴大空間,再用卷積填充。影像的deconvolution過程如下:
輸入:2x2, 卷積核:4x4, 滑動步長:3, 輸出:7x7
即輸入為2x2的圖片經過4x4的卷積核進行步長為3的反摺積的過程
1.輸入圖片每個畫素進行一次full卷積,根據full卷積大小計算可以知道每個畫素的卷積後大小為 1+4-1=4, 即4x4大小的特徵圖,輸入有4個畫素所以4個4x4的特徵圖
2.將4個特徵圖進行步長為3的fusion(即相加); 例如紅色的特徵圖仍然是在原來輸入位置(左上角),綠色還是在原來的位置(右上角),步長為3是指每隔3個畫素進行fusion,重疊部分進行相加,即輸出的第1行第4列是由紅色特陣圖的第一行第四列與綠色特徵圖的第一行第一列相加得到,其他如此類推。
可以看出反摺積的大小是由卷積核大小與滑動步長決定, in是輸入大小, k是卷積核大小, s是滑動步長, out是輸出大小
得到 out = (in - 1) * s + k
上圖過程就是, (2 - 1) * 3 + 4 = 7
Involution
論文:Involution: Inverting the Inherence of Convolution for Visual Recognition (CVPR'21)
程式碼開源地址:https://github.com/d-li14/involution
儘管神經網路體系結構發展迅速,但卷積仍然是深度神經網路架構構建的主要元件。從經典的影像濾波方法中得到的靈感,卷積核具有2個顯著的特性Spatial-agnostic和Channel-specific。在Spatial上,前者的性質保證了卷積核在不同位置之間的共享,實現了平移不變性。在Channel域中,卷積核的頻譜負責收集編碼在不同Channel中的不同資訊,滿足後一種特性。此外,自從VGGNet出現以來,現代神經網路通過限制卷積核的空間跨度不超過3*3來滿足卷積核的緊湊性。
一方面,儘管Spatial-Agnostic和Spatial-Compact的性質在提高效率和解釋平移不變性等價方面有意義,但它剝奪了卷積核適應不同空間位置的不同視覺模式的能力。此外,區域性性限制了卷積的感受野,對小目標或者模糊影像構成了挑戰。另一方面,眾所周知,卷積核內部的通道間冗餘在許多經典深度神經網路中都很突出,這使得卷積核對於不同通道的靈活性受到限制。
為了克服上述限制,本文作者提出了被稱為involution的操作,與標準卷積相比,involution具有對稱反向特性,即Spatial-Specific和Channel-Agnostic。具體地說,involution核在空間範圍上是不同的,但在通道上是共享的。由於involution核的空間特性,如果將其引數化為卷積核等固定大小的矩陣,並使用反向傳播演算法進行更新,則會阻礙學習到的對合核在不同解析度的輸入影像之間的傳輸。在處理可變特徵解析度的最後,屬於特定空間位置的involution核可能僅在對應位置本身的傳入特徵向量的條件下作為例項生成。此外,作者還通過在通道維數上共享involution核來減少核的冗餘。
綜合上述2個因素,involution運算的計算複雜度隨特徵通道數量線性增加,動態引數化involution核在空間維度上具有廣泛的覆蓋。通過逆向設計方案,本文提出的involution具有卷積的雙重優勢:
1:involution可以在更廣闊的空間中聚合上下文,從而克服了對遠端互動進行建模的困難
2:involution可以在不同位置上自適應地分配權重,從而對空間域中資訊最豐富的視覺元素進行優先排序。
大家也都知道最近基於Self-Attention進一步的研究表明,很多工為了捕獲特徵的長期依賴關係提出使用Transformer來進行建模。在這些研究中,純粹的Self-Attention可以被用來構建具有良好效能的獨立模型。而本文將揭示Self-Attention是通過一個複雜的關於核結構的公式來對鄰近畫素之間的關係進行建模,其實也就是involution化的特殊情況。相比之下,本文所採用的核是根據單個畫素生成的,而不是它與相鄰畫素的關係。更進一步,作者在實驗中證明,即使使用簡單版本,也可以實現Self-Attention的精確。
involution的計算過程如下圖所示:
針對輸入feature map的一個座標點上的特徵向量,先通過 ∅ (FC-BN-ReLU-FC)和reshape (channel-to-space)變換展開成kernel的形狀,從而得到這個座標點上對應的involution kernel,再和輸入feature map上這個座標點鄰域的特徵向量進行Multiply-Add得到最終輸出的feature map。具體操作流程和tensor形狀變化如下:
另外作者基於MM系列程式碼,實現了mmclassficton、mmsegmentation、mmdetection中的部分模型。