DNN網(wǎng)絡結(jié)構(gòu)(一)

前言

之前看的DNN的網(wǎng)絡結(jié)構(gòu)都忘干凈了,準備重新看看具體結(jié)構(gòu),再加上實現(xiàn),還得學學pytorch。。

所以以下是對網(wǎng)絡結(jié)構(gòu)的思想、具體結(jié)構(gòu)、實現(xiàn)細節(jié)的簡述,備用隨時回看。

內(nèi)容包括:

  • ResNet
  • ResNet 變種

ResNet [1]

ResNet 提出的殘差結(jié)構(gòu),最大的好處是可以學習恒等映射,并且保證了梯度的傳播,避免了深層網(wǎng)絡訓練時的梯度消失問題,使得訓練超深網(wǎng)絡成為可能,實驗中ResNet可以訓練 1001 層。

ResNet Residual Block 的函數(shù)

ResNet 的 motivation 是使得 Residual Block 的網(wǎng)絡學習殘差函數(shù)(和傳統(tǒng)的網(wǎng)絡直接學習輸入輸出的映射區(qū)別):

{ \begin{aligned} F(x) &= H(x) - x \\ H(x) &= F(x) + x \\ \end{aligned} }

一個 Residual Block 的 {H(x)} 由 輸入{x} 和 學習的殘差函數(shù){F(x)}構(gòu)成,進一步可以將一個 Residual Block 的函數(shù)表示成:

{ \mathbf{y} = \mathcal{F}(\mathbf{x},\{W_i\}) + \mathbf{x}. }

如果 {\mathcal{F(x)}}的輸出大小和{\mathbf{x}}不一致,則可以使用一個線性變換矩陣(實際中就是1x1的卷積層)對{\mathbf{x}}進行變換,如下:

{ \mathbf{y} = \mathcal{F}(\mathbf{x},\{W_i\}) + W_s \mathbf{x}. }

注意的是:如果 {\mathcal{F(x)}}僅由一層FC層組成,那就可以整合成一個線性變換矩陣,所以盡量使用兩層以上( Basic Block 兩層,BottleNeck 三層)。

ResNet 架構(gòu)

從VGG的經(jīng)驗中遵循的兩個設計要點:

  • 盡量使用 3x3 的卷積核
  • 當圖片的大小減半時,成倍增加 channel 大?。ū3滞瑯拥挠嬎懔浚?。

ResNet 在線性層上的改變:

  • VGG、AlexNet 擁有兩個超大的 FC 層,ResNet 使用 AvgPooling + 一個 FC 層 + softmax 用于分類。
  • 每一個 ConvBlock 由 ( Conv + BN + 激活 )組成(除了部分地方)。

ResNet的 Basic Block 和 BottleNeck 結(jié)構(gòu)如下圖(BottleNeck 用于更深的網(wǎng)絡,ResNet-50以上):

Basic Block (左圖) 和 BootleNeck (右圖)

BasicBlock:

  1. 基本情況下(輸入輸出的通道數(shù)不變,大小也不變):卷積層參數(shù)是 (3,1,1) ,所以 shortcut 部分直接是恒等映射就行,不需要1x1的卷積。
  2. 在需要變換大小、維度的情況下(同時是多個串聯(lián)的ResBlock的第一個Block):由第一個3x3卷積層變換通道和大小,第二個卷積層始終不變。而且 shortcut 部分需要加入1x1的卷積層保證輸出大小和殘差部分一致。此時 1x1 的卷積層的stride 設置的和 第一個 3x3 卷積層一致。若要使得輸入的大小減半,三個卷積層的參數(shù)可以設置為:(3,2,1); (3,1,1); (1,2,0)。
  3. 注意:第二個3x3卷積層不包括 ReLU,而是在相加之后再激活。

BottleNeck:

  1. 稍微改變了結(jié)構(gòu),殘差部分使用三個卷積層,兩個1x1的卷積層分別用于減小和恢復通道數(shù),而中間的3x3的卷積層才用于卷積。(一般通道數(shù)減小到原來的1/4)。
  2. shortcut 部分和Basic Block 設置的一致。

ResNet 參數(shù)設置:

不同層數(shù)ResNet配置

注意到Basic Block和BottleNeck 的relu 都是在 x + F(x) 之后的,針對這一點,提出了另外一篇論文[2]改進了殘差結(jié)構(gòu)。

ResNet2 [2]

針對 ResNet 中 ResBlock 的結(jié)構(gòu),文章[2] 進行了更多的探索,主要的結(jié)論有:

  • 實驗說明了最佳的殘差連接就是恒等映射,1x1卷積、scale、門控單元等連接方式都有各自的問題,或者效果更差。(此處不詳述)
  • propose pre-activation 結(jié)構(gòu),實驗和理論驗證了結(jié)論。
pre-activation
不同連接結(jié)構(gòu)

一點總結(jié):

  • 保證有一條 clean path 給梯度流通比較好,(a)(b) 就不符合。
  • 殘差部分學習到的殘差輸出的區(qū)間應該是 {\left[ - \infty, \infty \right]},所以殘差最后不要加ReLU(殘差輸出就變成{\left[0, +\infty \right]}了)。(c) 就不符合。
  • full pre-activation 的模型實驗效果比baseline好,作者認為(d)的結(jié)構(gòu)僅將 ReLU 前置,不能享受BN的益處,所以 propose (e) 結(jié)構(gòu)。

ResNet 變種 [3][4]


列一下(還沒看簡述下):

  • ResNeXt [3]: inception 結(jié)構(gòu)加上殘差連接。
  • SE-ResNet [4]:為了利用不同通道的信息,學習不同通道的重要性,加入通道的shortcut,得到不同通道的重要性權(quán)重。
  • SE-ResNeXt:以上兩種的融合模型。。
SE-ResNet Module

Codes and more material


torchvision 中 ResNet 的實現(xiàn)僅使用了[1] 中的結(jié)構(gòu),源碼如下:https://github.com/pytorch/vision/blob/master/torchvision/models/resnet.py

自實現(xiàn)代碼(包含pre-activation版本)實現(xiàn)在: https://gist.github.com/MercuriXito/a0ca5eb1794c28ad181712bc5def4ed3

More consideration of ResNet structure: http://torch.ch/blog/2016/02/04/resnets.html

Reference


  1. Deep Residual Learning for Image Recognition.
  2. Identity Mappings in Deep Residual Networks.
  3. Aggregated Residual Transformations for Deep Neural Networks.
  4. Squeeze and Excitation Networks。

后言

文章是為了方便自己理解而寫,所以難免有不清楚或錯誤之處、或者自創(chuàng)的方便理解的術(shù)語,如有錯誤,歡迎指正。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容