CNN 中千奇百怪的卷積方式大匯總

2020-11-29 搜狐網

原標題:CNN 中千奇百怪的卷積方式大匯總

雷鋒網按:本文原作者Xf Mao,本文原載於知乎。雷鋒網已獲得作者授權。

推薦另一篇很好的總結:變形卷積核、可分離卷積?卷積神經網絡中十大拍案叫絕的操作。

這篇總結很專業,並且很好的回答了評論中的疑問:

Depthwise Separable Convolution 就是卷積加 group 吧?

這篇文章裡是這麼說的:

要注意的是,Group conv 是一種 channel 分組的方式,Depthwise +Pointwise 是卷積的方式,只是 ShuffleNet 裡面把兩者應用起來了。因此 Group conv 和 Depthwise +Pointwise 並不能劃等號。

我覺得 Depthwise +Pointwise 卷積是提供一種把 feature map 的空間信息(height&width)和通道信息(channel)拆分分別處理的方法,而 group 卷積只是單純的通道分組處理,降低複雜度。

對於表述有誤的地方歡迎更正!另外目前僅列舉了一些比較著名且實用的卷積操作,對於沒提到的,希望大家指出與補充

1. 原始版本

最早的卷積方式還沒有任何騷套路,那就也沒什麼好說的了。

見下圖,原始的 conv 操作可以看做一個 2D 版本的無隱層神經網絡。

附上一個卷積詳細流程:

【TensorFlow】tf.nn.conv2d 是怎樣實現卷積的? - CSDN 博客

<img src="https://static.leiphone.com/uploads/new/article/pic/201709/fb01665eb9a74d64792d426dcb3a046e.jpg" data-rawwidth="933" data-rawheight="637" width="933" data-original="https://pic3.zhimg.com/v2-b3aed0d569a91f87da9f586217d76092_r.jpg" _src="https://static.leiphone.com/uploads/new/article/pic/201709/fb01665eb9a74d64792d426dcb3a046e.jpg"/>

代表模型:

LeNet:最早使用 stack 單卷積 + 單池化結構的方式,卷積層來做特徵提取,池化來做空間下採樣

AlexNet:後來發現單卷積提取到的特徵不是很豐富,於是開始 stack 多卷積 + 單池化的結構

VGG([1409.1556] Very Deep Convolutional Networks for Large-Scale Image Recognition):結構沒怎麼變,只是更深了

2. 多隱層非線性版本

這個版本是一個較大的改進,融合了 Network In Network 的增加隱層提升非線性表達的思想,於是有了這種先用 1*1 的卷積映射到隱空間,再在隱空間做卷積的結構。同時考慮了多尺度,在單層卷積層中用多個不同大小的卷積核來卷積,再把結果 concat 起來。

這一結構,被稱之為 「Inception」

<img src="https://static.leiphone.com/uploads/new/article/pic/201709/2b7c53ec65e0163883ac14bcd54a40eb.jpg" data-rawwidth="844" data-rawheight="442" width="844" data-original="https://pic4.zhimg.com/v2-eddec9ea8e0868c570fb95c00032c8e3_r.jpg" _src="https://static.leiphone.com/uploads/new/article/pic/201709/2b7c53ec65e0163883ac14bcd54a40eb.jpg"/>

代表模型:

Inception-v1([1409.4842] Going Deeper with Convolutions):stack 以上這種 Inception 結構

Inception-v2(Accelerating Deep Network Training by Reducing Internal Covariate Shift):加了 BatchNormalization 正則,去除 5*5 卷積,用兩個 3*3 代替

Inception-v3([1512.00567] Rethinking the Inception Architecture for Computer Vision):7*7 卷積又拆成 7*1+1*7

Inception-v4([1602.07261] Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning):加入了殘差結構

3. 空洞卷積

Dilation 卷積,通常譯作空洞卷積或者卷積核膨脹操作,它是解決 pixel-wise 輸出模型的一種常用的卷積方式。一種普遍的認識是,pooling 下採樣操作導致的信息丟失是不可逆的,通常的分類識別模型,只需要預測每一類的概率,所以我們不需要考慮 pooling 會導致損失圖像細節信息的問題,但是做像素級的預測時(譬如語義分割),就要考慮到這個問題了。

