精簡CNN模型系列之二:SqueezeNet
介紹
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可見下圖所示。
在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考慮的變形。
它的設計基本follow了在篇初提到的三項準則。下表為它裡面的具體引數設定。
我們可以從它當中看出來VGG的一些影子。也是隨網路加深,downsampling的使用而不斷加大fire module輸出 channels的數目。同時它為了提高分類準確率而儘量將模型的downsampling操作放在了後面。
SqueezeNet評估
在下表中,我們能看出通過與Alexnet相比較,SqueezeNet展示了其在使用當下已成熟的model compression技術前後所具有的效能及引數大小優勢。它進一步表明了當下較為成熟的像model prunning/model compression/low bit quantization等技術都可用於像SqueezeNet這樣的小CNN models。
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%。
下圖中可見作者的詳細實驗結果。
CNN巨集觀網路結構設計考慮
作者在原來的SqueezeNet網路中引入了Residual network裡面提的by-pass learning的思想。但因為當ic != oc時不能直接使用簡單的identity-mapping,因此在某些modules上考慮引入了1x1的conv使得ic == oc。這樣作者共設計了兩種考慮了residual learning的網路變形。具體網路結構可見上面章節的圖中,下圖所示則為三種網路結果對比分別具有的accuracy及模型引數大小。
程式碼分析
如下所示為一個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"
}
參考文獻
- SQUEEZENET: ALEXNET-LEVEL ACCURACY WITH 50X FEWER PARAMETERS AND <0.5MB MODEL SIZE, Forrest-N.-Iandola, 2016
- https://github.com/DeepScale/SqueezeNet
相關文章
- 「深度學習系列」CNN模型的視覺化深度學習CNN模型視覺化
- 深度學習 CNN 和 RNN 等模型簡介深度學習CNNRNN模型
- 深度學習與CV教程(10) | 輕量化CNN架構 (SqueezeNet,ShuffleNet,MobileNet等)深度學習CNN架構
- SqueezeNet/SqueezeNext簡述 | 輕量級網路
- CNN 簡述CNN
- SpringMVC原始碼分析系列(精簡)SpringMVC原始碼
- CNN模型引數解析CNN模型
- 大話CNN經典模型:VGGNetCNN模型
- SqueezeNet詳細解讀
- Binder面試系列之二面試
- 2018-04-21CNN經典模型CNN模型
- Python教程:精簡概述I/O模型與I/O操作Python模型
- 不容易系列之二 hd 2042
- 迅雷精簡版 for Mac!附精簡教程!Mac
- R-CNN系列其二:SPP-NetCNN
- CNN-簡單圖片分類CNN
- R2CNN模型——用於文字目標檢測的模型CNN模型
- ImageNet歷年冠軍和相關CNN模型CNN模型
- (一)文字分類經典模型之CNN篇文字分類模型CNN
- Swoole 系列之二(Websocket 要點講解)Web
- CNN 模型壓縮與加速演算法綜述CNN模型演算法
- CNN結構演變總結(一)經典模型CNN模型
- CNN也能用於NLP任務,一文簡述文字分類任務的7個模型CNN文字分類模型
- 演算法金 | 秒懂 AI - 深度學習五大模型:RNN、CNN、Transformer、BERT、GPT 簡介演算法AI深度學習大模型RNNCNNORMGPT
- 玩轉 Cgroup 系列之二:使用 CPUShares 管理 Cgroup
- 經典的CNN模型架構-LeNet、AlexNet、VGG、GoogleLeNet、ResNetCNN模型架構Go
- 乾貨|如何利用CNN建立計算機視覺模型?CNN計算機視覺模型
- 基於CNN的閱讀理解式問答模型:DGCNNCNN模型GC
- 前端安全系列之二:如何防止CSRF攻擊?前端
- 大話目標檢測經典模型:Mark R-CNN模型CNN
- 12 個常見 CNN 模型論文集錦與 PyTorch 實現CNN模型PyTorch
- 精簡版 koa 簡單實現
- Xposed原理簡介及其精簡化
- 精講Redis記憶體模型Redis記憶體模型
- 軟體設計模式系列之二十三——策略模式設計模式
- 深入小程式系列之二、Flutter 和小程式混編Flutter
- MongoDB 入門教程系列之二:使用 Spring Boot 操作 MongoDBMongoDBSpring Boot
- 以太坊簡介(2019 精校精注版)