1. 程式人生 > >深度學習——分類之ResNet

深度學習——分類之ResNet

https://zhuanlan.zhihu.com/p/32781577

論文: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):
    residual = x

    out = self.conv1(x)
    out = self.bn1(out)
    out = self.relu(out)

    out = self.conv2(out)  # 要降尺度的話這裡,這裡是stride 2的卷積
    out = self.bn2(out)
    out = self.relu(out)

    out = self.conv3(out)
    out = self.bn3(out)

    if self.downsample is not None:  # 需要通道升,尺度降
        residual = self.downsample(x)  # 實際上是一個stride 2卷積加bn

    out += residual
    out = self.relu(out)

    return out

網路配置

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

 

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

 

總結

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

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