博客專(zhuān)欄

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

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

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

以下文章來(lái)源于GiantPandaCV ,作者Ironboy

作者丨Ironboy

來(lái)源丨GiantPandaCV

編輯丨極市平臺(tái)

導(dǎo)讀

本文作者結(jié)合論文和項(xiàng)目比賽的經(jīng)驗(yàn),講述了輕量級(jí)CNN的發(fā)展以及設(shè)計(jì)總結(jié)。內(nèi)容包含基本概念、卷積計(jì)算類(lèi)型、其他算子、常用激活函數(shù)、經(jīng)典輕量化模型等。

卷積神經(jīng)網(wǎng)絡(luò)架構(gòu)設(shè)計(jì),又指backbone設(shè)計(jì),主要是根據(jù)具體任務(wù)的數(shù)據(jù)集特點(diǎn)以及相關(guān)的評(píng)價(jià)指標(biāo)來(lái)確定一個(gè)網(wǎng)絡(luò)結(jié)構(gòu)的輸入圖像分辨率,深度,每一層寬度,拓?fù)浣Y(jié)構(gòu)等細(xì)節(jié)。

公開(kāi)發(fā)表的論文大多都是基于ImageNet這種大型的公開(kāi)數(shù)據(jù)集來(lái)進(jìn)行的通用結(jié)構(gòu)設(shè)計(jì),早期只以其分類(lèi)精度來(lái)證明設(shè)計(jì)的優(yōu)劣,后來(lái)也慢慢開(kāi)始對(duì)比參數(shù)量(Params)和計(jì)算量(FLOPs),由于ImageNet的數(shù)據(jù)量十分巨大且豐富,所以通常在該數(shù)據(jù)集上獲得很好精度的網(wǎng)絡(luò)結(jié)構(gòu)泛化到其他任務(wù)性能也都不會(huì)差。

但在很多特定任務(wù)中,這種通用的結(jié)構(gòu)雖然效果還可以,卻并不算最好,所以一般在實(shí)際應(yīng)用時(shí)通常是基于已公開(kāi)發(fā)表的優(yōu)秀網(wǎng)絡(luò)結(jié)構(gòu)再根據(jù)任務(wù)特點(diǎn)進(jìn)行適當(dāng)修改得到自己需要的模型結(jié)構(gòu)。

目前人工智能技術(shù)應(yīng)用的一個(gè)趨勢(shì)是在端側(cè)平臺(tái)上部署高性能的神經(jīng)網(wǎng)絡(luò)模型并能在真實(shí)場(chǎng)景中實(shí)時(shí)(大于30幀)運(yùn)行,如移動(dòng)端/嵌入式端設(shè)備。這些平臺(tái)的特點(diǎn)是內(nèi)存資源少,處理器性能不高,功耗受限,這使得目前精度最高的模型由于對(duì)內(nèi)存和計(jì)算資源的超額要求使得根本無(wú)法在上面部署且達(dá)到實(shí)時(shí)性的要求。雖然可以通過(guò)知識(shí)蒸餾,通道剪枝,低比特量化等一系列手段來(lái)降低模型參數(shù)量和計(jì)算量,但仍然遠(yuǎn)遠(yuǎn)不夠,且在精度和幀率之間各種trade-off也非常繁瑣。所以直接設(shè)計(jì)輕量級(jí)的架構(gòu),然后結(jié)合剪枝量化是最有效的解決辦法。

本文將結(jié)合自己看的論文和參加項(xiàng)目比賽的經(jīng)驗(yàn)講述輕量級(jí)CNN的發(fā)展以及一些設(shè)計(jì)總結(jié),如有不對(duì)之處請(qǐng)不吝賜教。

基本概念

· 感受野(Receptive Field)

感受野指的是卷積神經(jīng)網(wǎng)絡(luò)每一層輸出的特征圖(feature map)上每個(gè)像素點(diǎn)映射回輸入圖像上的區(qū)域大小,神經(jīng)元感受野的范圍越大表示其能接觸到的原始圖像范圍就越大,也意味著它能學(xué)習(xí)更為全局,語(yǔ)義層次更高的特征信息,相反,范圍越小則表示其所包含的特征越趨向局部和細(xì)節(jié)。因此感受野的范圍可以用來(lái)大致判斷每一層的抽象層次,并且我們可以很明顯地知道網(wǎng)絡(luò)越深,神經(jīng)元的感受野越大。