所以就要有一種卷積代替 pooling 的作用(成倍的增加感受野),而空洞卷積就是為了做這個的。通過卷積核插 「0」 的方式,它可以比普通的卷積獲得更大的感受野,這個 idea 的 motivation 就介紹到這裡。具體實現方法和原理可以參考如下連結:

如何理解空洞卷積(dilated convolution)?

膨脹卷積 --Multi-scale context aggregation by dilated convolutions

我在博客裡面又做了一個空洞卷積小 demo 方便大家理解

【Tensorflow】tf.nn.atrous_conv2d 如何實現空洞卷積? - CSDN 博客

代表模型:

FCN([1411.4038] Fully Convolutional Networks for Semantic Segmentation):Fully convolutional networks,顧名思義,整個網絡就只有卷積組成,在語義分割的任務中,因為卷積輸出的 feature map 是有 spatial 信息的,所以最後的全連接層全部替換成了卷積層。

Wavenet(WaveNet: A Generative Model for Raw Audio):用於語音合成。

4. 深度可分離卷積

Depthwise Separable Convolution,目前已被 CVPR2017 收錄,這個工作可以說是 Inception 的延續,它是 Inception 結構的極限版本。

為了更好的解釋,讓我們重新回顧一下 Inception 結構(簡化版本):

<img src="https://static.leiphone.com/uploads/new/article/pic/201709/fc1b0ae551ec7bb3c781a9402d0c0933.jpg" data-rawwidth="851" data-rawheight="535" width="851" data-original="https://pic2.zhimg.com/v2-e93699a4b575c2048a3f253260373a45_r.jpg" _src="https://static.leiphone.com/uploads/new/article/pic/201709/fc1b0ae551ec7bb3c781a9402d0c0933.jpg"/>

上面的簡化版本,我們又可以看做,把一整個輸入做 1*1 卷積,然後切成三段,分別 3*3 卷積後相連,如下圖,這兩個形式是等價的,即 Inception 的簡化版本又可以用如下形式表達:

<img src="https://static.leiphone.com/uploads/new/article/pic/201709/c390cddb8d2bdea711f2ea2672849151.jpg" data-rawwidth="894" data-rawheight="501" width="894" data-original="https://pic3.zhimg.com/v2-522db5f1d17226e6179169e27b5feb42_r.jpg" _src="https://static.leiphone.com/uploads/new/article/pic/201709/c390cddb8d2bdea711f2ea2672849151.jpg"/>

OK,現在我們想,如果不是分成三段,而是分成 5 段或者更多,那模型的表達能力是不是更強呢?於是我們就切更多段,切到不能再切了,正好是 Output channels 的數量(極限版本):

<img src="https://static.leiphone.com/uploads/new/article/pic/201709/c2205f75ef021bf53dcf3e8680feb608.jpg" data-rawwidth="897" data-rawheight="491" width="897" data-original="https://pic4.zhimg.com/v2-c71010f8756639fc13b4287f02efbca3_r.jpg" _src="https://static.leiphone.com/uploads/new/article/pic/201709/c2205f75ef021bf53dcf3e8680feb608.jpg"/>

於是,就有了深度卷積(depthwise convolution),深度卷積是對輸入的每一個 channel 獨立的用對應 channel 的所有卷積核去卷積,假設卷積核的 shape 是 [filter_height, filter_width, in_channels, channel_multiplier],那麼每個 in_channel 會輸出 channel_multiplier 那麼多個通道,最後的 feature map 就會有 in_channels * channel_multiplier 個通道了。反觀普通的卷積,輸出的 feature map 一般就只有 channel_multiplier 那麼多個通道。

具體的過程可參見我的 demo:

【Tensorflow】tf.nn.depthwise_conv2d 如何實現深度卷積? - CSDN 博客

