CNN 真的需要下采樣(上採樣)嗎?

轉自:極市平臺
來源:https://zhuanlan.zhihu.com/p/94477174
作者:akkaze-鄭安坤
本文來自知乎專欄,僅供學習參考使用,著作權歸作者所有。如有侵權,請私信刪除。

背景介紹

在常見的卷積神經網絡中,採樣幾乎無處不在,以前是max_pooling,現在是strided卷積。

以vgg網絡爲例,裏面使用到了相當多的max_pooling
在這裏插入圖片描述

輸入側在左面(下面是有padding的,上面是無padding的),可以看到網絡中用到了很多2x2的pooling

同樣,在做語義分割或者目標檢測的時候,我們用到了相當多的上採樣,或者轉置卷積
在這裏插入圖片描述

典型的fcn結構,注意紅色區分的decovolution

以前,我們在分類網絡的最後幾層使用fc,後來fc被證明參數量太大泛化性能不好,被global average pooling替代掉了,最早出現在network in network中,
在這裏插入圖片描述

GAP直接把每個通道對應空間特徵聚合成一個標量

從此,分類網絡的範式變爲(Relu已經被隱式帶在了onv和deconv裏面),
Input-->Conv-->DownSample_x_2-->Conv-->DownSample_x_2-->Conv-->DownSample_x_2-->GAP-->Conv1x1-->Softmax-->Output

而分割網絡的範式變爲(最近的一些文章也在考慮用upsample+conv_1x1代替deconv),
Input-->Conv-->DownSample_x_2-->Conv-->DownSample_x_2-->Conv-->DownSample_x_2-->Deconv_x_2-->Deconv_x_2-->Deconv_x_2-->Softmax-->Output

這裏暫時不考慮任何shortcut。

可是,我們不得不去想,下采樣,上採樣真的是必須的嗎?可不可能去掉呢?

空洞卷積和大卷積核的嘗試

一個很自然的想法,下采樣只是爲了減小計算量和增大感受野,如果沒有下采樣,要成倍增大感受野,只有兩個選擇,空洞卷積和大卷積核。所以,第一步,在cifar10的分類上,我嘗試去掉了下采樣,將卷積改爲空洞卷積,並且膨脹率分別遞增,模型結構如下所示,

在這裏插入圖片描述

這個網絡的卷積結構,注意最後用一個空間範圍的全局平均直接拉平爲特徵向量,最後再跟一個10維的全連接層

這是一個典型的四層的VGG結構,每層卷積的dilation_rate分別爲1,2,4,8。在訓練了80個epoch後,測試集準確率曲線如下所示 ,
在這裏插入圖片描述

四層VGG網絡,卷積的dilation_rate分別是1,2,4,8,可訓練參數量25474

最終的準確率達到了76%,相同參數的vgg結構的卷積網絡能夠達到的準確率基本就在這附近。

從另一種思路出發,爲了擴大卷積的感受野,也可以直接增加捲積的kernel_size,與上面對比,保持dilationrate爲1不變,同時逐層增大卷積的kernel_size,分別爲3,5,7,9,訓練80個epoch後得到如下準確率曲線,
在這裏插入圖片描述

四層VGG網絡,卷積的kernel_size分別是3,5,7,9,可訓練參數量爲172930

和之前改變dilation_rate的方式比較,收斂過程很一致,略微震盪一點,但是最終的結果很一致,都在76%上下,這說明影響最終精度的因素只有感受野和每層的通道數。

爲了說明下采樣在性能方面沒有提升,用有下采樣的網絡對對比。即在不修改其他任何參數的情況下,對原本使用dilation的卷積層使用下采樣,stride都設置爲2,同樣訓練80個epoch,收斂結果如下,

在這裏插入圖片描述

四層VGG網絡,每層使用stride爲2的卷積進行下采樣,可訓練參數量25474

最終收斂到了73%上下,比上面兩個實驗低了大約3個點,這說明下采樣的信息損失確實不利於CNN的學習。

把三種參數的結果放在一起對比,更能夠說明問題,
在這裏插入圖片描述

四層VGG網絡的對比結果,除了卷積層參數不同,其他參數均相同

爲了驗證這種想法的通用性,使用resnet18結構的網絡,並在原本需要下采樣的卷積層使用dilation_rate不斷增大的空洞卷積替代。訓練80個epoch後,最終得到的準確率曲線如下所示,
在這裏插入圖片描述

resnet18上的準確率曲線,網絡通過改變卷積層dilation_rate得到

在沒有其他任何調參的情況下,最後收斂到了87%的準確率。

小卷積核的嘗試

我們知道,大卷積核的感受野通常可以通過疊加多個小卷積核得到,vggnet首先發現5x5卷積可以用兩個3x3卷積代替,極大減少了參數量。
在這裏插入圖片描述

兩個3x3卷積的感受野和一個5x5卷積相同,但是參數少一半

同樣的7x7卷積可以用三個3x3卷積級聯,9x9可以用四個3x3卷積級聯。

爲了獲得和上面四層卷積網絡相同的感受野,我設計了一個十層的只有3x3卷積的網絡,每層之間依然有非線性。因爲層數多了很多,爲了確定中間層的通道數,我做了幾組實驗。同時,爲了不極大增加參數量,我又在卷積中間插入depthwise卷積,這樣保持對應感受野上的通道數不變,而參數量不至於增加很多。訓練結果,

在這裏插入圖片描述

實驗結果,後面的數字表示每層對於的通道數

可以看到,只有三個網絡結構在精度上優於之前的設計,而這三個網絡的參數量都是之前的數倍。使用depthwise卷積的網絡參數量並沒有增加太多,但是精度還是略低於之前的設計。

爲了說明問題,增加每層的通道數,比如之前16-32-48-64的設計,改爲64-128-256-512的設計,基本上對於這個深度的網絡來說,容量已經接近上界了,結果如下,
在這裏插入圖片描述

增加通道數的結果

可以看到,空洞卷積網絡依然以較小的參數領先於depthwise卷積和3x3卷積混合網絡,並以數倍更少的參數優勢,在精度上略低於3x3級聯網絡。

這個實驗表明,對於CNN而言,深度之外,感受野以及該感受野上的通道數,真正決定了網絡的性能。

這和語音中的wavenet是相似的,
在這裏插入圖片描述

通用wavenet

在這裏插入圖片描述

空洞wavenet

wavenet使用空洞因果卷積來降低計算量,原始wavenet的性能並沒有問題,但是計算量和參數量指數增長。

稀疏化方面的思考

小卷積核疊加和大卷積核的方法爲了獲得和空洞卷積相同的性能,付出了參數上的巨大代價,而空洞卷積本身是稀疏的(大多數元素都是0),這促使我們思考,是否可以用稀疏化解決參數巨大的問題。

CNN的稀疏化最近研究很多,一般的卷積稀疏化見下圖,並注意到每層卷積的卷積參數都是四維的,即輸入通道數,輸出通道數,x方向的卷積尺寸,y方向的卷積尺寸。

在這裏插入圖片描述

四種不同的稀疏卷積,因爲卷積核權重四維的,最左邊稀疏性是最不規則的,越向右規則的維度則越多,越有利於硬件加速

我們常見的其實是通道維度的稀疏化,這相當於減少通道數,也最容易加速,但是更有意義的稀疏化,我認爲是卷積核內部的稀疏化,如下圖所示,
在這裏插入圖片描述

最左側沒有稀疏化,中間有零值(也就是稀疏化),最右側有1x2的塊狀稀疏化

這種稀疏化能減少參數量(因爲零值是沒有意義的),但是因爲不利於工程實現,所以目前沒有明顯的加速效果。

