輕量化卷積神經網絡模型總結by wilson(shffleNet,moblieNet,squeezeNet+Xception)


一、簡介
  主要參考博客:縱覽輕量化卷積神經網絡
  1, SqueezeNet:
    SqueezeNet對比AlexNet能夠減少50倍的網絡參數,但是卻擁有相近的性能。SqueezeNet主要強調用1x1的卷積核進行feature map個數的壓縮,從而達到大量減少網絡參數的目的。在構造網絡的時候,采用VGG的堆疊思想。
  2, moblieNet:
    MobileNet采用depth-wise convolution的卷積方式,能夠減少參數數量和提升運算速度(運算速度主要靠創新性的計算方式達到)。MobileNet將傳統的卷積分為兩步:Depth-wise convolution,逐通道的卷積,一個卷積負責一個通道,一個通道只被一個卷積核卷積;Pointwise convolution,將上一步得到的feature map串聯起來,使得輸出的每一個feature map包含輸入層所有feature map的信息。這種卷積方式,普遍能夠比傳統卷積方式減少8-9倍的計算量。雖然都是參數是在同一個量級上,但是運算量卻能少GoogleNet一個量級。在構造網絡的時候,采用VGG的堆疊思想。
  3, shuffleNet:
    ShuffleNet第一部分的卷積方式和MobileNet一致,第二部分的卷積不同。ShffleNet進行了channel shuffle,將各部分的feature map的channel進行有序的打亂,構成新的feature map,以解決group convolution帶來的“信息流通不暢”的問題。在構造網絡的時候,采用ResNet的殘差網絡思想,並在旁路增加均值池化,與另一路的feature map進行串聯而非相加,這樣有效降低分辨率,卻能夠彌補分辨率減少而帶來的信息損失。
  4, Xception:
    Xception也可以看成是google inception的進化版,也是對depth-wise convolution的改進。兩個改進:①原版 Depth-wise convolution,先逐通道卷積,再 1*1 卷積; 而 Xception 是反過來,先 1*1 卷積,再逐通道卷積;②原版 Depth-wise convolution 的兩個卷積之間是不帶激活函數的,而 Xception 在經過 1*1 卷積之后會帶上一個 Relu 的非線性激活函數。這樣做的好處在於提高了網絡效率。與前面3中不同,Xception沒有刻意地減少參數的數量,但是結合了depth-wise convolution能夠在同等參數的情況下,提高網絡的效果。簡單理解為,在硬件資源給定的情況下,盡可能地增加網絡效率和性能,充分利用硬件資源。
 
二、網絡的發展
  2012年——AlexNet
  2014年——VGGNet
  2014年——GoogleNet
  2015年——ResNet
  2017年——DenseNet
  2017年——seNet
  網絡的發展圍繞三個方向走:1,網絡的深度;2,保持或增加性能,減少參數量;3,改變網絡的連接方式;
  網絡主要有兩個衡量標准:1, 參數量;2,運算量
 
三、輕量化模型
  輕量化模型主要針對是第二個方向:保持性能並減少參數量。增加CNN的效率,將復雜的實驗室模型精簡到可以在移動端高校運行的移動端。通常的方法是模型壓縮(Model Compression),即在已經訓練好的模型上進行壓縮,使得網絡攜帶更少的網絡參數,從而解決內存問題,同時可以解決速度問題。但是輕量化模型從改變網絡結構出發,獨辟蹊徑地設計出更高效的網絡計算方式,從而使網絡參數減少的同時,不損失網絡的性能。

四、SqueezeNet
  《SqueezeNet:AlexNet-level accuracy with 50x fewer parameters and <0.5MB》
  發表於ICLR2017,伯克利&斯坦福
 
  4.1 思想:提出fire module,其中包含兩個部分:squeeze層和expand層。相當於是1*1卷積+googleNet+VGG
  4.2 具體方法:
    squeeze層就是1*1 卷積,其卷積核數要少於上一層 feature map 數,這個操作從 inception 系列開始就有了,並美其名曰壓縮。
    expand層分別用 1*1 和 3*3 卷積,然后 concat,這個操作在 inception 系列里面也有。
    操作如下圖所示:

  4.3 squeezeNet網絡結構:

    fire module不改變feature size,但是可以隨意控制通道的數量,通過堆疊firemodule和控制通道數量,並加上非線性激活層,最后用GAP的形式形成各神經元的輸出。(實驗室小伙伴問我為什么有的時候用gap得到最后的輸出,有時候卻用全連接層呢?我的理解是,兩者都有自己的好處,全連接層具有全體feature map的感受野,但是參數量非常大,數量級上的差別;GAP的好處在於全卷積操作,參數量少,並相對有效的給出得分,但是也是相對局部的感受野。能夠代替全連接層,有一部分的原因也是backbone的發展使得提特征的效果比較好。至於兩者怎么選擇,需要具體問題具體分析。)
  4.4 性能分析

