博客專(zhuān)欄

EEPW首頁(yè) > 博客 > 綜述:輕量級(jí)CNN架構(gòu)設(shè)計(jì)(2)

綜述:輕量級(jí)CNN架構(gòu)設(shè)計(jì)(2)

發(fā)布人:計(jì)算機(jī)視覺(jué)工坊 時(shí)間:2021-09-14 來(lái)源:工程師 發(fā)布文章

· 空洞卷積 (Dilated Convolution)

空洞卷積是針對(duì)圖像語(yǔ)義分割問(wèn)題中下采樣會(huì)降低圖像分辨率、丟失信息而提出的一種卷積思路。通過(guò)間隔取值擴(kuò)大感受野,讓原本3x3的卷積核,在相同參數(shù)量和計(jì)算量下?lián)碛懈蟮母惺芤?。這里面有個(gè)擴(kuò)張率(dilation rate)的系數(shù),這個(gè)系數(shù)定義了這個(gè)間隔的大小,標(biāo)準(zhǔn)卷積相當(dāng)于dilation rate為1的空洞卷積,下圖展示的是dilation rate為2的空洞卷積計(jì)算過(guò)程,可以看出3×3的卷積核可以感知標(biāo)準(zhǔn)的5×5卷積核的范圍,還有一種理解思路就是先對(duì)3×3的卷積核間隔補(bǔ)0,使它變成5×5的卷積,然后再執(zhí)行標(biāo)準(zhǔn)卷積的操作。

7.jpg

空洞卷積

· 轉(zhuǎn)置卷積 (Transposed Convolutions)

轉(zhuǎn)置卷積又稱反卷積(Deconvolution),它和空洞卷積的思路正好相反,是為上采樣而生,也應(yīng)用于語(yǔ)義分割當(dāng)中,而且他的計(jì)算也和空洞卷積正好相反,先對(duì)輸入的feature map間隔補(bǔ)0,卷積核不變,然后使用標(biāo)準(zhǔn)的卷積進(jìn)行計(jì)算,得到更大尺寸的feature map。

8.jpg

· 可變形卷積 (deformable convolution)

以上的卷積計(jì)算都是固定的,每次輸入不同的圖像數(shù)據(jù),卷積計(jì)算的位置都是完全固定不變,即使是空洞卷積/轉(zhuǎn)置卷積,0填充的位置也都是事先確定的。而可變性卷積是指卷積核上對(duì)每一個(gè)元素額外增加了一個(gè)h和w方向上偏移的參數(shù),然后根據(jù)這個(gè)偏移在feature map上動(dòng)態(tài)取點(diǎn)來(lái)進(jìn)行卷積計(jì)算,這樣卷積核就能在訓(xùn)練過(guò)程中擴(kuò)展到很大的范圍。而顯而易見(jiàn)的是可變性卷積雖然比其他卷積方式更加靈活,可以根據(jù)每張輸入圖片感知不同位置的信息,類(lèi)似于注意力,從而達(dá)到更好的效果,但是它比可行變卷積在增加了很多計(jì)算量和實(shí)現(xiàn)難度,目前感覺(jué)只在GPU上優(yōu)化的很好,在其他平臺(tái)上還沒(méi)有見(jiàn)到部署。

9.jpg

其他算子

· 池化(pooling)

池化這個(gè)操作比較簡(jiǎn)單,一般在上采樣和下采樣的時(shí)候用到,沒(méi)有參數(shù),不可學(xué)習(xí),但操作極為簡(jiǎn)單,和depthwise卷積類(lèi)似,只是把乘累加操作替換成取最大/取平均操作。

· 最大池化和平均池化

10.jpg

最大池化和平均池化

· 全局平均池化

全局平均池化的操作是對(duì)一個(gè)維度為(C,H,W)的feature map,在HW方向整個(gè)取平均,然后輸出一個(gè)長(zhǎng)度為C的向量,這個(gè)操作一般在分類(lèi)模型的最后一個(gè)feature map之后出現(xiàn),然后接一個(gè)全連接層就可以完成分類(lèi)結(jié)果的輸出了。早期的分類(lèi)模型都是把最后一個(gè)feature map直接拉平成C×H×W的向量,然后再接全連接層,但是顯然可以看出來(lái)這個(gè)計(jì)算量極大,甚至有的模型最后一個(gè)全連接層占了整個(gè)模型計(jì)算量的50%以上,之后由研究人員發(fā)現(xiàn)對(duì)這個(gè)feature map做一個(gè)全局平均池化,然后再加全連接層可以達(dá)到相似的效果,且計(jì)算量降低到了原來(lái)的1/HW。

· 最大向上池化

這個(gè)操作在前面基本概念一節(jié)上采樣段落中有描述,故不贅述。

· 全連接計(jì)算(Full Connected)

這個(gè)本質(zhì)其實(shí)就是矩陣乘法,輸入一個(gè)(B, iC)的數(shù)據(jù),權(quán)重為(iC, oC),那么輸出為(B, oC),在多層感知機(jī)和分類(lèi)模型最后一層常常見(jiàn)到。

11.jpg

全連接結(jié)構(gòu)

· Addition / Concatenate分支

Addition和Concatenate分支操作統(tǒng)稱為shortcut,如下圖所示,操作極為簡(jiǎn)單。Addition是在ResNet中提出,兩個(gè)相同維度的feature map相同位置點(diǎn)的值直接相加,得到新的相同維度f(wàn)eature map,這個(gè)操作可以融合之前的特征,增加信息的表達(dá),Concatenate操作是在Inception中首次使用,被DenseNet發(fā)揚(yáng)光大,和addition不同的是,它只要求兩個(gè)feature map的HW相同,通道數(shù)可以不同,然后兩個(gè)feature map在通道上直接拼接,得到一個(gè)更大的feature map,它保留了一些原始的特征,增加了特征的數(shù)量,使得有效的信息流繼續(xù)向后傳遞。

12.png

Add & Concat

· Channel shuffle

channel shuffle是ShuffleNet中首次提出,主要是針對(duì)分組卷積中不同組之間信息不流通,對(duì)不同組的feature map進(jìn)行混洗的一個(gè)操作,如下圖所示,假設(shè)原始的feature map維度為(1,9,H,W),被分成了3個(gè)組,每個(gè)組有三個(gè)通道,那么首先將這個(gè)feature map進(jìn)行reshape操作,得到(1,3,3,H,W),然后對(duì)中間的兩個(gè)大小為3的維度進(jìn)行轉(zhuǎn)置,依然是(1,3,3,H,W),最后將通道拉平,變回(1,9,H,W),就完成了通道混洗,使得不同組的feature map間隔保存,增強(qiáng)了信息的交互。

13.png

channel shuffle

常用激活函數(shù)

激活函數(shù)的非線性是神經(jīng)網(wǎng)絡(luò)發(fā)揮作用最重要的因素之一,而對(duì)于實(shí)際部署,激活函數(shù)的實(shí)現(xiàn)也是很重要的一個(gè)方面,實(shí)現(xiàn)的不好對(duì)加速效果影響很大,這里主要講幾個(gè)部署當(dāng)中常見(jiàn)的激活函數(shù)。

· ReLU系列

這里主要指常用的ReLU,ReLU6和leaky ReLU。ReLU比較好部署,小于0的部分為0,大于0的部分為原始值,只需要判斷一下符號(hào)位就行;ReLU6與ReLU相比也只是在正向部分多了個(gè)閾值,大于6的值等于6,在實(shí)現(xiàn)時(shí)多了個(gè)比較也不算麻煩;而leaky ReLU和ReLU正向部分一樣,都是大于0等于原始值,但負(fù)向部分卻是等于原始值的1/10,浮點(diǎn)運(yùn)算的話乘個(gè)0.1就好了,如果因?yàn)榱炕獙?shí)現(xiàn)整數(shù)運(yùn)算,這塊可以做個(gè)近似,如0.1用13>>7來(lái)代替,具體實(shí)現(xiàn)方法多種多樣 ,還算簡(jiǎn)單。

14.png

ReLU & LeakyReLU

· Sigmoid系列

這里主要指sigmoid,還有和他相關(guān)的swish:

image.png

可以看出,如果按照公式來(lái)實(shí)現(xiàn)sigmoid對(duì)低性能的硬件來(lái)說(shuō)非常不友好,因?yàn)樯婕暗酱罅康膃xp指數(shù)運(yùn)算和除法運(yùn)算,于是有研究人員針對(duì)此專(zhuān)門(mén)設(shè)計(jì)了近似的硬件友好的函數(shù)h-sigmoid和h-swish函數(shù),這里的h指的就是hardware的意思:

image.png

可視化的對(duì)比如下圖所示,可以看出在保證精度的同時(shí)又能大大方便硬件的實(shí)現(xiàn),當(dāng)然要直接實(shí)現(xiàn)sigmoid也是可以的,畢竟sigmoid是有限輸出,當(dāng)輸入小于-8或大于8的時(shí)候,輸出基本上接近于-1和1,可以根據(jù)這個(gè)特點(diǎn)設(shè)計(jì)一個(gè)查找表,速度也超快,且我們實(shí)測(cè)對(duì)精度沒(méi)啥影響。

15.png經(jīng)典輕量化模型

早期比較經(jīng)典的卷積神經(jīng)網(wǎng)絡(luò),如AlexNet,VGG,GoogleNet(或Inception),ResNet,DenseNet都是以提升模型在ImageNet數(shù)據(jù)集上的分類(lèi)精度為主了,很少考慮參數(shù)量和計(jì)算量的問(wèn)題,他們的主要結(jié)構(gòu)解析起來(lái)也比較簡(jiǎn)單,基本都是由標(biāo)準(zhǔn)卷積(7×7,5×5,3×3和1×1),Pooling和shortcut操作(Addition / Concatenate)構(gòu)成,而且以3×3及其以上的卷積核為主,通道數(shù)也是動(dòng)輒上千,所以參數(shù)量和計(jì)算量巨大。后續(xù)研究人員慢慢發(fā)現(xiàn)兩個(gè)3×3卷積可以代替一個(gè)5×5卷積的效果,三個(gè)3×3卷積可以代替一個(gè)7×7卷積的效果,大量使用1×1卷積,使用3×3 depthwise conv + pointwise conv(1×1標(biāo)準(zhǔn)卷積)可以代替3×3普通卷積......一系列操作可以減少參數(shù)量和計(jì)算量,所以下面講述一下一些輕量級(jí)神經(jīng)網(wǎng)絡(luò)發(fā)展的歷史,因?yàn)檫@塊很多人都講過(guò),所以我會(huì)簡(jiǎn)單一些,挑重點(diǎn)說(shuō)說(shuō)。

· SqueezeNet

SqueezeNet是公認(rèn)的輕量級(jí)模型設(shè)計(jì)最早期的工作之一,作者提出了三種策略來(lái)實(shí)現(xiàn)在保持精度的情況下大大減少當(dāng)時(shí)主流模型(以AlexNet為例)的計(jì)算量和參數(shù)量:

1.將模型中一部分的3×3卷積用1×1來(lái)代替,1×1卷積是3×3參數(shù)量和計(jì)算量的1/9,所以可以大大減少參數(shù)量和計(jì)算量;

2.減少3×3卷積的輸入通道數(shù),這個(gè)可以通過(guò)在進(jìn)入3×3卷積之前加一個(gè)1×1卷積來(lái)實(shí)現(xiàn)通道數(shù)量的減少;

3.將下采樣層的位置往后推,使得模型可以在更大的feature map上進(jìn)行更多的學(xué)習(xí),這一步雖然會(huì)在增加計(jì)算量,但是和上面兩個(gè)策略結(jié)合可以在維持模型精度的情況下仍大大減少參數(shù)量和計(jì)算量;

16.png

fire module

根據(jù)上面的策略,作者提出了fire module的子結(jié)構(gòu),如下圖所示,然后整個(gè)模型由這樣的子結(jié)構(gòu)堆疊而成。這個(gè)fire module由squeeze部分和expand部分構(gòu)成,squeeze部分是1×1的卷積層,而expand部分是1×1的卷積和3×3的卷積拼接起來(lái)的,每次feature map輸入這個(gè)fire module會(huì)在squeeze層降低通道數(shù),然后在expand通道增加通道數(shù),從而在參數(shù)量更少的情況下仍然可以得到充分的學(xué)習(xí)。最后結(jié)合一些模型壓縮的方法可以使得SqueezeNet在達(dá)到AlexNet同等精度的情況下,參數(shù)量減少到后者的1/50,計(jì)算量減少到后者的1/510。

這篇論文使用大量1×1的卷積核代替3×3卷積,并且利用1×1卷積改變大尺度卷積層輸入feature map的通道數(shù)從而減少計(jì)算量的思想是非常有意義的,后續(xù)的很多輕量級(jí)網(wǎng)路的論文都沿用了這種套路。

MobileNet系列

MobileNet系列一共有V1,V2和V3三篇論文,簡(jiǎn)要的講:

1.MobileNet V1主要思想是提出了一種新的結(jié)構(gòu)—深度可分離卷積(Depthwise Separable Convolution)來(lái)代替標(biāo)準(zhǔn)3×3卷積,從而大大減少模型的參數(shù)量和計(jì)算量;

2.MobileNet V2在V1的基礎(chǔ)上提出了一種倒置殘差的模塊,這個(gè)模塊有三個(gè)卷積,第一個(gè)部分是一個(gè)1×1標(biāo)準(zhǔn)卷積,用來(lái)升維,第二個(gè)部分是由3×3深度卷積+1×1標(biāo)準(zhǔn)卷積構(gòu)成的深度分離卷積,用來(lái)學(xué)習(xí)特征和降維,模塊的輸出和輸入再進(jìn)行一個(gè)Addition的操作,由于和ResNet中維度升降方式相反,所以稱為倒置殘差。中間升維的作用是讓深度可分離卷積得到更充分的學(xué)習(xí),計(jì)算量相對(duì)于標(biāo)準(zhǔn)卷積來(lái)說(shuō)也不大,而且這種升降維的方式非常靈活,可以大大減少計(jì)算量。本文還從流形學(xué)的角度探究了輸入深度可分離卷積上一層的ReLU6對(duì)信息傳遞的影響,理論證明去掉上一個(gè)1×1標(biāo)準(zhǔn)卷積的ReLU激活函數(shù)能更有利于后面的深度可分離卷積對(duì)特征的學(xué)習(xí)。

17.png

MobileNet V2

3. MobileNet V3感覺(jué)相對(duì)于前兩篇沒(méi)有那么大的結(jié)構(gòu)創(chuàng)新了,主要思想是神經(jīng)架構(gòu)搜索(NAS)和硬件友好結(jié)構(gòu),總的來(lái)看V3的結(jié)構(gòu)是在V2的基礎(chǔ)上進(jìn)行了一些修改,如增加了SE block這種已被提出的注意力機(jī)制,激活函數(shù)換成了H-swish,last stage減少了幾層計(jì)算,針對(duì)語(yǔ)義分割提出了Lite R-ASPP的head(不在討論之列),整個(gè)論文看著像是堆tricks,重點(diǎn)不是很突出,有點(diǎn)年底沖業(yè)績(jī)的嫌疑。

18.png

MobileNet V3

根據(jù)我自己的比賽和項(xiàng)目經(jīng)驗(yàn)來(lái)看,還是MobileNet V1和V2的結(jié)構(gòu)比較實(shí)用,參數(shù)量和計(jì)算量小,可拓展性好,SE block這種模塊對(duì)延時(shí)影響還是不小,而且我們發(fā)現(xiàn)其他各種花里胡哨的激活函數(shù)跟ReLU/ReLU6相比都差不多,對(duì)精度沒(méi)有很大的影響,還不如直接部署ReLU/ReLU6來(lái)的方便。

*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



關(guān)鍵詞: AI

相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