改神经网络模型的方法(1)

Bag of Tricks for Image Classification with Convolutional Neural Networks(2018)》,论文中以ResNet为例提出了一些简单的微调技巧,并且取得了一定的成果。且不说准确率如何,论文中除了分析准确率有着怎样怎样的提升之外,还关注了产生了额外开销,并且通过分析、实验量化了这些开销,这是值得肯定的(比那些不考虑开销,盲目微调,通过牺牲很多速度来提高那一点点准确率的论文,不知道要高到哪里去!)

先大致归纳一下改模型的一些trick:

1)针对网络宽度与深度,如ResNeXt

2)针对残差网络的一些skip方法,还有如FCN

3)类似U-net、segnet的对称非对称连接或多尺度方法

4)多支、分组卷积设计方法,如Siamese网络

5)利用注意力机制改进

6)引入动态网络改进

7)损失函数设计

8)卷积核(动态卷积核、随机卷积)、池化操作

.......(陆续补充)


以ResNet为例

原始的ResNet模型可以参考《经典的CNN分类架构 - ResNet | Hey~YaHei!》,其核心在于应用了shortcut(原文称为skip connection)技术使得深层网络也能够被有效训练,具体细节这里就不再赘述。

resnet_a

改进1:推迟下采样

该改进方法最初是在Torch上提出的,目前这一改进也已经被广泛地应用。
首先观察原始模型的下采样模块——

resnet_downsample


其PathA依次经过
1. 1x1的卷积,完成通道的收缩,并且步长为2以实现下采样
2. 3x3的卷积,通道数量不变,主要用于提取特征
3. 1x1的卷积,完成通道的扩张


其中第一个卷积用来作为下采样,所以步长设为了1——但你仔细想想会发现,核大小1x1、步长2的卷积会造成3/4的信息丢失!以6x6的特征图为例,如下图所示,只有红色部分的信息能够传递到下一层去,非红色部分均不参与卷积计算。

conv_k1s2

由此可见,在1x1的卷积层作下采样是不明智的,更好的做法是把下面1x1下采样过程(stride=2)放到3x3的这一层卷积,如下图所示,由于卷积核宽度大于步长,卷积核在移动过程中能够遍历输入特征图上的所有信息(甚至还能有重叠):(原文stride默认为1)

conv_k3s2

下采样模块就变为——

resnet_b_downsample

改进2:拆解大核卷积

如《卷积神经网络CNN - 卷积层(Conv) | Hey~YaHei!》所述,大核卷积层可以由多层小核卷积替代实现,这不仅可以减少参数,还能加深网络深度以增加网络容量和复杂度。
Inception也早在《Rethinking the Inception Architecture for Computer Vision(2015)》一文中对Inceptionv1做出改进,分别用三个和两个3x3卷积的级联去替代7x7和5x5的卷积
这一技巧同样适用于ResNet——

resnet_c_input

改进3:用平均池化替代1x1卷积做下采样

下采样模型的PathA和PathB都需要做下采样才能正确地加和,改进1只针对PathA做了改进,其实PathB也用了1x1的卷积做下采样。为此,论文《Bag of Tricks for Image Classification with Convolutional Neural Networks(2018)》用平均池化接替了PathB中的降采样工作:

resnet_d_downsample

实验结果

model_tweak_results


其中A、B、C、D分别代表原始、改进1、改进2、改进3的模型。

经过改进之后,最终的ResNet-50-D准确率提高了0.95%。但也不得不承认,以上的改进都增加了模型的运算复杂度,FLOPs增加了约13%,但实测速度只下降了3%。

  • 7
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值