深度学习——分类之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。