前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【CV中的注意力机制】史上最强"ResNet"变体--ResNeSt

【CV中的注意力机制】史上最强"ResNet"变体--ResNeSt

作者头像
深度学习技术前沿公众号博主
发布2020-05-25 15:37:39
3.2K0
发布2020-05-25 15:37:39
举报

【前言】:我们前面已经详细介绍了Attention机制和视觉注意力机制在图像分类结构中的应用--SENet基于SENet的改进版--SKNet。本篇我们将来介绍另一篇SENet的改进版,与此同时,它也针对ResNet网络结构的变体,号称史上最强“ResNet”--它就是ResNeSt。

ResNeSt:Split-Attention Networks

  • 论文地址:https://hangzhang.org/files/resnest.pdf
  • 代码地址:https://github.com/zhanghang1989/ResNeSt

ResNeSt 的全称是:Split-Attention Networks,也就是特别引入了Split-Attention模块。ResNeSt中的S 应该就是 Split。

ResNeSt 实际上是站在巨人们上的"集大成者",特别借鉴了:Multi-path Feature-map Attention思想主要是基于 SENet,SKNet 和 ResNeXt,把 attention 做到 group level

其中:

  • GoogleNet 采用了Multi-path机制,其中每个网络块均由不同的卷积kernels组成。
  • ResNeXt在ResNet bottle模块中采用组卷积,将multi-path结构转换为统一操作。
  • SE-Net 通过自适应地重新校准通道特征响应来引入通道注意力(channel-attention)机制
  • SK-Net通过两个网络分支引入特征图注意力(feature-map attention)。
  • ResNeSt将通道维度的注意力机制扩展到特征图组表示,可以使用统一的CNN操作符进行模块化和加速

ResNeSt 和 SE-Net、SK-Net 的对应图示如下:

Split-Attention 网络 1 Split-Attention 块

Split-Attention 块是一个由特征图组和 split attention 运算组成的计算单元,下图展示了 Split-Attention 块的整体思路:

2

特征图组(Feature-map Group)

与 ResNeXt 块一样,输入的特征图可以根据通道维数被分为几组,特征图组的数量由一个基数超参数 K 给出,得到的特征图组被称为基数组(cardinal group)。研究者引入了一个新的底数超参数 R,该参数规定了基数组的 split 数量。

然后将块输入 X 根据通道维数 X = {X1, X2, ...XG} 分为 G = KR 个组。在每个单独的组中应用不同的变换 {F_1, F_2, ...F_G},则每个组的中间表征为 Ui = Fi(Xi), i ∈ {1, 2, ...G}。

3

基数组中的 Split Attention

根据 [30,38],每个基数组的组合表征可以通过跨多个 split 的元素求和融合来获得。第 k 个基数组的表征为:

,k ∈ 1, 2, ...K。带有嵌入 channel-wise 统计数据的全局上下文信息可以通过全局池化来获得。第 c 个分量的计算公式为:

基数组表征 V^k ∈ R^{H×W×C/K} 的加权融合通过使用 channel-wise 软注意力来聚合。其中,每个特征图通道都是在若干 split 上使用一个加权组合获得的。第 c 个通道的计算公式如下:

4

Split-Attention模块的细节:

对上图的详细解释如下:忽略batch size,并假设C能被K*R整除。模块的输入feature map的shape是[C, H, W],采用group conv的思想,将input沿着channel维度split K个,这K个tensor的集合我们称之为一个group。更进一步,将该group中的每个tensor沿着channel维继续split R个,这R个tensor组成一个subgroup,这样总共有K个subgroup,每个subgroup的大小是R。考虑每个subgroup,其由R个tensor组成,记为U。

1. 先将这R个tensor沿着channel纬相加,然后作global average pooling,得到一个d = C / K / R大小的向量

2. 以该向量作为输入,后接入多层非线性变换,最终输出向量长度必须等于C / K,如此K个subgroup就会产生总长为C的attention权重

3. 每个subgroup中的tensor,channel维等于C / K / R,乘以上步输出的逐channel权重

关于attention权重:

1. R > 1时,每个subgroup中超过1个tensor,不妨设为x、y列向量,权重就是a、b,a * x + b * y,其中a、b都是列向量,同一行的两个scalar之和为1,因此在上面第2步最终输出attention之前用的是softmax;

2. R = 1时,就是SE,上面第2步的最终输出之前用sigmoid,然后a * x

关于实现:

在实际实现中,由于打包成一个模块,因此输入C,输出D,其他参数比如radix不影响D,也就是conv的output channel就是D * radix。另外,由于最终还要concatenate,下面举例解释,假设group以及subgroup的size都是2,tensor就是x、y、v、w,attention weight是a、b、c、d,都假设是1D列向量

1. 原始op

分别a * x + b * y,c * v + d * w,得到两个列向量,然后列方向concatenate,也就是,

2. 向量化实现的op

先将x、v,y、w分别concatenate,同样a、c,b、d也分别concatenate,加权和,因此上述原始op的结果,进行如下等价转换,

这也是开源代码中的实现方式。

5

实验结果

ResNeSt 在ImageNet 图像分类性能如下,轻松超越SKNet、SENet、ResNetXt和ResNet。

ResNeSt 和其他SoTA的CNN模型进行性能比较(特别是NAS阵营)

ResNeSt 在MS-COCO 目标检测和实例分割任务上的表现性能如下,涨点太恐怖!

ResNeSt 在ADE20K 语义分割任务上的表现性能如下:

参考链接

  1. https://zhuanlan.zhihu.com/p/133496926
  2. https://zhuanlan.zhihu.com/p/135220104
  3. https://zhuanlan.zhihu.com/p/133197521
  4. https://zhuanlan.zhihu.com/p/132655457
  5. https://zhuanlan.zhihu.com/p/134135389
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 深度学习技术前沿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ResNeSt:Split-Attention Networks
  • Split-Attention 网络 1 Split-Attention 块
  • 关于attention权重:
  • 关于实现:
  • 参考链接
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档