前言
之前看的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ū)別):
一個 Residual Block 的 由 輸入
和 學習的殘差函數(shù)
構(gòu)成,進一步可以將一個 Residual Block 的函數(shù)表示成:
如果 的輸出大小和
不一致,則可以使用一個線性變換矩陣(實際中就是1x1的卷積層)對
進行變換,如下:
注意的是:如果 僅由一層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以上):

BasicBlock:
- 基本情況下(輸入輸出的通道數(shù)不變,大小也不變):卷積層參數(shù)是 (3,1,1) ,所以 shortcut 部分直接是恒等映射就行,不需要1x1的卷積。
- 在需要變換大小、維度的情況下(同時是多個串聯(lián)的ResBlock的第一個Block):由第一個3x3卷積層變換通道和大小,第二個卷積層始終不變。而且 shortcut 部分需要加入1x1的卷積層保證輸出大小和殘差部分一致。此時 1x1 的卷積層的stride 設置的和 第一個 3x3 卷積層一致。若要使得輸入的大小減半,三個卷積層的參數(shù)可以設置為:(3,2,1); (3,1,1); (1,2,0)。
- 注意:第二個3x3卷積層不包括 ReLU,而是在相加之后再激活。
BottleNeck:
- 稍微改變了結(jié)構(gòu),殘差部分使用三個卷積層,兩個1x1的卷積層分別用于減小和恢復通道數(shù),而中間的3x3的卷積層才用于卷積。(一般通道數(shù)減小到原來的1/4)。
- shortcut 部分和Basic Block 設置的一致。
ResNet 參數(shù)設置:

注意到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é):
- 保證有一條 clean path 給梯度流通比較好,(a)(b) 就不符合。
-
殘差部分學習到的殘差輸出的區(qū)間應該是
,所以殘差最后不要加ReLU(殘差輸出就變成
了)。(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:以上兩種的融合模型。。

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
- Deep Residual Learning for Image Recognition.
- Identity Mappings in Deep Residual Networks.
- Aggregated Residual Transformations for Deep Neural Networks.
- Squeeze and Excitation Networks。
后言
文章是為了方便自己理解而寫,所以難免有不清楚或錯誤之處、或者自創(chuàng)的方便理解的術(shù)語,如有錯誤,歡迎指正。