既然叫深度可分離卷積,光做 depthwise convolution 肯定是不夠的,原文在深度卷積後面又加了 pointwise convolution,這個 pointwise convolution 就是 1*1 的卷積,可以看做是對那麼多分離的通道做了個融合。

這兩個過程合起來,就稱為 Depthwise Separable Convolution 了:

【Tensorflow】tf.nn.separable_conv2d 如何實現深度可分卷積? - CSDN 博客

代表模型:Xception(Xception: Deep Learning with Depthwise Separable Convolutions)

5. 可變形卷積

可形變卷積的思想很巧妙:它認為規則形狀的卷積核(比如一般用的正方形 3*3 卷積)可能會限制特徵的提取,如果賦予卷積核形變的特性,讓網絡根據 label 反傳下來的誤差自動的調整卷積核的形狀,適應網絡重點關注的感興趣的區域,就可以提取更好的特徵。

如下圖:網絡會根據原位置(a),學習一個 offset 偏移量,得到新的卷積核(b)(c)(d),那麼一些特殊情況就會成為這個更泛化的模型的特例,例如圖(c)表示從不同尺度物體的識別,圖(d)表示旋轉物體的識別。

<img src="https://static.leiphone.com/uploads/new/article/pic/201709/64a862da2b7ce0ad0aa2add71e7a4499.jpg" data-rawwidth="1150" data-rawheight="383" width="1150" data-original="https://pic4.zhimg.com/v2-f267a0fa74c414dfc6ecf9e3124e0f4b_r.jpg" _src="https://static.leiphone.com/uploads/new/article/pic/201709/64a862da2b7ce0ad0aa2add71e7a4499.jpg"/>

這個 idea 的實現方法也很常規:

<img src="https://static.leiphone.com/uploads/new/article/pic/201709/802046efb1c5df9f0c02312151168e9a.jpg" data-rawwidth="968" data-rawheight="613" width="968" data-original="https://pic2.zhimg.com/v2-9eea6a49745ade45a6fd0cd9abaa1a4d_r.jpg" _src="https://static.leiphone.com/uploads/new/article/pic/201709/802046efb1c5df9f0c02312151168e9a.jpg"/>

上圖中包含兩處卷積,第一處是獲取 offsets 的卷積,即我們對 input feature map 做卷積,得到一個輸出(offset field),然後再在這個輸出上取對應位置的一組值作為 offsets。假設 input feature map 的 shape 為 [batch,height,width,channels],我們指定輸出通道變成兩倍,卷積得到的 offset field 就是 [batch,height,width,2×channels],為什麼指定通道變成兩倍呢?因為我們需要在這個 offset field 裡面取一組卷積核的 offsets,而一個 offset 肯定不能一個值就表示的,最少也要用兩個值(x 方向上的偏移和 y 方向上的偏移)所以,如果我們的卷積核是 3*3,那意味著我們需要 3*3 個 offsets,一共需要 2*3*3 個值,取完了這些值,就可以順利使卷積核形變了。第二處就是使用變形的卷積核來卷積,這個比較常規。(這裡還有一個用雙線性插值的方法獲取某一卷積形變後位置的輸入的過程)

這裡有一個介紹性的 Slide:http://prlab.tudelft.nl/sites/default/files/Deformable_CNN.pdf

代表模型:Deformable Convolutional Networks(Deformable Convolutional Networks):暫時還沒有其他模型使用這種卷積,期待後續會有更多的工作把這個 idea 和其他視覺任務比如檢測,跟蹤相結合。

6. 特徵重標定卷積

這是 ImageNet 2017 競賽 Image Classification 任務的冠軍模型 SENet 的核心模塊,原文叫做」Squeeze-and-Excitation「,我結合我的理解暫且把這個卷積稱作」 特徵重標定卷積 「。

和前面不同的是,這個卷積是對特徵維度作改進的。一個卷積層中往往有數以千計的卷積核,而且我們知道卷積核對應了特徵,於是乎那麼多特徵要怎麼區分?這個方法就是通過學習的方式來自動獲取到每個特徵通道的重要程度,然後依照計算出來的重要程度去提升有用的特徵並抑制對當前任務用處不大的特徵。

<img src="https://static.leiphone.com/uploads/new/article/pic/201709/78ea8ff79cde2195a2df19bfeed756a6.jpg" data-rawwidth="1262" data-rawheight="392" width="1262" data-original="https://pic3.zhimg.com/v2-4b785d7a5c77f68043740bdc088bb80e_r.jpg" _src="https://static.leiphone.com/uploads/new/article/pic/201709/78ea8ff79cde2195a2df19bfeed756a6.jpg"/>

這個想法的實現異常的簡單,簡單到你難以置信。

首先做普通的卷積,得到了一個的 output feature map,它的 shape 為 [C,H,W],根據 paper 的觀點,這個 feature map 的特徵很混亂。然後為了獲得重要性的評價指標,直接對這個 feature map 做一個 Global Average Pooling,然後我們就得到了長度為 C 的向量。(這裡還涉及到一個額外的東西,如果你了解卷積,你就會發現一旦某一特徵經常被激活,那麼 Global Average Pooling 計算出來的值會比較大,說明它對結果的影響也比較大,反之越小的值,對結果的影響就越小)

然後我們對這個向量加兩個 FC 層,做非線性映射,這倆 FC 層的參數,也就是網絡需要額外學習的參數。

最後輸出的向量,我們可以看做特徵的重要性程度,然後與 feature map 對應 channel 相乘就得到特徵有序的 feature map 了。

雖然各大框架現在都還沒有擴展這個卷積的 api,但是我們實現它也就幾行代碼的事,可謂是簡單且實用了。

另外它還可以和幾個主流網絡結構結合起來一起用,比如 Inception 和 Res:

<img src="https://static.leiphone.com/uploads/new/article/pic/201709/e72feb3bad62faac2de6b3984aed9bd0.jpg" data-rawwidth="520" data-rawheight="495" width="520" data-original="https://pic4.zhimg.com/v2-32e1266a8f7f952d9fc4602dadf291ab_r.jpg" _src="https://static.leiphone.com/uploads/new/article/pic/201709/e72feb3bad62faac2de6b3984aed9bd0.jpg"/>

<img src="https://static.leiphone.com/uploads/new/article/pic/201709/f300ec1e1f75404f123d2d0d015a5624.jpg" data-rawwidth="558" data-rawheight="469" width="558" data-original="https://pic4.zhimg.com/v2-58797fac3389570c8655d4b73351d30f_r.jpg" _src="https://static.leiphone.com/uploads/new/article/pic/201709/f300ec1e1f75404f123d2d0d015a5624.jpg"/>

代表模型:Squeeze-and-Excitation Networks(Squeeze-and-Excitation Networks)

7. 比較

我們把圖像(height,width)作為空間維度,把 channels 做為特徵維度。

<img src="https://static.leiphone.com/uploads/new/article/pic/201709/46c2d76556606733ded2903f1b40b8f8.jpg" data-rawwidth="1004" data-rawheight="768" width="1004" data-original="https://pic3.zhimg.com/v2-710904e96b88df6f81a1b13aeef942a6_r.jpg" _src="https://static.leiphone.com/uploads/new/article/pic/201709/46c2d76556606733ded2903f1b40b8f8.jpg"/>

返回搜狐,查看更多

責任編輯:

相關焦點

  • 一位中國博士把整個CNN都給可視化了,可交互有細節,每次卷積ReLU...
    而且,這個網頁工具還可以實現交互,只要點擊其中任何一個格子——就是CNN中的「神經元」,就能顯示它的輸入是哪些、經過了怎樣細微的變化。甚至,連每一次卷積運算都能看得清。看清卷積這個CNN解釋器的使用方式也非常簡單:滑鼠戳戳戳就好了。
  • 自注意力可以替代CNN,能表達任何卷積濾波層
    多頭自注意力層如何表達卷積層?眾所周知,Transformer的興起,對NLP的發展起到了很大的作用。它與以往的方法,如RNN和CNN的主要區別在於,Tranformer可以同時處理輸入序列中的每個單詞。其中的關鍵,就是注意力機制。尤其是在自注意力情況下,可以無視單詞間的距離,直接計算依賴關係,從而學習一個句子中的內部結構。
  • 乾貨貼|CNN中常用的四種卷積
    卷積是深度學習中最重要的概念之一。深度學習超越了其他機器學習手段的核心就在於卷積和卷積神經網絡。這就很有必要了解常見的卷積: 一般卷積、 擴張卷積、轉置卷積、可分離卷積。
  • 在多目標識別方面,maskr-cnn已經取得了一些進展
    maskr-cnn是業界首款實用的全卷積神經網絡模型,為計算機視覺中的多目標識別與自動對焦,開創性的成為計算機視覺發展的新方向。無論是基於計算機視覺的自動對焦系統、模式識別系統,還是圖像識別,maskr-cnn都是有標誌性意義的。它強調平滑準確的計算輸入、檢測框和定位點,訓練過程與特徵提取過程採用多級感受野融合技術進行自動優化提高目標解析度及精度,以及做出精度更高的語義推理判斷。
  • 人工智慧之卷積神經網絡(CNN)
    而在卷積神經網絡CNN中(下面右圖),卷積層的神經元只與前一層的部分神經元節點相連,即它的神經元間的連接是非全連接的,且同一層中某些神經元之間的連接的權重w和偏移b是共享的,這樣大量地減少了需要訓練參數的數量。
  • 卷積核半徑都是奇數是什麼原因?這裡有答案
    點擊上方「AITop100」,選擇「星標」公眾號重磅乾貨,第一時間送達學過cnn
  • 小白學CNN以及Keras的速成
    各種各樣的方式都有不同的人去嘗試,攻略也是一大推,這使得不少的小白直接倒在了選擇材料的路上,一直在補先修知識,待到熱情結束就放棄了學習,連卷積網絡都不知道是什麼,大大地打擊了大家的學習熱情。今天,sherlock在這裡給大家推薦一個學習材料,保證你能夠快速入門cnn,出去裝逼也能夠和別人聊幾句。這個材料是什麼呢,就是大名鼎鼎的standford的cs231n這門課程。
  • CNN中的maxpool到底是什麼原理?
    這意味著卷積後的 Feature Map 中有對於識別物體不必要的冗餘信息。 那麼我們就反過來思考,這些 「冗餘」 信息是如何產生的。 直覺上,我們為了探測到某個特定形狀的存在,用一個 filter 對整個圖片進行逐步掃描。但只有出現了該特定形狀的區域所卷積獲得的輸出才是真正有用的,用該 filter 卷積其他區域得出的數值就可能對該形狀是否存在的判定影響較小。
  • 要想了解卷積神經網絡,首先需要了解三種基本架構
    卷積網絡是研究關於圖像(紋理,圖像尺度等)的抽象層面的一種網絡,跟傳統網絡不同的是,它不僅可以根據一個固定尺寸圖像生成物體識別數據,還可以對圖像其他部分進行其他操作。卷積可以有多個,它的作用是「放大」和「增強」圖像的抽象空間。那麼卷積可以用於哪些場景呢?
  • 華人博士卷積網絡可視化項目火了:點滑鼠就能看懂的掃盲神器
    當一個深度神經網絡以卷積層為主體時,我們也稱之為卷積神經網絡。神經網絡中的卷積層就是用卷積運算對原始圖像或者上一層的特徵進行變換的層……說得很有道理,但如果將一張圖片作為輸入,這張圖片究竟會在卷積神經網絡中經歷什麼?這可真是太考驗想像力了。
  • 即插即用新卷積:提升CNN性能、速度翻倍
    近期,來自 Facebook AI、新加坡國立大學、奇虎 360 的研究人員聯合提出了一種新的卷積操作 (OctConv),用於替代現有的通用卷積。這款新卷積不僅佔用更少的內存和計算,還有助於提高性能。卷積神經網絡(CNN)在很多計算機視覺任務中都取得了卓越的成就,然而高準確率的背後,卻是很高的冗餘度和不可忽視的計算開銷。圖 1.
  • 看了這篇文章,了解深度卷積神經網絡在目標檢測中的進展
    這兩個網絡的前幾層都要計算卷積,如果讓它們在這幾層共享參數,只是在末尾的幾層分別實現各自的特定的目標任務,那麼對一幅圖像只需用這幾個共享的卷積層進行一次前向卷積計算,就能同時得到候選區域和各候選區域的類別及邊框。
  • PyTorch可視化理解卷積神經網絡
    然而,這仍然存在一個問題:數據是如何在人工神經網絡傳送以及計算機是如何從中學習的。為了從頭開始獲得清晰的視角,本文將通過對每一層進行可視化以深入理解卷積神經網絡。之後,計算機識別圖像中物體的曲線和輪廓。。
  • 入門| CNN也能用於NLP任務,一文簡述文本分類任務的7個模型
    本文數據都是用這種方式分割的。所以接下來其實是要處理這個大而稀疏的向量。 一般而言,線性模型可以很好地處理大而稀疏的數據。此外,與其他模型相比,線性模型的訓練速度也更快。 從過去的經驗可知,logistic 回歸可以在稀疏的 tf-idf 矩陣上良好地運作。
  • 經典目標檢測方法Faster R-CNN和Mask R-CNN|基於PaddlePaddle深度...
    從圖 1 中可以看出,目標檢測主要是檢測一張圖片中有哪些目標,並且使用方框表示出來,方框中包含的信息有目標所屬類別。圖 2 與圖 1 的最大區別在於,圖 2 除了把每一個物體的方框標註出來,並且把每個方框中像素所屬的類別也標記了出來。
  • 「PointCNN全面刷新測試記錄」山東大學提出通用點雲卷積框架
    背景:認識點雲,CNN點雲(PointCloud)點雲是一組點的集合,常用來表示自身維度比背景空間緯度低的數據(比如空間中的曲面等)。由於數據較為稀疏,直接採用密集體素的方式,不僅數據量大,而且數據中包含過多的冗餘信息,不利於數據特徵的提取。不僅如此,大量的3D傳感器也採用點雲的方式保存數據,數據來源非常廣泛。
  • 理解卷積神經網絡中的輸入與輸出形狀(Keras實現)
    即使我們從理論上理解了卷積神經網絡,在實際進行將數據擬合到網絡時,很多人仍然對其網絡的輸入和輸出形狀(shape)感到困惑。本文章將幫助你理解卷積神經網絡的輸入和輸出形狀。讓我們看看一個例子。CNN的輸入數據如下圖所示。
  • Transformer在CV領域有可能替代CNN嗎?|卷積|神經網絡|算子|上下文...
    然而, 一方面需要依賴專家手動設計特徵的方式所需要的先驗知識多,模型的的性能也極其依賴於其所設計出來的數據表示 ,這樣一來不僅費時費力,而且也很難針對實際場景中複雜多變的任務去設計出一種合適的算子,不具備泛化性。  另一方面,受制於數據採集的環境,設備等影響,比如光照,拍攝視角,遮擋,陰影,背景等等,這些因素會嚴重製約模型的性能,即手工設計的特徵並不具備魯棒性。
  • PyTorch中的傅立葉卷積:通過FFT計算大核卷積的數學原理和代碼
    卷積卷積在數據分析中無處不在。 幾十年來,它們已用於信號和圖像處理。 最近,它們已成為現代神經網絡的重要組成部分。在數學上,卷積表示為:儘管離散卷積在計算應用程式中更為常見,但由於本文使用連續變量證明卷積定理(如下所述)要容易得多,因此在本文的大部分內容中,我將使用連續形式。 之後,我們將返回離散情況,並使用傅立葉變換在PyTorch中實現它。 離散卷積可以看作是連續卷積的近似值,其中連續函數在規則網格上離散化。