圖片分類,判斷圖片中是否有某個物體,一個圖對應一個標簽。性能指標:(1) Top1 error 第一次是否猜中,(2) Top5 error 猜5次其中有一次猜中。
很多出色的網絡結構是從大賽中流行起來的。ImageNet Large Scale Visual Recognition Challenge ILSVRC 2017 年已經停止舉辦,因為涉及的方面的算法技術已經很成熟,沒有什么提升空間了。涉及圖像分類(1000個分類,訓練集1.2M、驗證集50K、測試集150K,使用WorkNet的詞匯對圖像打標簽)、場景分類(MIT的Places2數據集,圖片10M+、分類400+,365個場景分類,訓練集8M、驗證集36K、測試集328K)、物體檢測、物體定位、場景解析等方面。在ILSCRC的 ImageNet Classification Top5 error 錯誤率2015年已經降到3.57%
網絡進化過程中比較好的網絡 AlexNet(深度8層)->VGG(19)->GoogleLeNet(22)->ResNet(152)
1. AlexNet(8)
原始論文 http://www.cs.toronto.edu/~fritz/absps/imagenet.pdf
2012年ImageNet 競賽第一,遠比第二名領先,標志着DNN深度學習革命的開始。
特點:5個卷積層+3個全連接層
60M個參數+650K個神經元
2個分組->2個GPU(3GB、2塊GTX 580 訓練5至6天)
引入的新技術 ReLU、Max polling、Dropout regularization
LRU 相鄰通道kernel上同一位置的數值進行歸一化(VGGNet的論文認為沒什么用)
網絡結構如圖:
為了后面下采樣除起來是個整數,前面做成 227*227
輸~~~~~~~入 \(227\times 227\times 3\) |
GPU 1 | GPU 2 | 輸~~~~~~~~~~~~出 |
---|---|---|---|
卷積層 1 \(227\times 227\times 3\) |
卷積核\(11\times 11\) 數量48 步長 4 | 卷積核\(11\times 11\) 數量48 步長 4 | |
激活函數 relu | 激活函數 relu | 特征圖: \((227-11)/4+1=55\) 即 \(55\times 55\times 96\) |
|
池化Max pooling, kernel size 3, stride 2 | 池化Max pooling, kernel size 3, stride 2 | 特征圖:\((55-3)/2+1=27\) 即 \(27\times 27\times 96\) |
|
標准化 Local Response Normalization | |||
卷積層 2 \(27\times 27\times 96\) 通道獨立 |
卷積核\(5\times 5\) 數量128 步長 1 | 卷積核\(5\times 5\) 數量128 步長 1 | 輸入特征圖先擴展padding2個像素 即\(31\times 31\) |
激活函數 relu | 激活函數 relu | 特征圖:\((31-5)/1+1=27\) 即 \(27\times 27\times 256\) |
|
池化Max pooling, kernel size 3, stride 2 | 池化Max pooling, kernel size 3, stride 2 | 特征圖:\((27-3)/2+1=13\) 即 \(13\times 13\times 256\) |
|
標准化 Local Response Normalization | |||
卷積層 3 \(13\times 13\times 256\) 通道合並 雙GPU交互 |
卷積核\(3\times 3\) 數量192 步長 1 | 卷積核\(3\times 3\) 數量192 步長 1 | 輸入特征圖先擴展padding1個像素 即\(15\times 15\) |
激活函數 relu | 激活函數 relu | 特征圖:\((15-3)/1+1=13\) 即 \(13\times 13\times 384\) |
|
卷積層 4 \(13\times 13\times 384\) 通道獨立 |
卷積核\(3\times 3\) 數量192 步長 1 | 卷積核\(3\times 3\) 數量192 步長 1 | 輸入特征圖先擴展padding1個像素 即\(15\times 15\) |
激活函數 relu | 激活函數 relu | 特征圖:\((15-3)/1+1=13\) 即 \(13\times 13\times 384\) |
|
卷積層 5 \(13\times 13\times 384\) 通道獨立 |
卷積核\(3\times 3\) 數量128 步長 1 | 輸入特征圖先擴展padding1個像素 即\(15\times 15\) |
|
激活函數 relu | 激活函數 relu | 特征圖:\((15-3)/1+1=13\) 即 \(13\times 13\times 256\) |
|
池化Max pooling, kernel size 3, stride 2 | 池化Max pooling, kernel size 3, stride 2 | 特征圖:\((13-3)/2+1=6\) 即 \(6\times 6\times 256\) |
|
全連接 6 \(6\times 6\times 256\) |
2048個神經元 | 2048個神經元 | |
dropout | dropout | \(4096\times 1\)的向量 | |
全連接 7 \(4096\times 1\) |
2048個神經元 | 2048個神經元 | |
dropout | dropout | \(4096\times 1\)的向量 | |
全連接 8 \(4096\times 1\) |
1000個神經元 | \(1000\times 1\)的向量 |
2. Network in Network
論文 Network in Network
一個 \(28\times 28\times 192\) 的特征圖 被 32 個 \(1\times1\times 192\)的卷積核進行卷積。這樣最終是 \(28\times 28\times 32\).
假設輸入特征圖的某像素的\(c\)個通道值 \((x_1, x_2, \cdots, x_c)\)
\(k\) 個 \(1\times 1\times c\) 的卷積核,\((a_{11}, \cdots, a_{1c}), \cdots, (a_{k1}, \cdots, a_{kc})\)
\((x_1, x_2, \cdots, x_c)\otimes \begin{pmatrix}a_{11} & \cdots & a_{1c}\\ \vdots & \ddots &\vdots\\a_{k1}&\cdots & a_{kc}\end{pmatrix}=(y_1, y_2, \cdots, y_k)\)
\(f(a_{11}x_1+a_{12}x_2+\cdots+a_{1c}x_c)=y_1\cdots\cdots\)
實現跨通道的交互和信息整合,能夠對通道數進行降維和升維
3. VGG(19)
ImageNet-2014 競賽第二,網絡改造的首選基礎網絡,典型的層數是19層
提出目的是為了探究在大規模圖像識別任務中,卷積網絡深度對模型精確度的影響
一個大卷積核分解成連續多個小卷核
例如 \(7\times7\) 分解成 3個 \(3\times 3\) 核 由ReLU連接,參數數量由\(49C^2\) 降至 \(27C^2\)
VGG可以減少參數,降低計算,增加深度
從A至E隨着層數的增加,參數增加的並不多
4. GoogleLeNet(22)
在此之前,網絡結構的突破是更深的層數更寬的神經元數。
GoogleLeNet網絡ImageNet-2014競賽第一
模型是不是試出來的?是不是要窮舉驗證各方面的網絡結構? GoogleLeNet解決這個問題,把所有的可能性排出來,讓模型去決定。
Inception V1網絡
核心組件Inception Architecture
Split-Merge 試了 \(1\times 1\)卷積, \(3\times 3\)卷積, \(5\times 5\)卷積, \(3\times 3\)池化
使用了NiN的\(1\times 1\)卷積進行特征降維
為了減負取消了全連接,因為全連接參數量大
由於層數深(一般22層),使用輔助分類器解決前幾層的梯度消失問題
從下往上看,對幾種情況分別做卷積后疊在一起(不做和,只是疊在一起,保持層數不變),另外不同的卷積操作使用padding等方法使圖像尺度不變,這樣才能疊加
通過加入\(1\times 1\)卷積降低通道數,保持圖像尺度不變的情況下,疊在一起
全局平均池化 Global average pooling
取消占用大量參數的全連接層。全局平均池化,對每個特征圖求平均值
輸入\(7\times7\times1024\)變成\(1\times1\times1024\)
輔助分類器
避免梯度消失。訓練階段,在認為梯度有可能消失的地方,讓結果重新參與調整誤差。
Inception V2網絡
提出Batch Normalization2018年有論文認為這一操作使“解空間”更加平滑。
在這個網絡中使用批歸一化代替部分Dropout。
將\(5\times 5\) 變成兩個\(3\times3\)卷積核堆疊。
每個特征通道分別進行歸一化。通道數不做歸一化。
在測試階段使用的是訓練階段所有Batch的均值、方差的平均值。
原論文把Batch歸一化放(包含scale & shift)在卷積與ReLU之間。
Inception V3網絡
將\(N\times N\)分解成\(1\times N\), \(N\times 1\), 能夠降低參數和計算量
經驗:在中度大小的feature map上使用效果好,建議m*m 里m取12到20之間。
前面的層先做卷積和pooling(相當於v4里的主干 stem),將特征提取足夠多。后面用Inception。Inception 包含了不同的可能性,如果有的情況對分類影響不大,則后面卷積時權重會很小接近於0。這樣Inception就實現了選擇不同的可能性
認為淺層輔助分類器無用,取消淺層輔助分類器。在訓練后期使用深層輔助分類器,比如用在最后一層后。加上BatchNormalization和Dropout
Inception V4網絡
論文https://arxiv.org/abs/1602.07261v2
Reduction 能夠比較Maxpooling 與卷積兩種把尺度變小的方法哪個更好。
整個網絡結構包含了很多種組合,包含了很多種情況。訓練的結果決定哪些情況起的作用大。
Inception 小結
不像VGG那樣人工去試。該類網絡結構代替人工確定卷積層中的過濾器類型或者確定卷積層和池化層的組合方式,即預先給網絡添加盡可能多的可能性組合,將輸出連接起來,讓網絡自己學習決定。
缺點:由於添加了盡可能多的可能性,所以訓練出來的參數和網絡結構更貼近該樣本,造成不利於擴展。擴展性不如VGG。
5. ResNet(152)
論文https://arxiv.org/abs/1512.03385v1
提出背景:網絡的層數不能通過一直堆疊來獲得好的學習效果。過多的層數會導致梯度消失、梯度爆炸、網絡退化(誤差增大、效果不好、過適應等問題)。
ResNet主要思路:
殘差映射 \(F(x)=H(x)-x\),\(x\)是卷積之前,\(H(x)\)是卷積之后。\(F(x)=H(x)-x\) 相當於學到的東西與原始的東西的差距,相當於卷積沒有獲取的特征,或者相當於沒有學到的內容。
ResNet特點:
(1) 殘差映射(主要貢獻)
(2) 全是\(3\times 3\)卷積核(應該是為了操作殘差映射)
(3) 卷積步長2取代池化, 沒有池化(應該是為了操作殘差映射)
(4) 使用Batch Normalization
(5) 取消Max池化,取消全連接層(參數多計算量大,取消掉是趨勢,有其它方法替換),取消Dropout(應該是為了操作殘差映射)
優化點:
通過\(1\times 1\) 卷積降低計算量,在兩頭加,前面降維,后面升維,使其與之前維數相同以便於操作\(H(x)=F(x)+x\)
101層比較常見。另外GoogleLeNet中Inception層可以結合resnet的殘差映射.
ResNeXt
ILSVRC-2016競賽第二。提出“深”(如 GoogLeNet、ResNet等)和“寬”(如 GooglLeNet等)之外的第3個角度。
相當於將AlexNet里的group convolution引進ResNet中,將卷積核按通道分組,形成32個並行分支(cardinality(基數)),低維度卷積進行特征變換,然后加法合並
參數規模:
左邊ResNet: \(256\times64+3\times3\times64\times64+64\times256=70\mathrm{k}\)
右邊ResNeXt: \(32\times(256\times 4+3\times3\times 4\times 4+4\times 256)=70\mathrm{k}\)
同參數規模下,增加結構,提高模型表達力
效果:100層ResNeXt相當於200層ResNet
6. 典型的CNN對比
模型 | AlexNet | VGG | GoogLeNet v1 | ResNet |
---|---|---|---|---|
時間 | 2012 | 2014 | 2014 | 2015 |
層數 | 8 | 19 | 22 | 152 |
Top-5錯誤 | 16.4% | 7.3% | 6.7% | 3.57% |
Data Augmentation | + | + | + | + |
Inception(NIN) | - | - | + | - |
卷積層數 | 5 | 16 | 21 | 151 |
卷積核大小 | 11,5,3 | 3 | 7,1,3,5 | 7,1,3,5 |
全連接層數 | 3 | 3 | 1 | 1 |
全連接層大小 | 4096,4096,1000 | 4096,4096,1000 | 1000 | 1000 |
Dropout | + | + | + | + |
Local Response Normalization | + | - | + | - |
Batch Normalization | - | - | - | + |
7. 如何設計CNN網絡
-
避免信息瓶頸
- 卷積過程中
- 多個小尺寸卷積核 vs 一個大尺寸卷積核
- 尺度\(H\times W\)逐漸變小
- 輸出通道數\(Cw\)逐漸變多
- \(H\times W\times C\)要緩慢變小
-
通道(卷積核)數量保持在可控范圍內, 計算量 \(complexity\propto C\times K\) (可以通過如前面的 \(1\times 1\), \(3\times 3\), \(1\times N\)等方法疊在一起)
- 輸入通道數量 \(C\)
- 輸出通道數量 \(K\)
- 參數數量 \(H_f\times W_f\times C\times K\)
- 操作數量 \(\frac{H\times H_f}{stride}\times\frac{W\times W_f}{stride}\times C\times K\)
-
感受野要足夠大(為了計算量,卷積核又不能太大,可以通過如前面\(5\times 5\) 使用 2個\(3\times 3\)疊在一起使用,后面的\(3\times 3\)能夠達到\(5\times 5\)的感受野)
- 卷積是基於局部圖片的操作
- 要捕捉大尺寸的內容
- 多個小尺寸卷積核 vs 一個大尺寸卷積核
- 參數少,計算快
- 多個非線性激活(增強網絡的表現能力)
-
分組策略,降低計算量
- 分G組, M/G 個濾波器 vs M 個濾波器
[1] https://zhuanlan.zhihu.com/p/251068800
[2] https://paperswithcode.com/methods/category/convolutional-neural-networks