深度学习之卷积神经网络(12)深度残差网络
深度學習之卷積神經網絡(12)深度殘差網絡
- ResNet原理
- ResBlock實現
AlexNet、VGG、GoogleLeNet等網絡模型的出現將神經網絡的法陣帶入了幾十層的階段,研究人員發現網絡的層數越深,越有可能獲得更好的泛化能力。但是當模型加深以后,網絡變得越來越難訓練,這主要是由于梯度彌散和梯度爆炸現象造成的。在較深層數的神經網絡中,梯度信息由網絡的末層傳向網絡的首層時,傳遞的過程中會出現梯度接近于0或梯度值非常大的現象。網絡層數越深,這種現象可能會越嚴重。
?那么怎么解決深層神經網絡的梯度彌散和梯度爆炸現象呢?一個很自然的想法是,既然淺層神經網絡不容易出現這些梯度現象,那么就可以嘗試給深層神經網絡添加一種 回退到淺層神經網絡的機制。當深層神經網絡可以輕松地回退到淺層神經網絡時,深層神經網絡可以獲得與淺層設立相當的模型性能,而不至于更糟糕。
?通過在輸入和輸出之間添加一條直接連接的 Skip Connection可以讓神經網絡具有回退的能力。以VGG13深度神經網絡為例,假設觀察到VGG13模型出現梯度彌散現象,而10層的網絡模型并沒有觀測到梯度彌散現象,那么可以考慮在最后的兩個卷積層添加Skip Connection,如下圖所示。通過這種方式,網絡模型可以自動選擇是否經由這兩個卷積層完成特征變換,還是直接跳過這兩個卷積層而選擇Skip Connection,亦或結合兩個卷積層和Skip Connection的輸出。
添加了Skip Connection的VGG13網絡結構
?2015年,微軟亞洲研究院何凱明等人發表了基于Skip Connection的深度殘差網絡(Residual Nerual Network,簡稱ResNet)算法[1],并提出了18層、34層、50層、101層、152層的ResNet-18、ResNet-34、ResNet-50、ResNet-101和ResNet-152等模型,甚至成功訓練出層數達到1202層的極深神經網絡。ResNet在ILSVRC2015挑戰賽ImageNet數據集上的分類、檢測等任務上面均獲得了最好性能,ResNet論文至今已經獲得超25000的引用量,可見ResNet在人工智能行業的影響力。
[1] K. He, X. Zhang, S. Ren 和 J. Sun, “Deep Residual Learning for Image Recognition,” CoRR, 卷 abs/1512.03385, 2015.
ResNet原理
?ResNet通過在卷積層的輸入和輸出之間添加Skip Connec-tion實現層數回退機制,如下圖所示,輸入x\boldsymbol xx通過兩個卷積層,得到特征變換后的輸出F(x)\mathcal F(\boldsymbol x)F(x),與輸入x\boldsymbol xx進行對應元素的相加運算,得到最終輸出H(x)\mathcal H(\boldsymbol x)H(x):
H(x)=x+F(x)\mathcal H(\boldsymbol x)=\boldsymbol x+\mathcal F(\boldsymbol x)H(x)=x+F(x)
H(x)\mathcal H(\boldsymbol x)H(x)叫做殘差模塊(Residual Block,簡稱ResBlock)。由于被Skip Connection包圍的卷積神經網絡需要學習映射F(x)=H(x)?x\mathcal F(\boldsymbol x)=\mathcal H(\boldsymbol x)-\boldsymbol xF(x)=H(x)?x,故稱為殘差網絡。
?為了能夠滿足輸入x\boldsymbol xx與卷積層的輸出F(x)\mathcal F(\boldsymbol x)F(x)能夠相加運算,需要輸入x\boldsymbol xx的shape與F(x)\mathcal F(\boldsymbol x)F(x)的shape完全一致。當出現shape不一致時,一般通過在Skip Connection上添加額外的卷積運算緩解將輸入x\boldsymbol xx變換到與F(x)\mathcal F(\boldsymbol x)F(x)相同的shape,如下圖中identity(x)\text{identity}(\boldsymbol x)identity(x)函數所示,其中identity(x)\text{identity}(\boldsymbol x)identity(x)以1×11×11×1的卷積運算居多,主要英語調整輸入的通道數。
?如下圖所示,對比了34層的深度殘差網絡、34層的普通深度網絡以及19層的VGG網絡結構。可以看到,深度殘差網絡通過堆疊殘差模塊,達到了較深的網絡層數,從而獲得了訓練穩定、性能優越的深層網絡模型。
ResBlock實現
?深度殘差網絡并沒有增加新的網絡層類型,只是通過在輸入和輸出之間添加一條Skip Connection,因此并沒有針對ResNet的底層實現。在TensorFlow中通過調用普通卷積層即可實現殘差模塊。
?首先創建一個新類,在初始階段創建殘差塊中需要的卷積層、激活函數層等,首先新建F(x)\mathcal F(\boldsymbol x)F(x)卷積層,代碼如下:
其中:
- __init__(self, filter_num, stride=1)函數為初始化函數,filter_num為卷積核的數量,stride=1表示不對輸入進行下采樣;
- strides=stride, padding='same'表示可以直接得到輸入、輸出同大小的卷積層;
- layers.BatchNormalization()表示標準化層;
?當F(x)\mathcal F(\boldsymbol x)F(x)的形狀與x\boldsymbol xx不同時,無法直接相加,我們需要新建identity(x)\text{identity}(\boldsymbol x)identity(x)卷積層,來完成x\boldsymbol xx的形狀轉換。緊跟上面代碼,實現如下:
if stride != 1:# 通過1x1卷積完成shape匹配self.downsample = Sequential()self.downsample.add(layers.Conv2D(filter_num, (1, 1), strides=stride)) else:# shape匹配,直接短接self.downsample = lambda x:x
上述代碼表示如果stride(即步長)如果不為1的話,那么輸出與輸入的shape不相同,那么此時我們就需要新建identity(x)\text{identity}(\boldsymbol x)identity(x)卷積層,來完成x\boldsymbol xx的形狀轉換,使之與輸入的shape相同。
?在向前傳播時,只需要將F(x)\mathcal F(\boldsymbol x)F(x)與identity(x)\text{identity}(\boldsymbol x)identity(x)相加,并添加ReLU激活函數即可。向前計算函數代碼如下:
總結
以上是生活随笔為你收集整理的深度学习之卷积神经网络(12)深度残差网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tensorflow-TFRecord
- 下一篇: IO多路复用模型之select()函数详