- 卷積神經網絡簡介
卷積神經網絡是多層感知機的變種,由生物學家休博爾和維瑟爾在早期關於貓視覺皮層的研究發展而來。視覺皮層的細胞存在一個復雜的構造,這些細胞對視覺輸入空間的子區域非常敏感,我們稱之為感受野。
通常神經認知機包含特征提取的采樣元和抗變形的卷積元,采樣元中涉及兩個重要參數,即感受野與閾值參數,前者確定輸入連接的數目,后者控制對特征子模式的反應程度。卷積神經網絡可以看作神經認知機的推廣。
- 卷積神經網絡的特點
卷積神經網絡成功的關鍵在於它采用了局部連接(傳統神經網絡中每個神經元與圖片上每個像素相連接)和權值共享(卷積過程中卷積核的權重不變)的方式,一方面減少了權值的數量使得網絡易於優化,另一方面降低了過擬合的風險。
圖1 全連接與局部連接
CNN的特征提取層參數是通過訓練數據學習得到的,所以其避免了人工特征提取,而是從訓練數據中進行學習;同一特征圖的神經元共享權值,減少了網絡參數,這也是卷積神經網絡相對於全連接網絡的一大優勢。
CNN一般采用卷積層與采樣層交替設置,即一層卷積層接一層采樣層,采樣層后接一層卷積層……,這樣卷積層提取出特征,再進行組合形成更抽象的特征,最后形成對圖片對象的特征描述。
下采樣層(Down-Pooling)也稱池化層,一般包含平均池化和最大池化。最大池化(Pooling)采樣,它是一種非線性降采樣方法,其在計算機視覺中的價值主要體現在兩個方面:(1)它減小了來自上層隱藏層的計算復雜度;(2)這些池化單元具有平移不變性;由於增強了對位移的魯棒性,因此是一個高效的降低數據維度的采樣方法。
- CNN的演變史
圖2 CNN的演變路徑
CNN的演變路徑可以總結為以下幾個方向:
1.從LeNet到Alex-Net
2.網絡結構加深
3.加強卷積功能
4.從分類到檢測
5.新增功能模塊
- LeNet
Paper: http://www.dengfanxin.cn/wp-content/uploads/2016/03/1998Lecun.pdf
圖3 LeNet基礎網絡架構
作為CNN的開端,LeNet包含了卷積層,池化層,全連接層,這些都是現代CNN網絡的基本組件。
輸入尺寸:32*32
卷積層:3個
降采樣層:2個
全連接層:1個
輸出:10個類別(數字0~9的概率)
Inuput(32*32)
輸入圖像Size為32*32,比mnist數據庫中最大的字母(28*28)還大,這樣做的目的是希望潛在的明顯特征能夠出現在最高層特征監測子感受野的中心。
C1,C3,C5(卷積層)
卷積運算可以理解為濾波操作(參考Stanford CS131),通過卷積運算,可以使原信號特征增強,並且降低噪聲。
S2,S4(池化層)
池化層,也稱下采樣層,是為了降低網絡訓練參數及模型的過擬合程度,通常有Max-Pooling和Mean-Pooling兩種方式。
- AlexNet
深度學習的鼻祖Hinton(http://study.163.com/course/introduction.htm?courseId=1003842018)和他的學生Alex Krizhevsky 在2012年ImageNet Challenge使用的模型,刷新了Image Classification的記錄,從此深度學習進入了一個新時代;
AlexNet的網絡結構如下圖所示,總共包含8層,其中前5層為卷積層,后3層為全連接層,輸入為1000個分類,一個完整的卷積層通常包含一層convolution,一層Rectified Linear Units,一層max-pooling,一層normalization,AlexNet完整的網絡模型如圖4所示,為了加快訓練,使用了2個GPU;
圖4 AlexNet網絡模型
layer { name: "conv1" type: "Convolution" bottom: "data" top: "conv1" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 0 } convolution_param { num_output: 96 kernel_size: 11 stride: 4
#高斯分布初始化權值 weight_filler { type: "gaussian" std: 0.01 }
#常數(默認為0)初始化權值 bias_filler { type: "constant" value: 0 } } }
#激活函數,為了引入非線性,ReLU的優點在於收斂速度比sigmoid/tanh快,sigmoid用於二分類,softmax用於多分類
layer {
name: "relu1"
type: "ReLU"
bottom: "conv1"
top: "conv1"
}
#局部響應歸一化層,一般在激活、池化后的一種操作,有利於增加泛化能力(后期VGG,GoogleNet,YOLO未使用該種方式)
layer {
name: "norm1"
type: "LRN"
bottom: "conv1"
top: "norm1"
lrn_param {
local_size: 5
alpha: 0.0001
beta: 0.75
}
}
layer {
name: "pool1"
type: "Pooling"
bottom: "norm1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 3
stride: 2
}
}
Conv1對應的數據流圖如下,AlexNet首先256*256*3的RGB圖像進行數據增強,對於輸入的圖像隨機提取224*224*3,並對數據進行水平鏡像處理,使得數據集增大了(256-224)*(256-224)*2=2048倍,隨后經過預處理變為227*227*3的訓練數據;使用96個11*11的卷積核進行卷積運算(每個GPU 48個卷積核),步長為4,對應的輸出尺寸為(227+2*0-11)/4+1=55,隨后使用3*3的池化層進行下采樣,步長為2,對應的輸出尺寸為(55+2*0-3)/2+1=27;
圖5 Conv1數據流圖
Conv2對應的數據流圖如下,輸入為27*27*96的圖像,使用256個5*5*96的卷積核進行卷積運算(每個GPU 128個卷積核),使用pad=2進行填充,輸出尺寸為(27+2*2-5)/1+1=27,隨后使用3*3的池化層進行下采樣,步長為2,對應的輸出尺寸為(27+2*0-3)/2+1=13;
圖6 Conv2數據流圖
Conv3對應的數據流圖如下,輸入為13*13*256的圖像,使用384個3*3*256的卷積核進行卷積運算(每個GPU 192個卷積核),使用pad=1進行填充,輸出尺寸為(13+2*1-3)/1+1=13,未使用池化層;
圖7 Conv3數據流圖
Conv4對應的數據流圖如下,輸入為13*13*384的圖像,使用384個3*3*384的卷積核進行卷積運算(每個GPU 192個卷積核),使用pad=1進行填充,輸出尺寸為(13+2*1-3)/1+1=13,未使用池化層;
圖8 Conv4數據流圖
Conv5對應的數據流圖如下,輸入為13*13*384的圖像,使用384個3*3*384的卷積核進行卷積運算(每個GPU 192個卷積核),使用pad=1進行填充,輸出尺寸為(13+2*1-3)/1+1=13,隨后使用3*3的池化層進行下采樣,步長為2,對應的輸出尺寸為(13+2*0-3)/2+1=6;
圖9 Conv5數據流圖
Fc6對應的數據流圖如下
圖10 Fc6數據流圖
Fc7對應的數據流圖如下
圖11 Fc7數據流圖
Fc8對應的數據流圖
圖12 Fc8數據流圖
AlexNet的創新性主要在於:
(1)數據集增強
常見的數據集增強方法包含:水平翻轉、隨機裁剪、平移變換、顏色及光照變換,AlexNet通過數據集增強方式將訓練數據擴大了2048倍,對模型的訓練起了非常重要的作用;
(2)Dropout
Dropout是AlexNet的很大一個創新,通過隨機忽略神經元,對於防止過擬合起到了極大的作用;
(3)ReLU激活函數
用ReLU代替了傳統的Tanh或者(Sigmoid)Logistic,具有前向及偏導計算非常簡單的特點,同時驗證了ReLU在更深的網絡超過Sigmoid,不容易發生梯度發散問題;
(4)LRN
局部響應歸一化,對局部神經元的活動創建競爭機制,這個策略貢獻了1.2%的Top-5錯誤率;
(5)Overlapping
使用最大池化替代平均池化,避免了此前使用平均池化出現的模糊效應;
使用重疊池化意味着池化層的步長比池化核的對應邊要小,這個策略貢獻了0.3%的Top-5錯誤率;
- VGGNet
Paper: https://arxiv.org/pdf/1409.1556.pdf
VGGNet由牛津大學的Visual Geometry Group提出,其突出貢獻在於其開創性的證明使用小的卷積核,通過增加網絡深度可以提高卷積神經網絡的表達能力,論文中使用六種不同的網絡結構進行測試,為了便於對比,統一使用3*3的卷積核(stride=1)和size為2*2的池化層;
圖13 VGGNet網絡配置
1)論文使用的網絡配置如圖10所示,網絡深度由於11層(8個卷積層和3個全連接層)到19層(16個卷積層和3個全連接層)不等,卷積層寬度由64到512,前兩個全連接層均有4096個通道,第三個全連接層有1000個通道,用於分類;
2)AlexNet和ZFNet在第一層卷積層均使用11*11的卷積層,而VGGNet統一使用3*3的卷積層(stride=1),就感受野來說,兩個3*3的卷積層疊加與一個(1+3+1)*(1+3+1)的卷積層具有相同的效果,三個3*3的卷積層疊加與一個(1+1+3+1+1)*(1+1+3+1+1)的卷積層具有相同的效果;
使用多個小卷積核堆疊的方式代替一個大的卷積核主要有兩個優勢:一,包含多個ReLU使決策函數更有判別性;二,大大減少了參數,降低了對計算資源和內存的需求,也可以理解為單層大卷積核的一種正則化操作,減少了過擬合的風險;
3)其中網絡A和A-LRN的對比用於驗證LRN(局部響應標准化)在該訓練集上是否有效果,實踐證明,這種標准化操作在ILSVRC數據集上並沒有提升性能(在AlexNet被證明是有效的),卻導致更多的內存消耗和計算時間;
4)對於VGGNet的訓練,通常使用較淺的網絡A對參數進行隨機初始化,隨后使用淺層網絡對深層網絡進行初始化(即通俗意義上的使用預訓練模型進行初始化),達到加速訓練的效果
- GoogLeNet Inception V1
一般來說,提升網絡性能最直接的辦法就是增加網絡深度和寬度,但也意味着巨量的參數,同時容易產生過擬合並也大大增加了計算量。2014年《Going deeper with convolutions》一文中提出解決這兩個問題的根本方法是將全連接甚至一般的卷積都轉化為稀疏連接。另一方面有文獻指出,對於大規模稀疏的神經網路,可以通過分析激活值的統計特性和對高度相關的輸出進行聚類來逐層構建出一個最優網絡。這點表明臃腫的稀疏網絡可能被不失性能地簡化。
所以優化的目標就變成了:既能保持網絡結構的稀疏性,又能利用密集矩陣的高計算性能。據此論文借鑒了NIN(Network in Network)的思路,提出了Inception的結構來實現此目的。
對於上圖作如下說明:
1.采用不同大小的卷積核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合;
2.選擇卷積核大小為1、3、5,同時設定步長stride=1,並設定padding=0、1、2,那么卷積之后便可以得到相同的尺寸,方便拼接在一起,不同尺度的卷積層擁有更豐富的特征;
3.pooling在減少計算參數量並降低過擬合的風險,因此在Inception中也引用了pooling;
4.網絡越到后面,特征越抽象,並且每個特征所涉及的感受野也更大了,同時隨着層數的增加,3*3和5*5卷積的比例也相應的增加;
5.使用5*5的卷積核仍然會帶來巨大的計算量,為此,文章借鑒NIN,采用1*1的卷積核進行降維;
1*1的卷積層使用低成本進行跨通道的特征變換,在同一個空間位置但是在不同通道的卷積核的輸出結果相關性極高,一個1*1的卷積就可以將這些空間位置相同但屬於不同通道的連接在一起;
改進后的GoogLeNet框架如下圖所示:
GoogLeNet整體連接圖如下圖所示
對上圖作如下說明:
1.網絡最后采用了average pooling 替代全連接層,事實證明可以將Top1 accuracy提高0.6%。但是實際在最后還是加了一個全連接層,主要是為了方便后續finetune;
2.雖然移除了全連接,但是網絡中依然使用了Dropout;
3.為避免梯度彌散,使用兩個softmax作為輔助分類器,將中間某一層的輸出用作分類,以較小的權重(0.3)加到最終分類結果,相當於模型融合,同時給網絡增加了反向傳播的梯度信號,相當於提供額外的正則化,實際測試時這兩個額外的softmax會被去掉;
- GoogLeNet Inception V2
Paper: Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
最大的亮點是提出了Batch Normalization方法,它最大的作用是:
1.使用較大的學習率而不用關心梯度爆炸或消失等問題;
2.降低了模型對初始化權重的依賴;
3.即使不使用ReLU也能緩和激活函數飽和的問題;
4.能夠學習當前層到下一層的分布縮放(scaling(方差),shift(期望))系數
- GoogLeNet Inception V3
Paper: Rethinking the Inception Architecture for Computer Vision
最大的亮點在於提出:
1.提出通用的網絡結構設計准則
避免表達瓶頸,特別是在網絡靠前的地方。信息流向前傳播過程中不能經過高度壓縮的層。
高維特征更容易處理。高維特征更易區分,會加快訓練。
可以在低緯嵌入上進行空間匯聚而無需擔心丟失很多信息。
平衡網絡的寬度與深度.增加寬度或深度可以帶來性能上的提升,但需要考慮計算資源的合理性.
2.引入卷積分解提高效率
GoogLeNet性能優越很大程度上在於使用了降維,總體上可以分為分解為更小的卷積及非對稱卷積,例如使用兩層3*3的卷積代替5*5卷積.同時,一個3*1的卷積,后面增加一個1*3的卷積,相當於3*3的卷積(即n*n卷積可以通過1*n和n*1的卷積來代替);
3.使用輔助分類器
GoogLeNet中使用了附加分類器,其目的是想把有效梯度傳遞回去,從而加快訓練,實際上輔助分類器起了正則化的作用;
4.引入高效的feature map降維
- GoogLeNet Inception V4
Paper: Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning
- ResNet
Paper: Deep Residual Learning for Image Recognition
隨着網絡的加深,出現了訓練集准確率下降的現象(可以確定這不是由於過擬合造成的,過擬合對應的准確率應該很高),作者為了解決這一問題提出了一個全新的網絡,為了解決網絡加深時的梯度彌散問題;
其對應的網絡結構如下圖所示,在傳統的CNN基礎上增加了輸入到輸出的通路,使得輸出變為F(x)+x;
實際上作者在使用中提出了兩種ResNet網絡設計,分別針對ResNet34和ResNet50/101/152,一般稱整個結構為一個"building block",其中右圖又稱為"bottleneck design";
對於常規ResNet(左圖),可用於34層或者更少的網絡中,對於BottlenckDesign的ResNet通常用於更深的網絡,目的是減少計算量和參數;
- ResNext
Paper:https://arxiv.org/abs/1611.05431
- SqueezeNet
Paper:http://arxiv.org/abs/1602.07360
- SqueezeNext
Paper:https://arxiv.org/abs/1803.10615
- MobileNet
Paper:https://arxiv.org/abs/1704.04861
參考文獻
https://blog.csdn.net/shuzfan/article/details/50738394
http://blog.csdn.net/cyh_24/article/details/51440344
https://blog.csdn.net/sunbaigui/article/details/39938097
http://www.cnblogs.com/gongxijun/p/6027747.html
http://blog.sina.com.cn/s/blog_6a8198dc0102v9yu.html
https://www.cnblogs.com/charlotte77/p/8127780.html