精簡CNN模型系列之二:SqueezeNet

weixin_33724059發表於2018-09-02

介紹

SqueezeNet同這個系列要介紹的其它任一CNN模型一樣不只關心模型分類精度,同樣也重視其計算速度與模型體積大小。

作者列舉了三項小的CNN模型的優點:

  • 可以進行更高效率的分散式訓練:在分散式訓練中,模型可訓練引數變小,意味著用於網路通訊的時間減少,這樣整個分散式訓練系統就能擁有更高的擴充套件效率;
  • 可更高效地將新訓練模型部署至端側裝置:當下很多AI驅動的APP或Service都需要不斷將新訓練得到的模型快速自雲端部署至使用者的客戶端,小的CNN模型意味著更少的網路傳播需求,進而更有利於新訓練模型的頻繁部署;
  • 有效的FPGA或其它嵌入裝置上的模型部署:因FPGA或其它移動等嵌入裝置往往只有很少的片上記憶體可用(沒有或有速度相對很慢的片外記憶體),因此它們也渴望高準確率同時佔記憶體不多的小CNN模型。

然後在本論文中,作者提出了一種新的Fire module,用於構建整個SqueezeNet網路,最終其能在Imagenet上達到與Alexnet相似的分類準確率,但只需其不到1/50的引數。若再進一步使用當下較為成熟的一些model compression技術進行模型壓縮,可以進一步將SqueezeNet的權重大小壓縮為Alexnet模型的1/510,只有不到0.5MB。

作者還分析了CNN模型基於準確率與模型大小為優化目標所可以考慮的設計。並基於Fire module與SqueezeNet分別在微觀與巨集觀兩個層次上進行了探究。

SqueezeNet

網路架構設計策略

  • 將3x3的conv filters替換為1x1的conv filters;
  • 減少輸入至3x3 conv layer的feature maps的input channels 數目;
  • 將網路中所需的Downsample操作向後推遲。

以上三項策略中前兩個是出於減少模型引數數量考慮,而後一個則是為了提高模型最終的分類準確率。三項策略都有據可考,在此不再詳表。

Fire module

同Googlenet主要由Inception module組成或Resnet主要由Residual learning block組成一樣,構成SqueezeNet網路的主要模組是Fire module。

它主要由兩部分構成,分別為squeeze layer與expand layer。其中squeeze layer為1x1的conv layer,主要用於將輸入此module的input channels數目進行縮減;而expand layer包含1x1的conv layer與3x3的conv layer,主要用於真正的feature maps的特徵再融合,再表達。詳細的fire module可見下圖所示。

5971313-cc896a8fc98bca6a.JPG
Fire_module

在Fire module中作者使用了三個hyper parameters用於表示它的構成。s1x1表示squeeze layer filters的數目;e1x1表示expand layer中1x1 conv filters的數目,e3x3則表示expand layer中3x3 conv filters的數目。因為在每個fire module內部s1x1要遠小於e1x1 + e3x3,它們滿足s1x1 = SR * (e1x1 + e3x3)。而SR稱為縮減係數,在這裡只有0.125。

SqueezeNet網路結構

如下圖所示為SqueezeNet的整體網路結構及它的兩種加入Residual learning考慮的變形。

5971313-57e55579f207e1ff.JPG
SqueezeNet網路結構

它的設計基本follow了在篇初提到的三項準則。下表為它裡面的具體引數設定。

5971313-302be09c23978163.JPG
SqueezeNet內部架構詳情

我們可以從它當中看出來VGG的一些影子。也是隨網路加深,downsampling的使用而不斷加大fire module輸出 channels的數目。同時它為了提高分類準確率而儘量將模型的downsampling操作放在了後面。

SqueezeNet評估

在下表中,我們能看出通過與Alexnet相比較,SqueezeNet展示了其在使用當下已成熟的model compression技術前後所具有的效能及引數大小優勢。它進一步表明了當下較為成熟的像model prunning/model compression/low bit quantization等技術都可用於像SqueezeNet這樣的小CNN models。

5971313-4976bc2b3d3659f1.JPG
SqueezeNet的準確率及引數縮減程式評估

CNN微觀模組設計考慮

作者有從兩個方面對fire module內部的設計結構進行探索。

首先考慮SR(縮減引數)的大小對網路分類效能的影響,以上對其評估時使用的SR為0.125。作者在0.125-1的區間內對其進行線性最優探索。發現開始隨著SR增加,最終的網路accuracy確會提升,但其邊際提升值卻是愈來愈小,另外SR自0.75升至1時accuracy不升反降。

另外作者有考慮expand內部1x1 conv filters與3x3 conv filters的比例分配。發現一味提高3x3 conv所佔比例並不能導致模型精度提高,反而是3x3 conv的比例為0.5時,模型精度達到了最大為85.3%。

下圖中可見作者的詳細實驗結果。

5971313-c87e29341b09e7e1.JPG
Fire_module微觀模組設計探索

CNN巨集觀網路結構設計考慮

作者在原來的SqueezeNet網路中引入了Residual network裡面提的by-pass learning的思想。但因為當ic != oc時不能直接使用簡單的identity-mapping,因此在某些modules上考慮引入了1x1的conv使得ic == oc。這樣作者共設計了兩種考慮了residual learning的網路變形。具體網路結構可見上面章節的圖中,下圖所示則為三種網路結果對比分別具有的accuracy及模型引數大小。

5971313-7e730b414c27d26c.JPG
CNN巨集觀網路結構設計探索

程式碼分析

如下所示為一個fire module在caffe中的協議表示。

layer {
  name: "fire2/squeeze1x1"
  type: "Convolution"
  bottom: "pool1"
  top: "fire2/squeeze1x1"
  convolution_param {
    num_output: 16
    kernel_size: 1
    weight_filler {
      type: "xavier"
    }
  }
}
layer {
  name: "fire2/relu_squeeze1x1"
  type: "ReLU"
  bottom: "fire2/squeeze1x1"
  top: "fire2/squeeze1x1"
}
layer {
  name: "fire2/expand1x1"
  type: "Convolution"
  bottom: "fire2/squeeze1x1"
  top: "fire2/expand1x1"
  convolution_param {
    num_output: 64
    kernel_size: 1
    weight_filler {
      type: "xavier"
    }
  }
}
layer {
  name: "fire2/relu_expand1x1"
  type: "ReLU"
  bottom: "fire2/expand1x1"
  top: "fire2/expand1x1"
}
layer {
  name: "fire2/expand3x3"
  type: "Convolution"
  bottom: "fire2/squeeze1x1"
  top: "fire2/expand3x3"
  convolution_param {
    num_output: 64
    pad: 1
    kernel_size: 3
    weight_filler {
      type: "xavier"
    }
  }
}
layer {
  name: "fire2/relu_expand3x3"
  type: "ReLU"
  bottom: "fire2/expand3x3"
  top: "fire2/expand3x3"
}
layer {
  name: "fire2/concat"
  type: "Concat"
  bottom: "fire2/expand1x1"
  bottom: "fire2/expand3x3"
  top: "fire2/concat"
}

參考文獻

相關文章