1.jpg

感受野

· 分辨率(Resolution)

分辨率指的是輸入模型的圖像尺寸,即長(zhǎng)寬大小。通常情況會(huì)根據(jù)模型下采樣次數(shù)n和最后一次下采樣后feature map的分辨率k×k來(lái)決定輸入分辨率的大小,即:

r=k*2n


從輸入r×r到最后一個(gè)卷積特征feature map的k×k,整個(gè)過(guò)程是一個(gè)信息逐漸抽象化的過(guò)程,即網(wǎng)絡(luò)學(xué)習(xí)到的信息逐漸由低級(jí)的幾何信息轉(zhuǎn)變?yōu)楦呒?jí)的語(yǔ)義信息,這個(gè)feature map的大小可以是3×3,5×5,7×7,9×9等等,k太大會(huì)增加后續(xù)的計(jì)算量且信息抽象層次不夠高,影響網(wǎng)絡(luò)性能,k太小會(huì)造成非常嚴(yán)重的信息丟失,如原始分辨率映射到最后一層的feature map有效區(qū)域可能不到一個(gè)像素點(diǎn),使得訓(xùn)練無(wú)法收斂。

在ImageNet分類(lèi)任務(wù)中,通常設(shè)置的5次下采樣,并且考慮到其原始圖像大多數(shù)在300分辨率左右,所以把最后一個(gè)卷積特征大小設(shè)定為7×7,將輸入尺寸固定為224×224×3。在目標(biāo)檢測(cè)任務(wù)中,很多采用的是416×416×3的輸入尺寸,當(dāng)然由于很多目標(biāo)檢測(cè)模型是全卷積的結(jié)構(gòu),通??梢允褂枚喑叽缬?xùn)練的方式,即每次輸入只需要保證是32×的圖像尺寸大小就行,不固定具體數(shù)值。但這種多尺度訓(xùn)練的方式在圖像分類(lèi)當(dāng)中是不通用的,因?yàn)榉诸?lèi)模型最后一層是全連接結(jié)構(gòu),即矩陣乘法,需要固定輸入數(shù)據(jù)的維度。

· 深度(Depth)

神經(jīng)網(wǎng)絡(luò)的深度決定了網(wǎng)絡(luò)的表達(dá)能力,它有兩種計(jì)算方法,早期的backbone設(shè)計(jì)都是直接使用卷積層堆疊的方式,它的深度即神經(jīng)網(wǎng)絡(luò)的層數(shù),后來(lái)的backbone設(shè)計(jì)采用了更高效的module(或block)堆疊的方式,每個(gè)module是由多個(gè)卷積層組成,它的深度也可以指module的個(gè)數(shù),這種說(shuō)法在神經(jīng)架構(gòu)搜索(NAS)中出現(xiàn)的更為頻繁。通常而言網(wǎng)絡(luò)越深表達(dá)能力越強(qiáng),但深度大于某個(gè)值可能會(huì)帶來(lái)相反的效果,所以它的具體設(shè)定需要不斷調(diào)參得到。

· 寬度(Width)

寬度決定了網(wǎng)絡(luò)在某一層學(xué)到的信息量,但網(wǎng)絡(luò)的寬度時(shí)指的是卷積神經(jīng)網(wǎng)絡(luò)中最大的通道數(shù),由卷積核數(shù)量最多的層決定。通常的結(jié)構(gòu)設(shè)計(jì)中卷積核的數(shù)量隨著層數(shù)越來(lái)越多的,直到最后一層feature map達(dá)到最大,這是因?yàn)樵降缴顚樱琭eature map的分辨率越小,所包含的信息越高級(jí),所以需要更多的卷積核來(lái)進(jìn)行學(xué)習(xí)。通道越多效果越好,但帶來(lái)的計(jì)算量也會(huì)大大增加,所以具體設(shè)定也是一個(gè)調(diào)參的過(guò)程,并且各層通道數(shù)會(huì)按照8×的倍數(shù)來(lái)確定,這樣有利于GPU的并行計(jì)算。

2.png

width,depth and resolution

· 下采樣(Down-Sample)

下采樣層有兩個(gè)作用,一是減少計(jì)算量,防止過(guò)擬合,二是增大感受野,使得后面的卷積核能夠?qū)W到更加全局的信息。下采樣的設(shè)計(jì)有兩種:

1.采用stride為2的池化層,如Max-pooling或Average-pooling,目前通常使用Max-pooling,因?yàn)樗?jì)算簡(jiǎn)單且最大響應(yīng)能更好保留紋理特征;

2.采用stride為2的卷積層,下采樣的過(guò)程是一個(gè)信息損失的過(guò)程,而池化層是不可學(xué)習(xí)的,用stride為2的可學(xué)習(xí)卷積層來(lái)代替pooling可以得到更好的效果,當(dāng)然同時(shí)也增加了一定的計(jì)算量。

(突然想到為啥不使用雙線性插值,向下插值來(lái)代替Pooling,這個(gè)雖然比MaxPooling計(jì)算量更大,但是保留的信息應(yīng)該更豐富才是)

· 上采樣(Up-Sampling)

在卷積神經(jīng)網(wǎng)絡(luò)中,由于輸入圖像通過(guò)卷積神經(jīng)網(wǎng)絡(luò)(CNN)提取特征后,輸出的尺寸往往會(huì)變小,而有時(shí)我們需要將圖像恢復(fù)到原來(lái)的尺寸以便進(jìn)行進(jìn)一步的計(jì)算(如圖像的語(yǔ)義分割),這個(gè)使圖像由小分辨率映射到大分辨率的操作,叫做上采樣,它的實(shí)現(xiàn)一般有三種方式:

插值,一般使用的是雙線性插值,因?yàn)樾Ч詈?,雖然計(jì)算上比其他插值方式復(fù)雜,但是相對(duì)于卷積計(jì)算可以說(shuō)不值一提;

轉(zhuǎn)置卷積又或是說(shuō)反卷積,通過(guò)對(duì)輸入feature map間隔填充0,再進(jìn)行標(biāo)準(zhǔn)的卷積計(jì)算,可以使得輸出feature map的尺寸比輸入更大;

Max Unpooling,在對(duì)稱(chēng)的max pooling位置記錄最大值的索引位置,然后在unpooling階段時(shí)將對(duì)應(yīng)的值放置到原先最大值位置,其余位置補(bǔ)0;

3.png

Max Unpooling

· 參數(shù)量(Params)

參數(shù)量指的網(wǎng)絡(luò)中可學(xué)習(xí)變量的數(shù)量,包括卷積核的權(quán)重weight,批歸一化(BN)的縮放系數(shù)γ,偏移系數(shù)β,有些沒(méi)有BN的層可能有偏置bias,這些都是可學(xué)習(xí)的參數(shù) ,即在模型訓(xùn)練開(kāi)始前被賦予初值,在訓(xùn)練過(guò)程根據(jù)鏈?zhǔn)椒▌t中不斷迭代更新,整個(gè)模型的參數(shù)量主要由卷積核的權(quán)重weight的數(shù)量決定,參數(shù)量越大,則該結(jié)構(gòu)對(duì)運(yùn)行平臺(tái)的內(nèi)存要求越高,參數(shù)量的大小是輕量化網(wǎng)絡(luò)設(shè)計(jì)的一個(gè)重要評(píng)價(jià)指標(biāo)。

· 計(jì)算量(FLOPs)

神經(jīng)網(wǎng)絡(luò)的前向推理過(guò)程基本上都是乘累加計(jì)算,所以它的計(jì)算量也是指的前向推理過(guò)程中乘加運(yùn)算的次數(shù),通常用FLOPs來(lái)表示,即floating point operations(浮點(diǎn)運(yùn)算數(shù))。計(jì)算量越大,在同一平臺(tái)上模型運(yùn)行延時(shí)越長(zhǎng),尤其是在移動(dòng)端/嵌入式這種資源受限的平臺(tái)上想要達(dá)到實(shí)時(shí)性的要求就必須要求模型的計(jì)算量盡可能地低,但這個(gè)不是嚴(yán)格成正比關(guān)系,也跟具體算子的計(jì)算密集程度(即計(jì)算時(shí)間與IO時(shí)間占比)和該算子底層優(yōu)化的程度有關(guān)。

卷積計(jì)算類(lèi)型

· 標(biāo)準(zhǔn)卷積 (Convolution)

