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

猜你喜欢

转载自blog.csdn.net/gaotihong/article/details/83861894