SqueezeNet網絡模型非常小,但分類精度接近AlexNet。
這里復習一下卷積層參數的計算
輸入通道ci,核尺寸k,輸出通道co,參數個數為:
以AlexNet第一個卷積為例,參數量達到:3*11*11*96=34848
基礎模塊
包含三個卷積層(藍色),步長為1,分為squeeze和expand兩部分,分別壓縮和擴展數據(灰色矩形)的通道數
expand部分中,兩個不同核尺寸的結果通過串接層(黃色)合並輸出
fire模塊有三個可調參數:
- s1:squeeze部分,1x1卷積層的通道數
- e1:expand部分,1x1卷積層的通道數
- e3:expand部分,3x3卷積層的通道數
輸入輸出尺寸相同。輸出通道數不限,輸出通道數為e1+e3
在本文提出SqueezeNet結構中,
網絡結構
整個網絡包含10層
第1層為卷積層,縮小輸入圖像,提取96維特征
第2到9層為fire模塊,每個模塊內部先減少通道數(squeeze)再增加通道數(expand)。每兩個模塊之后,通道數會增加
在1、4、8層之后加入降采樣的max pooling,縮小一般尺寸
第10層又是卷積層,為小圖的每個像素預測1000類分類得分
最后用一個全圖average pooling得到這張圖的1000類得分,使用softmax函數歸一化為概率
這是一個全卷積網絡,避免了如今越來越不受待見的全連接層。由於最后一層提供了全圖求平均操作,可以接受任意尺寸的輸入。當然,輸入還是需要歸一化大致相當的尺寸,保持統一尺度
全連接層的參數多,對性能提升幫助不大,現在往往被pooling代替
這個網絡達到了和AlexNet相當的分類精度,但模型縮小了50倍
architecture | model size | top-1 accuracy | top-5 accuracy |
---|---|---|---|
AlexNet | 240MB | 57.2% | 80.3% |
SqueezeNet | 4.8MB | 57.5% | 80.3% |
網絡設計的要點
1. 為了使1x1和3x3filter輸出的結果有相同的尺寸,在expand modules中,給3x3filter的原始輸入添加一個像素的邊界(zero-padding)
2. squeeze和expand layers中都是用ReLU作為激活函數
3. 在fire9 module之后,使用Dropout,比例取50%
4. 訓練過程中,初始學習率設為為0.04,在訓練過程中線性降低學習率
5. 由於caffe中不支持使用兩個不同尺寸的filter,在expand layer中實際上使用了兩個單獨的卷積層(1x1filter和3x3filter),最后將這兩層的輸出連接在一起,這在數值上等價於使用單層但是包含兩個不同尺寸的filter
當然SqueezeNet還可以繼續壓縮,使模型更小。SqueezeNet采用了一些deep-compression的方法,比如裁剪,量化和編碼
裁剪:設置閾值,對於小於閾值的參數直接寫0,然后用非零參數再次訓練
量化:對參數做聚類,然后每個類別的參數的梯度值相加,作用在聚類中心上
編碼:Huffman編碼進一步壓縮存儲
參考:
輕量化模型:SqueezeNet,MobileNet,ShuffleNet以及Xception