近期的研究表明,CNN裏大多數卷積核都是稀疏的,大約有50%以上都是稀疏的,也就是說有50%以上參數都是冗餘的。如果能去掉冗餘參數,那麼大卷積核和多層小卷積核也能證明在感受野和特定感受野上的通道數對CNN性能的決定性影響,在不增加額外模型參數的前提下。

儘管很容易預測,但是接下來,我們還會證明這兩種方法的參數冗餘。

10層3x3級聯網絡的可訓練參數量是86404,4層空洞卷積網絡參數量是25474,4層大卷積核網絡參數量是172930。使用tensorfllow內置的稀疏化功能,其官方github地址爲model_optimization,原理即在訓練過程中,按一定的準則將卷積核的一些元素置爲零,然後finetune。對於10層3x3級聯網絡,選擇稀疏率爲25%,這樣稀疏化後的參數量爲21601,對於大卷積核網絡,選擇常數稀疏率爲15%,稀疏化的參數量爲25940,這樣稀疏化後它們的參數都比空洞卷積網絡更少。爲保證網絡不會繼續收斂了,訓練1000個epoch,稀疏化從第200個epoch開始,稀疏化後的訓練結果如下所示,

可以明顯的看到稀疏化後的3x3級聯網絡的性能是最好的,同時它的參數也是最少的,同時大卷積核的性能次之,這個時候空洞卷積的性能反而略低。

保持同樣的參數和稀疏度,在cifar100上訓練的結果如下所示,
在這裏插入圖片描述
這個時候級聯3x3網絡的性能已經遠超其他兩個網絡了(對於cifar100上的baseline取多少合適,大家可以參閱一些文章或博客)。

稀疏化極限的思考

我們上面的討論基本就是,只要能保住某個感受野,稀疏化也是可行的,但是又不禁想知道稀疏化的極限在哪裏,對於3x3的卷積核,在保住感受野的情況下,最少必須有兩個非零元素,但是這樣一來卷積核就退化了,從各向同性退化爲各向異性,
在這裏插入圖片描述

前面兩個卷積核只有一個方向性(對角線方向),最後一個有兩個方向性

學過線性代數的同學都知道,在二維線性空間至少有兩個基底向量,才能合成各種方向的梯度。如果卷積核退化成前面兩個的情況下,卷積核的二維性質也許就損失掉了,但是同一層中只要有多個卷積核具有不同的方向性,那麼這一層依然可能是各向同性的,方向性也許也是感受野的一個重要描述。關於感受野的方向性,一個來自視覺皮層實驗的啓示如下:

在這裏插入圖片描述

人類視覺皮層中不同方位調諧的感受野分佈

感受野的意義。只有大感受野才能感受到尺寸比較大的物體。感受野,深度和通道數,共同決定了cnn某一層的性能,一個衡量cnn性能的正確表述應該是網絡在某一層有多大的深度和感受野,同時有多少通道。深度決定了網絡的抽象能力或者說學習能力,感受野和通道決定了網絡學到了多少東西

maxpooling的額外討論

這促使我們思考,採樣真的是必要的嗎?當然,從工程的角度看,採樣能極大減小feature map的尺寸,從而大大降低計算量,但這個實驗表明,採樣對提高cnn的性能並沒有幫助,max pooling有抑制噪聲的作用,所以有用,但max pooling可以用不下采樣的方式實現,這和經典的中值濾波類似。
在這裏插入圖片描述

典型的中值濾波,這裏卷積核大小是20,注意到輸出尺寸沒有改變,max pooing和中值濾波類似,它們都可以用來壓制噪聲

這也說明,cnn的每一層卷積都在編碼空間相關性,淺層特徵編碼短距離相關性,更深的卷積層編碼更遠距離的空間相關性,而到了某一層,再也沒有統計意義上的空間相關性了(這取決於有意義的物體在圖像中的尺寸),到這一層就可以用GAP聚合空間特徵了。

分割網絡的設計

在之前分類網絡的基礎上,去掉最後面的global average pooling和fully connected,換成conv1x1(相信很多人都知道,fc層形式上可以轉換成conv1x1,本以爲只是工程上的trick,沒想到有本質聯繫),直接變成分割網絡,在我製作的數據集m2nist上,訓練結果如下所示,
在這裏插入圖片描述

無採樣網絡在m2nist上的訓練結果(因爲背景面積比較大,acc超過94%纔有實際意義)

使用訓練好的模型進行預測,可視化後的結果如下:
在這裏插入圖片描述

左邊是原圖,右邊是分割結果

後續討論,對網絡設計的可能影響
如果沒有了採樣層,分類網絡的範式將如下所示
Input-->Conv(dilate_rate=1)-->Conv(dilate_rate=2)-->Conv(dilate_rate=4)-->Conv(dilate_rate=8)-->GAP-->Conv1x1-->Softmax-->Output

分割網絡的範式將如下所示,
Input-->Conv(dilate_rate=1)-->Conv(dilate_rate=2)-->Conv(dilate_rate=4)-->Conv(dilate_rate=8)-->Conv(dilate_rate=16)-->Conv(dilate_rate=32)-->Softmax-->Output

不再有decoder階段,因爲到了decoder,上採樣只是爲了恢復分辨率,在無採樣的網絡結構裏,在最大感受野處,即之前加入global average pooling的地方可以直接接softmax進行pixel level的分類,這還需要更多實驗。

除此之外,在其他網絡中,在網絡的任何部分中,都可以使用沒有采樣的子網絡,比如hrnet的旁支網絡。
在這裏插入圖片描述

可以使用無採樣的網絡代替原本需要恢復分辨率的子網絡

對跨層連接的思考

如果沒有了採樣,那麼所有feature map的分辨率都是一樣的,跨層連接也不會再區分bottom-up和up-bottom,所有的跨層連接本質上都是在融合不同感受野的特徵(這裏待議,bottom-up應該是在融合分辨率,常用在輸出側,up-bottom應該是在融合來自不同感受野的特徵,常用在特徵提取側,當沒有了分辨率的變換,bottom-up就不再被需要了)。

對目標檢測的可能影響

如果沒有了分辨率的變化,那麼檢測完全可以在網絡深層的某個感受野處叉開成爲三支,分別檢測大中小物體,這個思想和tridentnet有類似之處

據我所知,我是第一個提出能夠完全用dilated convolution結合global avergage pooling來實現圖像分類或者分割的,並注意到這種方法能夠帶來性能提升。 但是請意識到dilated convolution也不是必須,一個更大kernel size的卷積就可以替換它,但這勢必會引入更多參數,可能導致過擬合,當然這可以用稀疏化的辦法解決,但是稀疏卷積目前不適合工程化,因爲效率並不高。

類似的想法最早出現在deeplab的相關論文Rethinking Atrous Convolution for Semantic Image Segmentation中,這篇文章中,空洞卷積主要是通過移除網絡最後幾層的降採樣操作以及對應的濾波器核的上採樣操作,來提取更緊湊的特徵,並且不增加新的額外學習參數。
在這裏插入圖片描述

圖片來自於論文,以串行方式設計atrous convolution 模塊,複製ResNet的最後一個block,如block4,並將複製後的blocks以串行方式級聯。

總結

雖然不利於加速,但是卷積核天生就應該是稀疏的,下采樣損失了分辨率,一定會損失精度。深度之外,只有感受野和與之對應的通道數最重要。

下圖即高斯核函數 在不同的 下的圖像
在這裏插入圖片描述

一句話說來,CNN一種利用卷積實現二維泛函空間到二維泛函空間映射的神經網絡。

以一維爲例,這就相當於把(-1,1)上的有界函數f映射到有界函數g的一個泛函:
爲什麼用卷積呢?衆所周知,卷積是最簡單的這樣一個泛函
在這裏插入圖片描述
並且它有着諸多良好的性質,最重要的是,卷積有平移不變性,
在這裏插入圖片描述

它也有縮放不變性,
在這裏插入圖片描述

它有結合率和交換率
在這裏插入圖片描述

所以對於任意一個算子φ ,cnn 的目的就是找到這樣一個 h(x)h(x),
在這裏插入圖片描述
但是直接尋找並不容易,那麼就用一系列卷積去逼近它,其中 在這裏是非線性激活函數,
在這裏插入圖片描述
那麼,cnn 的策略就很明顯了,通過擬合的方式,用一組卷積去逼近任意泛函(注意,這個時候縮放不變性被非線性激活破壞了)。
爲什麼使用小卷積核之狄拉克函數與高斯函數
我們知道狄拉克函數
在這裏插入圖片描述
它是一個廣義函數,也就是說不是普通意義上的函數,當高斯核函數的有效半徑無限趨近於 0 的時候,便得到了狄拉克函數。
它的卷積有如下性質:
在這裏插入圖片描述
這可以看成是 1x1 卷積,
它的 n 階導數有如下性質:
在這裏插入圖片描述

也就是說和它的 n 階導數做卷積便得到了自己的 n 階導數。
這個函數在應用中必定是實現不了的,但是讓我們來看看高斯函數,它的導數是什麼樣子,
在這裏插入圖片描述

高斯函數的前七階導數,包含原函數,這些函數的有效半徑驚人的一致

可以看出來這些函數的有效半徑驚人的一致。如果使用這些函數,理論上可以使用卷積近似任意微分算子,而微分算子是性質非常好的線性算子。
所以,爲什麼使用小卷積核,因爲只有高斯函數的有效半徑趨近於 0 的時候,它才能近似狄拉克函數,它的導數才能近似於狄拉克函數的導數。
(小卷積核的意義待議,這裏提供另一個思考方式,因爲圖像不是普通函數,卷積在頻率空間變成乘法,小卷積核更容易產生高頻(類比高斯核函數),所以卷積後更容意放大高頻信息,(其實,這和上面的解釋並不完全衝突)使得高頻信息不容易被非線性的激活函數抹去,而高頻信息對於圖像來說,有非常重要的作用,比如說邊緣,比如說角點)。

稍大卷積核的意義

其實高斯核還有一個性質,與被高斯核作用後(相當於高斯平均)後求 n 階導數,相當於與高斯核的 n 階導數作卷積,也就是說,
在這裏插入圖片描述
同時,高斯核還有以下性質:
在這裏插入圖片描述
所以,我們有高斯核作爲基底向量,有
在這裏插入圖片描述

這樣求相當與求解一系列線性係數 ,請自行將 對應到卷積核大小上

那麼這樣稍大卷積核的意義就是變換在高斯平均後的空間裏的微分算子,而且卷積核越大,這個平滑效應越強。

而在圖像領域,因爲計算機和信息論離散化的表現形式,我們使用採樣和量化來處理它,並以此減少計算量

請持續關注本文的源代碼 github 倉庫,鏈接:https://github.com/akkaze/cnn-without-any-downsampling


MaiweiE-com|WeChat ID:Yida_Zhang2



推薦閱讀(點擊標題可跳轉閱讀)

[1] 機器學習算法之——卷積神經網絡(CNN)原理講解

[2] 一文弄懂神經網絡中的反向傳播法——Back Propagation

[3] 卷積神經網絡中十大拍案叫絕的操作

[4] 武漢的櫻花開了!出不了門別擔心,線上帶你開櫻花![Python畫櫻花]

[5] 有了這些珍藏的實用工具/學習網站,自學更快樂!


關注公衆號邁微電子研發社,文章首發與公衆號。
在這裏插入圖片描述

△微信掃一掃關注「邁微電子研發社」公衆號

知識星球:社羣旨在分享AI算法崗的秋招/春招準備攻略(含刷題)、面經和內推機會、學習路線、知識題庫等。
在這裏插入圖片描述

△掃碼加入「邁微電子研發社」學習輔導羣

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章