深度學習——分類之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。