深度學習——分類之ResNet

論文:Deep Residual Learning for Image Recognition

作者:Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun

ImageNet Top5錯誤率: 3.57%

主要思想:Residual,殘差,名字就體現了,不學絕對值,而學差值。不去學絕對的完全重構映射,只學映射後相對於原來的偏差,即和identity的差值,絕對變相對,容易多了。前向,容易學習,後向,有了梯度高速通道,更好訓練,能避免梯度消失。

基本結構

網路由兩種不同的基本單元堆疊即可:

左邊是BasicBlock,ResNet18和ResNet34就由其堆疊。

右邊BottleNeck,多了一層,用1x1的卷積先降通道再升通道,ResNet50、ResNet101、ResNet152就由其堆疊。當要降維的時候,上面的第一個3x3卷積使用stride 2(同時旁邊的shortcut也需要一個1x1的stride 2卷積,而非identity,使得後面相加的時候尺寸一致),平時卷積都是stride 1。

使用1x1卷積,對稀疏信息進行壓縮,有效利用計算力,所以效率更高。

代碼實現

BottleNeck結構的具體PyTorch代碼實現代碼如下:

def forward(self, x):n residual = xnn out = self.conv1(x)n out = self.bn1(out)n out = self.relu(out)nn out = self.conv2(out) # 要降尺度的話這裡,這裡是stride 2的卷積n out = self.bn2(out)n out = self.relu(out)nn out = self.conv3(out)n out = self.bn3(out)nn if self.downsample is not None: # 需要通道升,尺度降n residual = self.downsample(x) # 實際上是一個stride 2卷積加bnnn out += residualn out = self.relu(out)nn return outn

網路配置

ResNet34的整體網路結構圖如下,虛線部分跳躍結構會通過stride 2卷積降維並提升通道數(同時shortcut也會使用stride 2卷積和conv來映射,保持尺寸一致),實線部分是identity直連:

不同層數的ResNet的配置清單:

總結

網路清晰,結構簡單,很規範,並且有不同的層數可以選擇,對於輸入大小也沒有固定的限制,適用面很廣。

最後提一下論文作者:指導論文的孫劍老師現在在曠視帶領曠視研究院,我的論文也由他指導過,非常厲害;何愷明大神去了FAIR,真的是一路開掛式的存在,讓人不由得慶幸還好和他研究方向不一樣。。。另一位作者張祥雨也在曠視,現在是同事,訓練了很多ResNet的變種以及各種基礎模型,作為base model,用起來非常方便,修改網路使用預訓練權重應用在其它方向。我個人的經驗(僅供參考,具體的任務類型和網路設置等影響很大)是ResNet50比Inception v3好,一般使用ResNet50作為base model,非常solid。

推薦閱讀:

ResNet原理及其在TF-Slim中的實現
經典模型-1:《Deep Residual Learning for Image Recognition》論文翻譯

TAG:神经网络 | 深度学习DeepLearning | ResNet |