輕量化模型設計


十歲的小男孩

  本文為終端移植的一個小章節。

目錄

  引言

  論文

    A. MobileNets

    B. ShuffleNet

    C. Squeezenet 

    D. Xception

    E. ResNeXt

引言

  在保證模型性能的前提下盡可能的降低模型的復雜度以及運算量。除此之外,還有很多工作將注意力放在更小、更高效、更精細的網絡模塊設計上,使用特定結構,如 ShuffleNet, MobileNet, Xception, SqueezeNet,它們基本都是由很小的卷積(1*1和3*3)組成,不僅參數運算量小,同時還具備了很好的性能效果。

A. MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

  論文地址  GitHub源碼  MobilenetV1  MobilenetV2  論文解讀

  這篇論文是Google針對手機等嵌入式設備提出的一種輕量級的深層神經網絡,取名為MobileNets。核心思想就是卷積核的巧妙分解,可以有效減少網絡參數。所謂的卷積核分解,實際上就是將a × a × c分解成一個a × a × 1的卷積和一個1 ×1 × c的卷積,,其中a是卷積核大小,c是卷積核的通道數。其中第一個a × a × 1的卷積稱為Depthwise Separable Convolutions,它對前一層輸出的feature map的每一個channel單獨進行a × a 的卷積來提取空間特征,然后再使用1 ×1 的卷積將多個通道的信息線性組合起來,稱為Pointwise Convolutions,如下圖: 

這里寫圖片描述 

  這樣可以很大程度的壓縮計算量:

這里寫圖片描述 

  其中DK為原始卷積核的大小,DF為輸入feature map的尺寸, 這樣相當於將運算量降低DK^2倍左右。 
  MobileNet中Depthwise實際上是通過卷積中的group來實現的,其實在后面也會發現,這些精細模型的設計都是和group有關。

文章在residual net和MobileNet V1的基礎上,提出MobileNet V2模型,一方面保證准確性,另一方面大幅的減少multiply-adds(MAdd)的計算量,從而減少模型的參數量,降低內存占用,又提高模型的計算速度,以適應移動端應用。

Block 基本結構
文章的主要貢獻:提出一種顛倒的、bottleneck為線性變換的resdual 結構。這中結構的一個block如下:
輸入:一個低維 k(通道)的、經壓縮的數據
然后經過:
step 1, point wise卷積擴展維度(通道),擴展因子為t;
step 2, depthwise separable 卷積,stride為 s;
step 3, linear conv把特征再映射的低維,輸出維度為 k’;
輸出作為下一個block的輸入,堆疊block。
具體結構如表:
這里寫圖片描述

1. Depthwise separable conv
這種卷積方式早已被廣泛使用,實現方法是把常規卷積層分為兩個獨立的層。第一層稱為depthwise convolution,對輸入的每個通道做單獨的卷積,第二層稱為pointwise convolution,使用1x1的卷積核做常規卷積。
如果使用的是kxk的卷積核,這種卷積幾乎能減少k2的計算量。

2. Linear bottlenecks
用線性變換層替換channel數較少的層中的ReLU,這樣做的理由是ReLU會對channel數低的張量造成較大的信息損耗。ReLU會使負值置零,channel數較低時會有相對高的概率使某一維度的張量值全為0,即張量的維度減小了,而且這一過程無法恢復。張量維度的減小即意味着特征描述容量的下降。因而,在需要使用ReLU的卷積層中,將channel數擴張到足夠大,再進行激活,被認為可以降低激活層的信息損失。文中舉了這樣的例子:
這里寫圖片描述 

上圖中,利用nxm的矩陣B將張量(2D,即m=2)變換到n維的空間中,通過ReLU后(y=ReLU(Bx)),再用此矩陣之逆恢復原來的張量。可以看到,當n較小時,恢復后的張量坍縮嚴重,n較大時則恢復較好。

3. inverted residual sturcture

原residual structure 出自Deep Residual Learning for Image Recognition. 這種結構解決了深度神經網絡隨着網絡層數的加深帶來的梯度消失/爆炸,模型不收斂的問題,使DNN可以有上百甚至更多的層,提高准確率。
從圖中可以看出,這種結構使用一個快捷鏈接(shortcut)鏈接了block的輸入與輸出(實際做的是element wise add),block內部是常規conv,一般block內部數據的維度低於block邊緣–即bottleneck的數據維度。
論文的題目,inverted residual,顛倒的正是block 內數據維度與bottleneck數據維度的大小,這從上圖的中數據塊的深度情況可以看出。
這種顛倒基於作者的直覺:bottleneck層包含了所有的必要信息,擴展的層做的僅僅是非線性變換的細節實現。
實際上,這中翻轉能節省內存,分析見后。

MobileNet V2網絡結構
網絡機構如下:
這里寫圖片描述 

上圖中,t代表單元的擴張系數,c代表channel數,n為單元重復個數,s為stride數。注意,shortcut只在s==1時才使用。

實驗
文章從classification、detection、segmentation三個應用方面測試了該模型的效果。

1. classification
直接使用MobileNetV2的結構,輸入圖像size為224x224,在Imagenet上的分類表現
這里寫圖片描述

2.detection

使用預訓練的MobileNetV2卷積層特征+SSD的檢測網絡,輸入圖像size為320x320,在mscoco上的表現如下表: 

這里寫圖片描述

3.segementation

使用預訓練的MobileNetV2卷積層特征+DeepLabv3分割網絡

這里寫圖片描述

B. ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices

  論文地址  GitHub源碼  論文解讀

作者提出,雖然MobileNet、ResNeXt等網絡能夠大大的降低模型的復雜度,並且也能保持不錯的性能,但是1 ×1卷積的計算消耗還是比較大的,比如在ResNeXt中,一個模塊中1 ×1卷積就占據了93%的運算量,而在MobileNet中更是占到了94.86%,因此作者希望在這個上面進一步降低計算量:即在1 ×1的卷積上也采用group的操作,但是本來1 ×1本來是為了整合所有通道的信息,如果使用group的操作就無法達到這個效果,因此作者就想出了一種channel shuffle的方法,如下圖:

這里寫圖片描述

如上圖b和c,雖然對1 ×1的卷積使用了group的操作,但是在中間的feature map增加了一個channel shuffle的操作,這樣每個group都可以接受到上一層不同group的feature,這樣就可以很好的解決之前提到的問題,同時還降低了模型的計算量,ShuffleNet的模塊如下:
這里寫圖片描述 

作者使用了不同的group數進行實驗,發現越小的模型,group數量越多性能越好。這是因為在模型大小一樣的情況下,group數量越多,feature map的channel數越多,對於小的模型,channel數量對於性能提升更加重要。
最后作者將shufflenet的方法和mobilenet的方法進行了比較,性能似乎更勝一籌:
這里寫圖片描述

C.  Squeezenet: Alexnet-level Accuracy with 50x Fewer Parameters and <0.5MB Model Size 

  論文地址  GitHub源碼  論文解讀

  使用以下三個策略來減少SqueezeNet設計參數 

  (1)使用1∗11∗1卷積代替3∗33∗3 卷積:參數減少為原來的1/9
  (2)減少輸入通道數量:這一部分使用squeeze layers來實現
  (3)將欠采樣操作延后,可以給卷積層提供更大的激活圖:更大的激活圖保留了更多的信息,可以提供更高的分類准確率
  其中,(1)和(2)可以顯著減少參數數量,(3)可以在參數數量受限的情況下提高准確率。

  SqueezeNet的核心在於Fire module,Fire module 由兩層構成,分別是squeeze層+expand層,如下圖所示,squeeze層是一個1*1卷積核的卷積層,expand層是1*1 和3*3卷積核的卷積層,expand層中,把1*1 和3*3 得到的feature map 進行concat,具體操作如下圖所示
這里寫圖片描述

這里寫圖片描述

D. Xception: Deep Learning with Depthwise Separable Convolutions

  論文地址  GitHub源碼  論文解讀
  極致的Inception(Extream Inception)”模塊,這就是Xception的基本模塊。事實上,調節每個3*3的卷積作用的特征圖的通道數,即調節3*3的卷積的分支的數量與1*1的卷積的輸出通道數的比例,可以實現一系列處於傳統Inception模塊和“極致的Inception”模塊之間的狀態。

  運用“極致的Inception”模塊,作者搭建了Xception網絡,它由一系列SeparableConv(即“極致的Inception”)、類似ResNet中的殘差連接形式和一些其他常規的操作組成:

CVPR 2017精彩論文解讀:對Xception(一種深度可分離卷積)模型的介紹

E. ResNeXt:Aggregated Residual Transformations for Deep Neural Networks

  論文地址  GitHub源碼  論文解讀

  作者提出,在傳統的ResNet的基礎上,以往的方法只往兩個方向進行研究,一個深度,一個寬度,但是深度加深,模型訓練難度更大,寬度加寬,模型復雜度更高,計算量更大,都在不同的程度上增加了資源的損耗,因此作者從一個新的維度:Cardinality(本文中應該為path的數量)來對模型進行考量,作者在ResNet的基礎上提出了一種新的結構,ResNeXt:
這里寫圖片描述 

  上圖中兩種結構計算量相近,但是右邊結構的性能更勝一籌(Cardinality更大)。 

這里寫圖片描述

  以上三種結構等價,因此可以通過group的形式來實現ResNeXt。其實ResNeXt和mobilenet等結構性質很相近,都是通過group的操作,在維度相同時降低復雜度,或者在復雜度相同時增加維度,然后再通過1*1的卷積將所有通道的信息再融合起來。因此全文看下來,作者的核心創新點就在於提出了 aggregrated transformations,用一種平行堆疊相同拓撲結構的blocks代替原來 ResNet 的三層卷積的block,在不明顯增加參數量級的情況下提升了模型的准確率,同時由於拓撲結構相同,超參數也減少了,便於模型移植。

知識應該是開源的,歡迎斧正。929994365@qq.com


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM