【程式喵筆記】影象分類網路1.0
影象分類網路
來總結一下部分經典的分類網路~
目錄
前言
ImageNet大規模視覺識別比賽(ImageNet Large Scale Visual Recognition Challenge)120萬幅高解析度影象分類為1000個不同的類,雖然2017年就已經宣佈停賽,但是裡面的一些網路可以說是在特徵提取和深度學習之中堪稱經典。從12年的AlexNet開始,網路越來越深,越學越好~
Top5錯誤率是正確標籤不在預測標籤的前5中的影象在總樣本中比例。
AlexNet
網路構架
AlexNet可以說是對傳統神經網路一大突破,錯誤率直接下跌接近10個百分點,先看看網路構架
創新點
網路現在看來不是很驚豔,但是也有為後續網路鋪路的幾點創新:
ReLU啟用
為了增加網路的非線性,卷積後使用啟用函式,原先使用的是sigmoid或者tanh,RelU就很簡單粗暴了f(x) = max(0, x),ReLU的引入大大減少了梯度下降的訓練時間,網路更快收斂
Max Pooling最大池化
池化層總結了特徵圖的輸出,也就是將特徵圖的大小變小,保留重要的特徵,原先常用的是平均池化,但是特徵會有所模糊,在AlexNet之後,最大池化開始流行
Dropout
為了防止過擬合(過擬合就是分的太細了,簡單看訓練集準確率很高,驗證集準確率卻低)不僅在資料預處理的時候採用資料擴充(data augmentation),也在全連線層引入Dropout。Dropout就是隨機捨棄一些神經元,前向傳播輸出為0,反向傳播不更新,下一次訓練恢復,然後再隨機捨棄一些。可以防止訓練資料中複雜的共同適應。
創新點還有區域性響應歸一化(LRN),這個後續學者證明沒多大用處。
VGG
VGG可謂在識別網路中很多都用到了,最經典的是VGG16,16層網路。可是這16層看起來挺淺,但是當時可不容易,網路層數增多會引起梯度爆炸,梯度消失,網路崩了怎麼玩?作者就想出一個好辦法啊~預訓練:先訓練一個淺層網路,用淺層網路初始化深層網路的引數,這樣就有個引導,不會跑太偏。
網路構架
最常用的VGG16和19在分類,識別網路很多都為特徵提取的網路結構
創新點
3*3小卷積
自從VGG之後,3*3
的卷積變得很普遍,更少的引數,更優的效果,更快的訓練。
先說感受野,一個5*5
的卷積感受野為25,兩個3*3
步長為1的感受野也是25. 但是引數一個5*5
5*5*c*c
,兩個3*3
引數為 2*3*3*c*c
,c為特徵圖維度數(通道數)
再說效果優秀,文章證明2個3*3
替換為 5*5
,Top1錯誤率增加了7%
卷積-池化結構
卷積為 3*3
,步長為1,之後接ReLU啟用。最大池化為 2*2
步長為2,最大池化之後特徵圖的長和寬都會變為原來的一半。為了彌補這以缺失,在後一層卷積增加捲積核的維度,從而增加特徵圖的維度。所以VGG特徵圖是變得越來越小,維度越來越深。
Inception
這是Google提出的網路,主要是一個Inception結構,並行多次卷積在拼接,有4個版本,最後一個和ResNet結合,著重分析前三個
創新點
Inception結構
目標識別存在問題:
- 全域性目標大卷積核更優,區域性目標小卷積核更優
- 卷積核堆疊會增加計算量,也會使網路過深,可能存在梯度消失
解決的方法把全連線改成稀疏連線,卷積層也是稀疏連線,但是不對稱的稀疏資料數值硬體不能跟上(硬體全是針對密集矩陣優化。)所以,Inception是一種硬體可以跟上並且近似的最優區域性稀疏結構。
上一層卷積經過不同大小的卷積,只要保證padding = 0、1、2,就可以得到相同大小的特徵圖並連線,增加一個3*3 max pooling
會產生更優的效果。
5*5
卷積加入很大程度上提取了特徵圖中遠距離的特徵,但是計算量增加了很多,但是又不想捨棄 5*5
只能在特徵圖維度上減少。就增加了 1*1
的卷積來降低維度。
1*1卷積
降維:對於同樣大小的輸入輸出特徵圖,增加1*1
卷積通過降維,大大減少了網路的引數
聚合:1*1
卷積實際上使跨通道的聚合,將多個輸入特徵圖上相同位置的點做全連線處理,並增加ReLU提取非線性特徵。
這樣,改進後的Inception模組變成這樣
輔助分類網路
網路太深,如果所有的一起訓練,前面幾層梯度導數為0,這樣就出現梯度消失,為解決這個問題,增加了兩個softmax輔助分類網路,在較為低層的網路進行區分,增加返回的梯度訊號。輔助分類網路只用於訓練階段,從中間層的分類結果按照比較小的權重(0.3)增加至最終分類層中。
具體GoogLeNet網路如下:
Batch Normalization
先說說batch,就是一批一批資料訓練,好處一是平行計算更高效,二是一批資料上計算梯度和損失,這批資料量越大越好,如果能一次把所有的資料都放到一批那就簡直完美,但是硬體不能實現。
每層的輸入受到前幾層影響,如果前一層的分佈變化,後一層需要適應,那麼學習起來就很複雜了,這就產生了協方差偏移。訓練過程中,深度網路內部節點分佈的變化就是 Internal Covariate Shift(內部協方差偏移),需要較低的學習率和合適的初始化引數,訓練的很慢。
如果在訓練中,把多個樣本做歸一化,就是變為均值為0,方差為1的正態分佈,這樣的歸一化之後的資料再輸入到啟用函式中,啟用函式的取值靠近中間,不會出現梯度消失,如圖,啟用函式如果為sigmoid,歸一化後輸入為藍色區域
但是這樣啟用函式都線上性區域了,啟用函式就是要提供非線性啊,對歸一化的值還要進行偏移
在Inception-v3中所有卷積層和輔助分類的全連線層全部使用BN
不對稱卷積核
這是Inception-v3在Inception-v1上的改進,形成3種不同的Inception模組,用來對深層特徵提取,一種是5*5
卷積由兩個 3*3
替代,更少的引數,更優的效率
作者想,能不能更小,3*3
變成 2*2
,但是效果不怎麼好,還不如整一個非對稱的用 1*3
和 3*1
兩個卷積替代 3*3
更節省引數
這種非對稱的卷積在淺層使用意義不大,在深層網路,更有助於生成高維的稀疏表示。還有一種類似的非對稱卷積,是最後的Inception模組,用於擴充套件濾波器組。
ResNet
網路想要深,但是越深效果反而差了,卷積神經網路遇到的問題:按道理加深網路層數可以提取更深入的資訊,但是實際上加深網路會使得網路衰退,就是網路層數增加,錯誤增加,退化問題。
突破神經網路深度問題最為顛覆性問題就是ResNet。
網路構架
網路設定很簡單,卷積和VGG一樣,大多是3*3卷積,遵循兩個原則::(i)對於相同的輸出特徵圖尺寸,各層有相同數量的濾波器; (ii)如果將特徵圖的大小(尺寸)減半(用步長為2的卷積進行下采樣),則過濾器的數量將增加一倍,以保持每一層的時間複雜度。卷積之後,Relu啟用之前,增加Batch Normalization(BN)防止梯度消失。
以ResNet50為例,從conv3_x開始,第1個block的第2個卷積會步長為2,特徵圖尺寸減半,作為補償,濾波器數量變為2倍.
創新點
殘差模組
解決網路退化問題特別簡單,增加了一個恆等對映 x
,讓網路的輸出為卷積之後的 F(x)
和x
相加,這樣網路就變成了輸出和輸入的差,就是殘差了
如果極端而言,右邊恆等對映x
很優秀了,那麼F(x)很容易就變為0,這樣也就相當於這層特徵提取的太差,就把他扔了,下一層繼續提取(但實際不會這麼極端)。直接把x拿過來這跟線就是短連結,不會增加網路額外的引數和複雜度,並且不會變為0。
這裡的F(x)必須是兩層或者更多層的網路,如果是單層那麼又等價為線性層。如果F(x)和x維度一致,可以直接相加的;如果不一致對x
進行一個維度變換,文章提出兩種方案,一是直接加0,二是用1*1
的卷積卷一下來增加維度(二效果更好)。
比較可以看出來,同樣網路構造,ResNet中34層要比18層優秀。不僅如此。18層雖然結果相似,但是ResNet更快收斂。針對殘差模組的設計,ReLU和BN到底應該放在哪,作者在後續文章做了一些改進
就是這小小的一個恆等對映,就是網路深度質的突破(千層都不是問題),此後,很多學者的研究都是在ResNet基礎上。
ResNeXt
這可以說是一個綜合體,借鑑了Inception結構的稀疏模組和ResNet的殘差結構。
網路構架
構架和ResNet很相似,不過殘差模組增加C,C就是並列的相同的分支
創新點
Cardinatity
ResNeXt提出一個Cardinatity,作為模型複雜度的一個新度量,指的是一個block中所具有的相同分支的數目,也就是原先玩1個64維度的特徵圖,現在拿32個4維特徵圖分別玩。
這樣玩的原因有點像全連線層,就是神經元啊,要分開,轉換再聚合
那麼網路也可以先分開,再卷積,最後聚合一起啊。這就是Network-in-Neuron。在保證相似計算複雜度及模型引數大小的前提下,提升cardinatity比提升網路深度或寬度可取得更好的模型表達能力。
比起來Inception-Resnet更加簡單高效,網路看起來清晰不少(我感覺Inception網路結構太複雜),ResNeXt每一個卷積路徑有相同的結構,多條路徑可以共享,而Inception-ResNet就是挺五花八門的。這樣再實際操作的時候就按照群卷積(Group convolution)操作就可以
【後記】
讀完大神的paper總是要讚歎許久,以上是我看陳雲霽老師的書和啃網路論文的總結,可能有不全面之處,大家多多交流~