在神經(jīng)網(wǎng)絡(luò)架構(gòu)設(shè)計(jì)中,標(biāo)準(zhǔn)卷積是最常見(jiàn)的結(jié)構(gòu),假設(shè)其輸入feature map的維度是(1, iC, iH, iW),每個(gè)卷積核的維度是(1, iC, k, k),一次卷積濾波得到一層feature map的維度為(1,1, oH, oW),一共有oC個(gè)卷積核,則輸出feature map的維度是(1, oC, oH, oW),計(jì)算量為iC×k×k×oC×oH×oW,計(jì)算過(guò)程如下圖所示,由于太過(guò)基礎(chǔ),故不贅述。

4.png

標(biāo)準(zhǔn)卷積

· 深度卷積 (Depthwise Convolution)

深度卷積與標(biāo)準(zhǔn)卷積相比,顧名思義是在深度上做了文章,而這里的深度跟網(wǎng)絡(luò)的深度無(wú)關(guān),它指的通道,標(biāo)準(zhǔn)卷積中每個(gè)卷積核都需要與feature map的所有層進(jìn)行計(jì)算,所以每個(gè)卷積核的通道數(shù)等于輸入feature map的通道數(shù),通過(guò)設(shè)定卷積核的數(shù)量可以控制輸出feature map的通道數(shù)。而深度卷積每個(gè)卷積核都是單通道的,維度為(1,1,k,k) ,卷積核的個(gè)數(shù)為iC,即第i個(gè)卷積核與feature map第i個(gè)通道進(jìn)行二維的卷積計(jì)算,最后輸出維度為(1,iC,oH,oW),它不能改變輸出feature map的通道數(shù),所以通常會(huì)在深度卷積后面接上一個(gè)(oC,iC,1,1)的標(biāo)準(zhǔn)卷積來(lái)代替3×3或更大尺寸的標(biāo)準(zhǔn)卷積,總的計(jì)算量為k×k×iC×oH×oW+iC×1×1×oH×oW×oC,是普通卷積的1/oC+1/(k×k),大大減少了計(jì)算量和參數(shù)量,又可以達(dá)到相同的效果,這種結(jié)構(gòu)被稱(chēng)為深度可分離卷積(Depthwise Separable Convolution),在MobileNet V1被提出,后來(lái)漸漸成為輕量化結(jié)構(gòu)設(shè)計(jì)的標(biāo)配。

5.png

深度可分離卷積

深度卷積之前一直被吐槽在GPU上運(yùn)行速度還不如一般的標(biāo)準(zhǔn)卷積,因?yàn)閐epthwise 的卷積核復(fù)用率比普通卷積要小很多,計(jì)算和內(nèi)存訪問(wèn)的比值比普通卷積更小,因此會(huì)花更多時(shí)間在內(nèi)存開(kāi)銷(xiāo)上,而且per-channel的矩陣計(jì)算很小不容易并行導(dǎo)致的更慢,但理論上計(jì)算量和參數(shù)量都是大大減少的,只是底層優(yōu)化的問(wèn)題。

· 分組卷積 (Group Convolution)

分組卷積最早在AlexNet中出現(xiàn),當(dāng)時(shí)作者在訓(xùn)練模型時(shí)為了減少顯存占用而將feature map分組然后給多個(gè)GPU進(jìn)行處理,最后把多個(gè)輸出進(jìn)行融合。具體計(jì)算過(guò)程是,分組卷積首先將輸入feature map分成g個(gè)組,每個(gè)組的大小為(1, iC/g, iH, iW),對(duì)應(yīng)每組中一個(gè)卷積核的大小是(1,iC/g,k,k),每組有oC/g個(gè)卷積核,所以每組輸出feature map的尺寸為(1,oC/g,oH,oW),最終g組輸出拼接得到一個(gè)(1,oC,oH,oW)的大feature map,總的計(jì)算量為iC/g×k×k×oC×oH×oW,是標(biāo)準(zhǔn)卷積的1/g,參數(shù)量也是標(biāo)準(zhǔn)卷積的1/g。

6.png

分組卷積

但由于feature map組與組之間相互獨(dú)立,存在信息的阻隔,所以ShuffleNet提出對(duì)輸出的feature map做一次channel shuffle的操作,即通道混洗,打亂原先的順序,使得各個(gè)組之間的信息能夠交互起來(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)閉