五、MobileNet
  《MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications》
  CVPR2017,Google
  5.1 思想:用depth-wise separable convolution卷積方式代替傳統卷積方式,能夠減少網絡參數,提升運行速率。(參數數量和運行速率不一定成正比關系)
 
  5.2 具體方法:
    第一步:depth-wise convolution,depth-wise convolution 參考了group convolution,將gc中每一組卷積核負責一組feature map編程每一個卷積核負責一個feature map。
    第二步:point-wise convolution,將depth-wise convolution得到的feature map竄起來。
    相當於將傳統卷積分成兩步來做,並模擬傳統卷積的行程方式。
 

  5.3 mobileNet結構 

    一共28層,采用的是3x3的卷積,並進一步減少運算量,用stride=2的方式代替了pooling進行下采樣。
  5.4 性能分析 

    其中 DK 為標准卷積核大小,M 是輸入 feature map 通道數,DF 為輸入 feature map 大小,N 是輸出 feature map 大小。本例中,DK=3,M=2,DF=5,N=3,參數的減少量主要就與卷積核大小 DK 有關。在本文 MobileNet 的卷積核采用 DK=3,則大約減少了 8~9 倍計算量。 

    性能和googleNet\VGG16相當,參數和GoolgleNet一個量級,但是運算量大大地減少。
六、 ShuffleNet
  《ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices》
  CVPR2017, Face++
  論文鏈接: http://arxiv.org/abs/1707.01083
 
  6.1 思想
    shuffle就是channel shuffle,在進行了group convolution之后,對channel進行有序的打亂,構成新的feature map,這樣解決group convolution的「信息流通不暢」問題(例如mobileNet里面的point-wise convolution)
 
  6.2 具體實現
    shuffle = group convolution + channel shuffle
    group convolution:對feature map進行分組,並用相應大小的卷積核來進行卷積。(如AlexNet)
    channel shuffle: 以一定順序重組由各group convolution得到的feature map

  6.3 ShuffleNet
    基於resNet的bottleNeck和skip connection,形成shuffleNet 的bottleNeck單元
    shuffleNet unit:

      圖 (a):是一個帶有 depth-wise convolution 的 bottleneck unit;

      圖 (b):作者在 (a) 的基礎上進行變化,對 1*1 conv 換成 1*1 Gconv,並在第一個 1*1 Gconv 之后增加一個 channel shuffle 操作;

      圖 (c): 在旁路增加了 AVG pool,目的是為了減小 feature map 的分辨率;因為分辨率小了,於是乎最后不采用 Add,而是 concat,從而「彌補」了分辨率減小而帶來的信息損失。

      形成網絡時,用到了resNet的構成方法,而mobileNet和SqueezeNet用的是VGG的模塊堆疊思想。

  6.4性能分析

七、Xception
  《Xception: Deep Learning with Depth-wise Separable Convolutions》
  arXiv, 2016年,谷歌
  論文鏈接: http://arxiv.org/abs/1610.02357
 
  7.1 思想:
    兩個假設:1. 特征圖的跨通道相關性和跨空間的相關性可以相互解耦;2,卷積的時候將通道的卷積和空間的卷積進行分離,可以得到較好的效果(實驗證明,沒有理論,這也是最近深度學習領域的困難之處,因為影響實驗結果的因素實在太多了,很難去保證是因為該元素的影響,當然一定程度上是可以說明問題。)
  7.2 具體實現:
    基於google的inceptionV3進行改進,提出了Xception,是極限inception的含義。
    簡化的inceptionV3:

    說明:1*1卷積處理通道的鏈接,然后3*3的卷積處理空間上的卷積。后續進一步假設,將3個1*1的卷積統一成一個。后面分別接3個3*3的分別處理一部分通道 

    說明: 后續每個1*1的輸出特征圖都連一個屬於他的3*3卷積,形成極限版本的Xcpetion 

    Xception 與原版的 Depth-wise convolution 有兩個不同之處

    第一個:原版 Depth-wise convolution,先逐通道卷積,再 1*1 卷積; 而 Xception 是反過來,先 1*1 卷積,再逐通道卷積;

    第二個:原版 Depth-wise convolution 的兩個卷積之間是不帶激活函數的,而 Xception 在經過 1*1 卷積之后會帶上一個 Relu 的非線性激活函數;

  7.3 Xception具體結構

    三個版本:Entry flow; Middle flow; Exit flow
    (發現了一個簡化全連接參數的方法,和之前有個同學問的問題結合起來,1,用gap得到完全的得分,直接用來計算loss;2,用gap來聚合信息,后續用全連接再用分類,感覺這樣做兩者特點都可以比較好的保留,有點seblock的意思)
  7.4 性能分析

八、網絡輕量化總結:

  這么一看就發現,輕量化主要得益於 depth-wise convolution,因此大家可以考慮采用 depth-wise convolution 來設計自己的輕量化網絡,但是要注意「信息流通不暢問題」。
 
  解決「信息流通不暢」的問題,MobileNet 采用了 point-wise convolution,ShuffleNet 采用的是 channel shuffle。MobileNet 相較於 ShuffleNet 使用了更多的卷積,計算量和參數量上是劣勢,但是增加了非線性層數,理論上特征更抽象,更高級了;ShuffleNet 則省去 point-wise convolution,采用 channel shuffle,簡單明了,省去卷積步驟,減少了參數量。
 
九、待改進
  這些輕量化模型都是基於以前的理論符合成果來進行設計的(有些純粹沒有理論基礎,純實驗得到的定理)。如果設計出全連接層到卷積層這樣的轉變,可能才是輕量化模型最終的轉變,不過現在的CNN已經足夠強大了。


免責聲明!

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



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