SqueezeNet:小小的模型,多多的快樂! || 5分鐘看懂CV頂刊論文
原論文地址:https://arxiv.org/pdf/1602.07360.pdf
本文結構
- SqueezeNet的動機
- SqueezeNet的設計理念
- SqueezeNet的結構設計
- SqueezeNet的結構優化
一、SqueezeNet的動機
近年來,深度神經網路的規模越來龐大,從VGG的16層到ResNet的152層,雖然效果越來越好,但模型的參數動輒上百MB,是在有礙於其實際應用,而本文提出的SqueezeNet的發心就是幾十上百倍地縮小模型的同時,保持較高的精度,便於訓練、下載和在小型智能設備上應用。SqueezeNet與AlexNet的比較如下,簡而言之:吊打。但說實話,和AlexNet比較還是有點取巧的意思,雖然AlexNet的歷史地位無人能及,但畢竟開疆元老,模型臃腫不堪,後輩通過精心設計吊打也是應該的。
二、SqueezeNet的設計理念
SqueezeNet的設計理念主要有三:
- 儘可能用
卷積替代
卷積。
- 輸入給
卷積層先進行降維,縮小輸入的通道數量,類似ResNet裏的BottleNeck設計理念。
- 延遲feature maps的下採樣,使得網路前面的層具有較大尺寸的feature maps,有利於提高精度。
三、SqueezeNet的結構設計
模型的結構可分別宏觀的和微觀的,宏觀的結構指模型的大體框架,不同類型層之間的連接順序和連接方式;微觀結構比如ResidualBlock、DenseBlock、Inception、ShuffleNet Unit等,指含有卷積層模塊的設計。
1、SqueezeNet的宏觀結構
SqueezeNet的宏觀結構和AlexNet步調一致,差別在於:
- 借鑒NIN的思想,取消全連接層,使用全局池化代替。
- 使用自行設計的fire模塊。
上圖最左的是原生SqueezeNet的結構,而中間和右邊都使用了ResNet裏的跳層連接,二者不同之處在於右邊的模型在跳層連接的兩個feature maps尺寸不同時,使用 的卷積層使之相同。不過有意思的是,中間的模型效果比右邊的要好:
2、SqueezeNet的微觀結構fire模塊
fire模塊結構如下圖,即以下模塊的順序連接:
卷積層,filters數量為
- ReLU
- 由
卷積和
卷積組成的卷積層,二者filters數量分別為
和
,其中
卷積的比例為
,
- ReLU
一些細節:
(1)在Fire模塊中,expand層採用了混合卷積核1x1和3x3,其stride均為1,對於1x1卷積核,其輸出feature map與原始一樣大小,但是由於它要和3x3得到的feature map做concat,所以3x3卷積進行了padding=1的操作,實現的話就設置padding=」same」;
(2)Fire模塊中所有卷積層的激活函數採用ReLU;(3)Fire9層後採用了dropout,其中keep_prob=0.5;(4)SqueezeNet沒有全連接層,而是採用了全局的avgpool層,即pool size與輸入feature map大小一致;(5)訓練採用線性遞減的學習速率,初始學習速率為0.04。參考鏈接:小小將:CNN模型之SqueezeNet
三、SqueezeNet的結構優化
SqueezeNet宏觀結構優化在上文已介紹(加入跳層連接),宏觀結構定下來後,有以下超參數可以調整:
- fire模塊內的:
、
、
卷積的比例為
- Squeeze Ratio,即
- fire模塊之間的:
- expand 層 feature maps 增長速率
- expand 層 feature maps 的增長頻率
,即每隔
個fire模塊後feature maps增加
。即:for Fire module i, the number of expand filters is:
- 各初始值為:
- 第一個 expand 層 filters 數為
- 增長速度
- expand 層中
卷積層含量
- 增長頻率
- Squeeze Ratio
調整 Squeeze Ratio, 的結果如下圖左邊,其中
,
。
調整 的結果如上圖右邊,其中
,
。
最後附上原生SqueezeNet的詳細參數:
推薦閱讀: