ResNeSt: Split-Attention Networks

原文地址:ResNeSt: Split-Attention Networks

官方实现: zhanghang1989/ResNeSt

自定义实现: ZJCV/ZCls

摘要

1
It is well known that featuremap attention and multi-path representation are important for visual recognition. In this paper, we present a modularized architecture, which applies the channel-wise attention on different network branches to leverage their success in capturing cross-feature interactions and learning diverse representations. Our design results in a simple and unified computation block, which can be parameterized using only a few variables. Our model, named ResNeSt, outperforms EfficientNet in accuracy and latency trade-off on image classification. In addition, ResNeSt has achieved superior transfer learning results on several public benchmarks serving as the backbone, and has been adopted by the winning entries of COCO-LVIS challenge. The source code for complete system and pretrained models are publicly available.

众所周知,特征图注意和多路径表示对视觉识别很重要。在本文中,我们提出了一个模块化的体系结构,它将通道方向的注意力应用于不同的网络分支,以利用它们在捕获跨特征交互和学习不同表示方面的成功。我们的设计产生了一个简单统一的计算块,只需使用几个变量就可以将其参数化。我们的模型名为ResNeSt,在图像分类的准确性和延迟权衡方面优于EfficientNet。此外,ResNeSt在几个基准测试中取得了优异的迁移学习成绩,并被COCO-LVIS挑战赛的获奖作品所采用。完整系统和预训练模型的源代码已开源

解读

SKNet中,使用了两路分支($3\times 3、5\times 5$大小分组卷积)以提取多尺度信息,然后通过soft注意力机制缩放跨通道特征。ResNeSt首先参数化了SKUnit的实现,同时进一步发展了特征提取的细粒度实现,并不只是简单的扩充分支数,而是将输入的特征图进行分组,针对每组特征图执行多分支特征提取以及soft注意力机制进行特征重分配,最后将每组特征图串联成输出数据。简单的说,SKNet针对上一层的特征数据进行了多尺度特征提取+注意力机制,而ResNeSt先对上一层的特征数据进行分组,对每组数据单独执行多分支特征提取+注意力机制,最后通过串联的方式输出特征数据。从实验效果来看取得了更好的成绩

文章中共设计了不同视角下ResNeSt计算块的布局方式:

  1. 基于基数组(cardinal groups)视角
  2. 基于分离组(radix groups)视角

其中基数组视角遵循从外到内的思路,能够帮助理解ResNeSt计算块的实现以及和之前模型的比较;而基于分离组视角的布局遵循从内到外的思路,能够利用CNN算子实现方式,有助于实际编程实现

cardinality-major implementation

基数组视角的布局如上图所示,在ResNeSt Block实现中,首先对输入特征进行分组,然后输入到各个Split-Attention Block中进行计算,完成后将各个分组特征串联在一起。

其中$F_{i}$使用$1\times 1$卷积级联一个$3\times 3$卷积实现;注意力权重函数$g$可以参数化为双层全连接网络(使用ReLU激活函数)

详细说明如下

Split-Attention Block

论文设计了一个基本计算单元:Split-Attention Block,用于对输入特征进行不同特征提取+跨通道特征融合。可为两步操作:

  1. 特征图分组(feature-map group);
  2. 注意力分离( split attention)。

特征图分组

  • ResNeXt中,上层输入特征$R^{H\times W\times C}$基于通道维度分成了$K$组,得到的分组特征称为基数组(cardinal groups),其大小为$R^{H\times W\times C/K}$;
  • ResNeSt中,对每个基数组特征基于通道维度分成了$R$组,得到的分组特征称为分离组(radix groups),其大小为$R^{H\times W\times C/K/R}$;
  • 完整的分组数为$G=KR$,每个分组特征拥有一个基数组下标和一个分离组下标;
  • 对每个分离组特征执行各自的转换操作:${F_{1}, F_{2}, …, F_{G}}$,得到的特征表示为$U_{i}=F_{i}(X), i\in \{1, 2, …, G\}$。从图示中可知,$U_{i}\in R^{H\times W\times C/K}$

注意力分离

