本文主要是回顧一下一些經典的CNN網路的主要貢獻。
論文傳送門
【google團隊】
- [2014.09]inception v1: https://arxiv.org/pdf/1409.4842.pdf
- [2015.02]inception v2: https://arxiv.org/pdf/1502.03167.pdf
- [2015.12]inception v3: https://arxiv.org/pdf/1512.00567.pdf
- [2016.02]inception v4: https://arxiv.org/pdf/1602.07261.pdf
【microsoft】
- [2015.12]resnet : https://arxiv.org/pdf/1512.03385v1.pdf
【Facebook】
- [2016.11]resnext : https://arxiv.org/pdf/1611.05431.pdf
【CORNELL & Tsinghua & Facebook】
- [2016.08]DenseNet : https://arxiv.org/pdf/1608.06993.pdf
【momenta】
- [2017.09]SEnet : https://arxiv.org/pdf/1709.01507.pdf
Inception v1
【主要貢獻】
在傳統網路中,神經網路都是通過增加深度來擴充套件的。Inception結構的最大特點是從網路的寬度上進行改進,通過concat操作將經過不同kernel尺度處理的feature map進行拼接。
【其他貢獻】
使用global average pooling代替全連線層,減小引數數量;使用1*1卷積層來縮減通道數量
Inception v2
【主要貢獻】
首次提出BN層,減少Internal Covariate Shift。
Inception v3
【主要貢獻】
提出卷積分解,用兩個3*3卷積核代替5*5的卷積,用三個3*3卷積核代替7*7卷積核,後來提出用1*n,n*1的卷積核代替n*n
Inception v4
【主要貢獻】
基於inception v3的基礎上,引入殘差結構,提出了inception-resnet-v1和inception-resnet-v2,並修改inception模組提出了inception v4結構。
【值得一提的是】
基於inception v4的網路實驗發現在不引入殘差結構的基礎上也能達到和inception-resnet-v2結構相似的結果,從而認為何凱明等人認為的:“要想得到深度卷積網路必須使用殘差結構”這一觀點是不完全正確的。
Inception v4的結構
感覺到Inception v4,結構就有點詭異而複雜了,有點魔改的味道。
Inception-resnet-v1
就是有一個殘差結構,其他部分也是跟inception v4類似。
Inception-resnet-v2
與incpetion-resnet-v1差別不大,在通道數上做了修改。
實驗結果對比
- 在inception-resnet-v1與inception v3的對比中,inception-resnet-v1雖然訓練速度更快,不過最後結果有那麼一丟丟的差於inception v3;
- 在inception-resnet-v2與inception v4的對比中,inception-resnet-v2的訓練速度更塊,而且結果比inception v4也更好一點。所以最後勝出的就是inception-resnet-v2。
【個人建議把重點放在inceptionv1-v3上,對v4瞭解一下即可】
Resnet
resnet提出是在Inception v3和inception v4中間,這樣時間線就連上了。
【主要貢獻】
殘差結構提出解決了梯度消失的問題。
左邊是基本的結構,右邊是使用1*1卷積核來降低引數。
下圖是VGG網路,plain網路和殘差網路的對比,重點就是體現殘差網路的殘差結構的跳躍的感覺。
ResNext
增加網路的深度depth是改進網路的一種思路,GoogLeNet增加網路的寬度width是另一種思路,ResNext提出了一種新的方式叫做cardinality,基數。
cardinality=32的時候,就是分成32組進行卷積。上圖中右邊的模組,就是把輸入feature map卷積從256通道壓縮到4通道,然後再對4通道的特徵圖進行3*3的卷積。然後這個過程並行重複32次,最後再把所有的結果相加,然後再根據殘差結構加上輸入的特徵圖。
【值得一提的是】
下面的三種變體完全等價:
- 圖A就是之說的結構;
- 圖B是在3x3卷積後進行了concat,然後再通過統一的1x1卷積操作,這個有點類似於inception-resnet;
- C圖結構更簡潔且速度更快。採用組卷積。採用32個group,每個group的輸入輸出的通道數都是4;
【因為組卷積的放在在pytorch等庫函式中支援,所以使用組卷積的方法來實現resnext就非常的方便,就改一下引數就可以了。】
【實驗結果來說,增加Cardinality的效果是有的,和resnet50/101相比,引數量相近的情況下,resnext的準確率有所提升。】
【個人感想:這個resnext我覺得就是一個提升網路模型的trick,在建立模型的時候,baseline跑完了,可以可以試一試分組卷積,看看是否會有提升】
DenseNet
densenet緊接著在resnet之後提出,結合了resnet的思想。網路改進除了像resnet和inception在深度和寬度上做文章外,densenet通過利用feature來減少引數的同時提高效果,對feature進行有效利用並加強feature的傳遞。
【主要貢獻】
將每一層都與後面的所有層連線起來,如果一個網路中有L層,那麼會有L(L+1)/2個連線,具體連線如下圖所示:
DenseNet的一個優點是網路更淺,引數更少,很大一部分原因得益於這種dense block的設計,dense block中每個卷積層的輸出feature map的數量都很小(小於100),而不是像其他網路一樣動不動就幾百上千的寬度。同時這種連線方式使得特徵和梯度的傳遞更加有效,網路也就更加容易訓練。原文的一句話非常喜歡:Each layer has direct access to the gradients from the loss function and the original input signal, leading to an implicit deep supervision.直接解釋了為什麼這個網路的效果會很好。前面提到過梯度消失問題在網路深度越深的時候越容易出現,原因就是輸入資訊和梯度資訊在很多層之間傳遞導致的,而現在這種dense connection相當於每一層都直接連線input和loss,因此就可以減輕梯度消失現象,這樣更深網路不是問題。另外作者還觀察到這種dense connection有正則化的效果,因此對於過擬合有一定的抑制作用,博主認為是因為引數減少了,所以過擬合現象減輕。
後來引入了dense block來解決特徵圖尺寸不一致的問題:
可以看出,只有在dense block內才會網路層全連線的這種結構,彼此dense block並無連線。
SENet
【主要貢獻】
從特徵通道之間的關係入手,對特徵通道之間的關係進行建模表示,根據重要程度增強有用的特徵、抑制沒有用的特徵。
個人感覺像是在通道上做權重,類似於通道上的attention。
SE是這個結構的兩個步驟,squeeze和excitation。
squeeze擠壓
對通道進行擠壓,也就是全域性平均池化,將shape為[C,H,W]的特徵圖變成[C,1,1]。
Excitation激勵
首先通過一個全連線層進行降維,即如下公式中的W1z,然後經過relu啟用函式。即δ(W1z),再經過全連線進行升維,即W2(δ(W1z)),然後通過sigmoid進行權重啟用。
\(s = \sigma(W_2\delta(W_1z))\)
這個s就是特徵圖每一個通道的權重值。
之後我們把這個s和每一個通道相乘,就可以得到權衡過通道重要性的特徵圖了。個人經過這個SENet,效果真的不錯。
下面試SENet block:
可以看到,這個模組是放在Inception模組之後的,所以在自己的網路中,也可以加入一個SENet元件進去。SE block是一個寄生在其他網路結構上的一個效能提升trick。
下面是殘差se block,增加了殘差結構:
【效能對比】
論文中,作者浮現了各大主流網路模型,然後加入了SE模組,發現效能均有提升!
參考博文:
- https://www.cnblogs.com/shouhuxianjian/p/7786760.html
- https://blog.csdn.net/loveliuzz/article/details/79135583
- https://blog.csdn.net/u014380165/article/details/71667916
- https://blog.csdn.net/xjz18298268521/article/details/79078551
- http://www.sohu.com/a/161633191_465975