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