resnet结构_经典卷积网络(二)-ResNet
一、ResNet(總結自csdn文章)
隨著網絡的加深,出現了訓練集準確率下降的現象,確定這不是由于Overfit過擬合造成的。作者針對這個問題提出了一種全新的網絡,叫深度殘差網絡,它允許網絡盡可能的加深,其中引入了全新的結構如圖1:
殘差指的是什么?
其中ResNet提出了兩種mapping:
一種是identity mapping,指的就是圖1中”彎彎的曲線”,另一種residual mapping,指的就是除了”彎彎的曲線“那部分,所以最后的輸出是 y=F(x)+x。identity mapping顧名思義,就是指本身,也就是公式中的x,而residual mapping指的是“差”,也就是y?x,所以殘差指的就是F(x)部分。
為什么ResNet可以解決“隨著網絡加深,準確率不下降”的問題?
理論上,對于“隨著網絡加深,準確率下降”的問題,Resnet提供了兩種選擇方式,也就是identity mapping和residual mapping,如果網絡已經到達最優,繼續加深網絡,residual mapping將被push為0,只剩下identity mapping,這樣理論上網絡一直處于最優狀態了,網絡的性能也就不會隨著深度增加而降低了。
ResNet結構
它使用了一種連接方式叫做“shortcut connection”,顧名思義,shortcut就是“抄近道”的意思。“彎彎的弧線“這個就是所謂的”shortcut connection“,也是文中提到identity mapping,這張圖也詮釋了ResNet的真諦,真正在使用的ResNet模塊并不是這么單一,文章中就提出了兩種方式:
這兩種結構分別針對ResNet34(左圖)和ResNet50/101/152(右圖),一般稱整個結構為一個”building block“。其中右圖又稱為”bottleneck design”,目的一目了然,就是為了降低參數的數目,第一個1x1的卷積把256維channel降到64維,然后在最后通過1x1卷積恢復,整體上用的參數數目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,而不使用bottleneck的話就是兩個3x3x256的卷積,參數數目: 3x3x256x256x2 = 1179648,差了16.94倍。
對于常規ResNet,可以用于34層或者更少的網絡中,對于Bottleneck Design的ResNet通常用于更深的如101這樣的網絡中,目的是減少計算和參數量(實用目的)。
如果F(x)和x的channel個數不同怎么辦,因為F(x)和x是按照channel維度相加的,channel不同怎么相加呢?
針對channel個數是否相同,要分成兩種情況考慮,如下圖:
實線的的Connection部分(”第一個粉色矩形和第三個粉色矩形“)都是執行3x3x64的卷積,他們的channel個數一致,所以采用計算方式: y=F(x)+xy=F(x)+x
虛線的的Connection部分(”第一個綠色矩形和第三個綠色矩形“)分別是3x3x64和3x3x128的卷積操作,他們的channel個數不同(64和128),所以采用計算方式: y=F(x)+Wxy=F(x)+Wx
其中W是卷積操作,用來調整x的channel維度的;
兩種Shortcut Connection方式實例(左圖channel一致,右圖channel不一樣)
ResNet50和ResNet101
Resnet網絡結構的設計遵循兩種設計規則:1)對于相同的輸出特征圖尺寸,層具有相同數量的濾波器;2)如果特征圖大小減半,則濾波器的數量加倍,以便保持每一層的時間復雜度。
這里把ResNet50和ResNet101特別提出,主要因為它們的出鏡率很高,所以需要做特別的說明。給出了它們具體的結構:
上面一共提出了5中深度的ResNet,分別是18,34,50,101和152,首先看表2最左側,我們發現所有的網絡都分成5部分,分別是:conv1,conv2_x,conv3_x,conv4_x,conv5_x,之后的其他論文也會專門用這個稱呼指代ResNet50或者101的每部分。
實現部分的 tricks:
圖片resize:短邊長random.randint(256,480);裁剪:224*224隨機采樣,含水平翻轉;減均值;標準顏色擴充[2]
conv和activation間加batch normalization幫助解決vanishing/exploding問題
minibatch-size:256
learning-rate: 初始0.1, error平了lr就除以10
weight decay:0.0001
momentum:0.9
沒用dropout[3]
二、ResNet V2(總結自csdn文章)
下面(1)-(5)的結構哪個是我們常用的ResNet結構?
其中weight指conv層,BN指Batch Normalization層,ReLU指激活層,addition指相加;
根據ResNet的描述,似乎以上五組都符合,那么2016年ResNet原文是哪一個結構呢?以及其他四組結構也都work么?
針對第一個問題,ResNet原文中使用的結構是(1),(1)的特點有兩個:1)BN和ReLU在weight的后面;2)最后的ReLU在addition的后面;對于特點1),屬于常規范疇,我們平時也都這個順序:Conv->BN->ReLU;對于特點2),為什么ReLU放在addition后面呢?按照常規,不是應該是圖(3)這種么,那么我們接下來引出的問題就是:
圖(3)的結構work么?
對于每個圖右側部分我們稱作“residual”分支,左側部分我們稱作“identity”分支,如果ReLU作為“residual”分支的結尾,我們不難發現“residual”分支的結果永遠非負,這樣前向的時候輸入會單調遞增,從而會影響特征的表達能力,所以我們希望“residual”分支的結果應該在(-∞, +∞);這點也是我們以后設計網絡時所要注意的。
對于圖(3)不OK的情況,那如果把BN也挪到addition后面呢?如圖(2),同時也保證了“residual”分支的取值范圍;
這里BN改變了“identity”分支的分布,影響了信息的傳遞,在訓練的時候會阻礙loss的下降;這里大家肯定又有個問題:
為什么“identity”分支發生變化,會影響信息傳遞,從而影響訓練呢?
到此也就徹底回答了圖(2)的結構為何會阻礙反向傳播時的信息。
在分析圖(4)和圖(5)之前,我們引出一個概念:”Post-activation”和”Pre-activation”,其中Post和Pre的概念是相對于weight(conv)層來說的,那么我們不難發現,圖(1), (2), (3)都是”Post-activation”,圖(4), (5)都是”Pre-activation”,那么兩種模式哪一個更好呢?這里我們就用實驗結果說話。
上圖是5種結構在Cifar10上的實驗結果,一共實驗了兩種網絡ResNet110和ResNet164(注:這里直接摘抄了原文的圖片,本人并沒有真實的試驗過);
從實驗結果上,我們可以發現圖(4)的結構與ResNet原結構伯仲之間,稍稍遜色,然而圖(5)的結構卻好于ResNet原結構。圖5的結構好的原因在于兩點:1)反向傳播基本符合假設,信息傳遞無阻礙;2)BN層作為pre-activation,起到了正則化的作用;
最后我們通常把圖5的結構稱作ResNetV2,把ResNetV1和ResNetV2結構再次show:
總結
以上是生活随笔為你收集整理的resnet结构_经典卷积网络(二)-ResNet的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 编译 php7_Linux下
- 下一篇: shell softech 面料_求高人