綜述:輕量級CNN架構設計(1)
以下文章來(lái)源于GiantPandaCV ,作者Ironboy
作者丨Ironboy
來(lái)源丨GiantPandaCV
編輯丨極市平臺
導讀
本文作者結合論文和項目比賽的經(jīng)驗,講述了輕量級CNN的發(fā)展以及設計總結。內容包含基本概念、卷積計算類(lèi)型、其他算子、常用激活函數、經(jīng)典輕量化模型等。
卷積神經(jīng)網(wǎng)絡(luò )架構設計,又指backbone設計,主要是根據具體任務(wù)的數據集特點(diǎn)以及相關(guān)的評價(jià)指標來(lái)確定一個(gè)網(wǎng)絡(luò )結構的輸入圖像分辨率,深度,每一層寬度,拓撲結構等細節。
公開(kāi)發(fā)表的論文大多都是基于ImageNet這種大型的公開(kāi)數據集來(lái)進(jìn)行的通用結構設計,早期只以其分類(lèi)精度來(lái)證明設計的優(yōu)劣,后來(lái)也慢慢開(kāi)始對比參數量(Params)和計算量(FLOPs),由于ImageNet的數據量十分巨大且豐富,所以通常在該數據集上獲得很好精度的網(wǎng)絡(luò )結構泛化到其他任務(wù)性能也都不會(huì )差。
但在很多特定任務(wù)中,這種通用的結構雖然效果還可以,卻并不算最好,所以一般在實(shí)際應用時(shí)通常是基于已公開(kāi)發(fā)表的優(yōu)秀網(wǎng)絡(luò )結構再根據任務(wù)特點(diǎn)進(jìn)行適當修改得到自己需要的模型結構。
目前人工智能技術(shù)應用的一個(gè)趨勢是在端側平臺上部署高性能的神經(jīng)網(wǎng)絡(luò )模型并能在真實(shí)場(chǎng)景中實(shí)時(shí)(大于30幀)運行,如移動(dòng)端/嵌入式端設備。這些平臺的特點(diǎn)是內存資源少,處理器性能不高,功耗受限,這使得目前精度最高的模型由于對內存和計算資源的超額要求使得根本無(wú)法在上面部署且達到實(shí)時(shí)性的要求。雖然可以通過(guò)知識蒸餾,通道剪枝,低比特量化等一系列手段來(lái)降低模型參數量和計算量,但仍然遠遠不夠,且在精度和幀率之間各種trade-off也非常繁瑣。所以直接設計輕量級的架構,然后結合剪枝量化是最有效的解決辦法。
本文將結合自己看的論文和參加項目比賽的經(jīng)驗講述輕量級CNN的發(fā)展以及一些設計總結,如有不對之處請不吝賜教。
基本概念
· 感受野(Receptive Field)
感受野指的是卷積神經(jīng)網(wǎng)絡(luò )每一層輸出的特征圖(feature map)上每個(gè)像素點(diǎn)映射回輸入圖像上的區域大小,神經(jīng)元感受野的范圍越大表示其能接觸到的原始圖像范圍就越大,也意味著(zhù)它能學(xué)習更為全局,語(yǔ)義層次更高的特征信息,相反,范圍越小則表示其所包含的特征越趨向局部和細節。因此感受野的范圍可以用來(lái)大致判斷每一層的抽象層次,并且我們可以很明顯地知道網(wǎng)絡(luò )越深,神經(jīng)元的感受野越大。
感受野
· 分辨率(Resolution)
分辨率指的是輸入模型的圖像尺寸,即長(cháng)寬大小。通常情況會(huì )根據模型下采樣次數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é)習到的信息逐漸由低級的幾何信息轉變?yōu)楦呒壍恼Z(yǔ)義信息,這個(gè)feature map的大小可以是3×3,5×5,7×7,9×9等等,k太大會(huì )增加后續的計算量且信息抽象層次不夠高,影響網(wǎng)絡(luò )性能,k太小會(huì )造成非常嚴重的信息丟失,如原始分辨率映射到最后一層的feature map有效區域可能不到一個(gè)像素點(diǎn),使得訓練無(wú)法收斂。
在ImageNet分類(lèi)任務(wù)中,通常設置的5次下采樣,并且考慮到其原始圖像大多數在300分辨率左右,所以把最后一個(gè)卷積特征大小設定為7×7,將輸入尺寸固定為224×224×3。在目標檢測任務(wù)中,很多采用的是416×416×3的輸入尺寸,當然由于很多目標檢測模型是全卷積的結構,通??梢允褂枚喑叽缬柧毜姆绞?,即每次輸入只需要保證是32×的圖像尺寸大小就行,不固定具體數值。但這種多尺度訓練的方式在圖像分類(lèi)當中是不通用的,因為分類(lèi)模型最后一層是全連接結構,即矩陣乘法,需要固定輸入數據的維度。
· 深度(Depth)
神經(jīng)網(wǎng)絡(luò )的深度決定了網(wǎng)絡(luò )的表達能力,它有兩種計算方法,早期的backbone設計都是直接使用卷積層堆疊的方式,它的深度即神經(jīng)網(wǎng)絡(luò )的層數,后來(lái)的backbone設計采用了更高效的module(或block)堆疊的方式,每個(gè)module是由多個(gè)卷積層組成,它的深度也可以指module的個(gè)數,這種說(shuō)法在神經(jīng)架構搜索(NAS)中出現的更為頻繁。通常而言網(wǎng)絡(luò )越深表達能力越強,但深度大于某個(gè)值可能會(huì )帶來(lái)相反的效果,所以它的具體設定需要不斷調參得到。
· 寬度(Width)
寬度決定了網(wǎng)絡(luò )在某一層學(xué)到的信息量,但網(wǎng)絡(luò )的寬度時(shí)指的是卷積神經(jīng)網(wǎng)絡(luò )中最大的通道數,由卷積核數量最多的層決定。通常的結構設計中卷積核的數量隨著(zhù)層數越來(lái)越多的,直到最后一層feature map達到最大,這是因為越到深層,feature map的分辨率越小,所包含的信息越高級,所以需要更多的卷積核來(lái)進(jìn)行學(xué)習。通道越多效果越好,但帶來(lái)的計算量也會(huì )大大增加,所以具體設定也是一個(gè)調參的過(guò)程,并且各層通道數會(huì )按照8×的倍數來(lái)確定,這樣有利于GPU的并行計算。
width,depth and resolution
· 下采樣(Down-Sample)
下采樣層有兩個(gè)作用,一是減少計算量,防止過(guò)擬合,二是增大感受野,使得后面的卷積核能夠學(xué)到更加全局的信息。下采樣的設計有兩種:
1.采用stride為2的池化層,如Max-pooling或Average-pooling,目前通常使用Max-pooling,因為它計算簡(jiǎn)單且最大響應能更好保留紋理特征;
2.采用stride為2的卷積層,下采樣的過(guò)程是一個(gè)信息損失的過(guò)程,而池化層是不可學(xué)習的,用stride為2的可學(xué)習卷積層來(lái)代替pooling可以得到更好的效果,當然同時(shí)也增加了一定的計算量。
(突然想到為啥不使用雙線(xiàn)性插值,向下插值來(lái)代替Pooling,這個(gè)雖然比MaxPooling計算量更大,但是保留的信息應該更豐富才是)
· 上采樣(Up-Sampling)
在卷積神經(jīng)網(wǎng)絡(luò )中,由于輸入圖像通過(guò)卷積神經(jīng)網(wǎng)絡(luò )(CNN)提取特征后,輸出的尺寸往往會(huì )變小,而有時(shí)我們需要將圖像恢復到原來(lái)的尺寸以便進(jìn)行進(jìn)一步的計算(如圖像的語(yǔ)義分割),這個(gè)使圖像由小分辨率映射到大分辨率的操作,叫做上采樣,它的實(shí)現一般有三種方式:
插值,一般使用的是雙線(xiàn)性插值,因為效果最好,雖然計算上比其他插值方式復雜,但是相對于卷積計算可以說(shuō)不值一提;
轉置卷積又或是說(shuō)反卷積,通過(guò)對輸入feature map間隔填充0,再進(jìn)行標準的卷積計算,可以使得輸出feature map的尺寸比輸入更大;
Max Unpooling,在對稱(chēng)的max pooling位置記錄最大值的索引位置,然后在unpooling階段時(shí)將對應的值放置到原先最大值位置,其余位置補0;
Max Unpooling
· 參數量(Params)
參數量指的網(wǎng)絡(luò )中可學(xué)習變量的數量,包括卷積核的權重weight,批歸一化(BN)的縮放系數γ,偏移系數β,有些沒(méi)有BN的層可能有偏置bias,這些都是可學(xué)習的參數 ,即在模型訓練開(kāi)始前被賦予初值,在訓練過(guò)程根據鏈式法則中不斷迭代更新,整個(gè)模型的參數量主要由卷積核的權重weight的數量決定,參數量越大,則該結構對運行平臺的內存要求越高,參數量的大小是輕量化網(wǎng)絡(luò )設計的一個(gè)重要評價(jià)指標。
· 計算量(FLOPs)
神經(jīng)網(wǎng)絡(luò )的前向推理過(guò)程基本上都是乘累加計算,所以它的計算量也是指的前向推理過(guò)程中乘加運算的次數,通常用FLOPs來(lái)表示,即floating point operations(浮點(diǎn)運算數)。計算量越大,在同一平臺上模型運行延時(shí)越長(cháng),尤其是在移動(dòng)端/嵌入式這種資源受限的平臺上想要達到實(shí)時(shí)性的要求就必須要求模型的計算量盡可能地低,但這個(gè)不是嚴格成正比關(guān)系,也跟具體算子的計算密集程度(即計算時(shí)間與IO時(shí)間占比)和該算子底層優(yōu)化的程度有關(guān)。
卷積計算類(lèi)型
· 標準卷積 (Convolution)
在神經(jīng)網(wǎng)絡(luò )架構設計中,標準卷積是最常見(jiàn)的結構,假設其輸入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),計算量為iC×k×k×oC×oH×oW,計算過(guò)程如下圖所示,由于太過(guò)基礎,故不贅述。
標準卷積
· 深度卷積 (Depthwise Convolution)
深度卷積與標準卷積相比,顧名思義是在深度上做了文章,而這里的深度跟網(wǎng)絡(luò )的深度無(wú)關(guān),它指的通道,標準卷積中每個(gè)卷積核都需要與feature map的所有層進(jìn)行計算,所以每個(gè)卷積核的通道數等于輸入feature map的通道數,通過(guò)設定卷積核的數量可以控制輸出feature map的通道數。而深度卷積每個(gè)卷積核都是單通道的,維度為(1,1,k,k) ,卷積核的個(gè)數為iC,即第i個(gè)卷積核與feature map第i個(gè)通道進(jìn)行二維的卷積計算,最后輸出維度為(1,iC,oH,oW),它不能改變輸出feature map的通道數,所以通常會(huì )在深度卷積后面接上一個(gè)(oC,iC,1,1)的標準卷積來(lái)代替3×3或更大尺寸的標準卷積,總的計算量為k×k×iC×oH×oW+iC×1×1×oH×oW×oC,是普通卷積的1/oC+1/(k×k),大大減少了計算量和參數量,又可以達到相同的效果,這種結構被稱(chēng)為深度可分離卷積(Depthwise Separable Convolution),在MobileNet V1被提出,后來(lái)漸漸成為輕量化結構設計的標配。
深度可分離卷積
深度卷積之前一直被吐槽在GPU上運行速度還不如一般的標準卷積,因為depthwise 的卷積核復用率比普通卷積要小很多,計算和內存訪(fǎng)問(wèn)的比值比普通卷積更小,因此會(huì )花更多時(shí)間在內存開(kāi)銷(xiāo)上,而且per-channel的矩陣計算很小不容易并行導致的更慢,但理論上計算量和參數量都是大大減少的,只是底層優(yōu)化的問(wèn)題。
· 分組卷積 (Group Convolution)
分組卷積最早在A(yíng)lexNet中出現,當時(shí)作者在訓練模型時(shí)為了減少顯存占用而將feature map分組然后給多個(gè)GPU進(jìn)行處理,最后把多個(gè)輸出進(jìn)行融合。具體計算過(guò)程是,分組卷積首先將輸入feature map分成g個(gè)組,每個(gè)組的大小為(1, iC/g, iH, iW),對應每組中一個(gè)卷積核的大小是(1,iC/g,k,k),每組有oC/g個(gè)卷積核,所以每組輸出feature map的尺寸為(1,oC/g,oH,oW),最終g組輸出拼接得到一個(gè)(1,oC,oH,oW)的大feature map,總的計算量為iC/g×k×k×oC×oH×oW,是標準卷積的1/g,參數量也是標準卷積的1/g。
分組卷積
但由于feature map組與組之間相互獨立,存在信息的阻隔,所以ShuffleNet提出對輸出的feature map做一次channel shuffle的操作,即通道混洗,打亂原先的順序,使得各個(gè)組之間的信息能夠交互起來(lái)。
*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。