单个基数组中各个分离组的多分支特征提取+soft注意力重分配的实现如下图所示:

  • 对同一基数组中的不同分离组进行逐元素加法,以获取跨通道信息,第$k$个基数组计算后的特征表示为$\hat{U}^{k}=\sum_{j=R(k-1)+1}^{Rk}$,其中$\hat{U}^{k}\in R^{H\times W\times C/K},k\in 1, 2, .., K$,$H/W/C$分别表示输出特征图的长/宽/深度
  • 通过全局平均池化方式获取全局上下文信息,输出大小为$s^{k}\in R^{C/K}$,第$c$个通道的计算公式如下:
  • 第$k$个基数组第$c$个通道的计算如下:
  • $V_{c}^{k}\in R^{H\times W}$表示第$k$个基数组的第$c$个通道
  • $U_{R(k-1)+i}\in R^{H\times W\times C/K}$表示第$k$个基数组中的第$i$个分离组
  • $a_{i}^{k}(c)\in R^{C/K}$表示第$k$个基数组中第$i$个分离组对应的第$c$个通道的分配权重,其计算如下:
  • $g_{i}^{c}(s^{k})$是一个权重函数,其输入$s^{k}\in R^{C/K}$,$i$表示当前分离组下标,$c$表示权重向量的长度

ResNeSt Block

Split-Attention Block输入特征图大小为$V\in R^{H\times W\times C}$,进行$K$个基数分组后每个分组大小$V^{k}\in R^{H\times W\times C/K}$,完成每个基数组的分离注意力操作后进行串联得到最后的输出$V=Concat\{V^{1}, V^{2}, …, V^{K}\}$

完成串联后,执行残差连接:

  • $Y=V+X$:如果输入输出特征图大小一致;
  • $Y=V + T(X)$:对输入特征图执行下采样操作(卷积操作或者卷积+池化操作)

SENet vs. SKNet vs. ResNeSt

ResNeSt统一了SENetSKNet的架构实现:

  1. radix=1时,Split-Attention Block退化为对每个基数组执行Squeeze-And-Excitation操作;
  2. radix=2时,Split Attention Block在各个基数组中执行了一个类似SKUnit的多分支特征提取+soft注意力

radix-major implementation

为了更易于编码实现,文章在附录中给出了分离组视角(radix-major view),如下图所示

  • 输入特征图首先分离为$RK$个分组数据,每个分组数据拥有一个基数组下标和一个分离组下标;
  • 将相同分离组下标的分组数据排列在一起并执行串联操作;然后不同分离组下标的分组数据进行求和操作,这相当于同一基数组中各个分离组数据的求和,从而完成同一基数组中全局上下文的信息融合
  • 对求和后的串联数据执行全局池化操作,这相当于执行跨通道的信息融合;
  • 在池化层之后使用两个全连接层(分组数为$K$)对各个基数组数据执行注意力权重预测;
  • 最后使用softmax函数计算各个基数组不同分离组中各个通道的权重分配

tricks

平均下采样

ResNet Bottleneck实现中:

  1. 最开始在第一个$1\times 1$卷积上执行下采样操作;
  2. 之后优化为在中间$3\times 3$卷积上执行下采样操作;
  3. ResNeSt中,通过在$3\times 3$卷积之前或者之后执行平均池化操作来实现下采样操作。

ResNet-D

使用ResNet-D代替ResNet作为ResNeSt的基础模型,其改变有:

  1. 使用3个$3\times 3$卷积替代stem层的$7\times 7$卷积;
  2. 对于一致性连接,如果需要执行下采样,那么在$1\times 1$卷积之前执行$2\times 2$平均池化

训练策略

  • GPU个数:64(共8台服务器)
  • 学习率调度策略:warm up(前5轮)+cosine schedule
  • 初始学习率:$η =\frac {B}{256} η_{base}$,其中$B$表示批量大小,$η_{base}=0.1$表示基础学习率
  • zero_init_residual_block:设置每个block最后一个$BN$的超参数$γ =0$
  • 损失函数:标签平滑损失函数
  • 数据增强:自动数据增强策略+随机大小裁剪++随机水平翻转+颜色抖动+亮度改变
  • 训练加速:mixup
  • 裁剪大小:EfficientNet证明了越深越宽的网络需要增加输入图像大小,所以
    • 对于ResNet变体,执行224大小裁剪;
    • 对于其他网络,执行256大小裁剪。
  • 正则化:
    • 在最后一个全连接层之前执行$p=0.2$的随机失活
    • 仅对对于卷积层以及全连接层权重执行权重衰减
  • 权重初始化:Kaiming初始化
  • 权重衰减:1e-4
  • 动量大小:0.9

测试策略

  • 首先将图像缩放到裁剪大小的1/0.875
  • 执行中央裁剪

分类测试

  • $s$表示radix
  • $x$表示cardinality
  • $d$表示网络宽度($0s$表示标准残差块)

相关链接

坚持原创技术分享,您的支持将鼓励我继续创作!