ResNeSt: Split-Attention Networks
原文地址:ResNeSt: Split-Attention Networks
自定义实现:ZJCV/ZCls
摘要
1 | It is well known that featuremap attention and multi-path representation are important for visual |
众所周知,特征图注意和多路径表示对视觉识别很重要。在本文中,我们提出了一个模块化的体系结构,它将通道方向的注意力应用于不同的网络分支,以利用它们在捕获跨特征交互和学习不同表示方面的成功。我们的设计产生了一个简单统一的计算块,只需使用几个变量就可以将其参数化。我们的模型名为ResNeSt,在图像分类的准确性和延迟权衡方面优于EfficientNet。此外,ResNeSt在几个基准测试中取得了优异的迁移学习成绩,并被COCO-LVIS挑战赛的获奖作品所采用。完整系统和预训练模型的源代码已开源
解读
在SKNet
中,使用了两路分支(\(3\times 3、5\times 5\)大小分组卷积)以提取多尺度信息,然后通过soft
注意力机制缩放跨通道特征。ResNeSt
首先参数化了SKUnit
的实现,同时进一步发展了特征提取的细粒度实现,并不只是简单的扩充分支数,而是将输入的特征图进行分组,针对每组特征图执行多分支特征提取以及soft
注意力机制进行特征重分配,最后将每组特征图串联成输出数据。简单的说,SKNet
针对上一层的特征数据进行了多尺度特征提取+注意力机制,而ResNeSt
先对上一层的特征数据进行分组,对每组数据单独执行多分支特征提取+注意力机制,最后通过串联的方式输出特征数据。从实验效果来看取得了更好的成绩
文章中共设计了不同视角下ResNeSt
计算块的布局方式:
- 基于基数组(
cardinal groups
)视角 - 基于分离组(
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
,用于对输入特征进行不同特征提取+跨通道特征融合。可为两步操作:
- 特征图分组(
feature-map group
); - 注意力分离(
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\)个通道的计算公式如下:
\[ s_{c}^{k}=\frac{1}{H\times W}\sum_{i=1}^{H}\sum_{j=1}^{W}\hat{U}_{c}^{k}(i, j) \]
- 第\(k\)个基数组第\(c\)个通道的计算如下:
\[ V_{c}^{k} = \sum_{i=1}^{R}a_{i}^{k}(c)U_{R(k-1)+i} \]
- \(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\)个通道的分配权重,其计算如下:
\[ a_{i}^{k}(c) = \left\{\begin{matrix} \frac{exp(g_{i}^{c}(s^{k}))}{\sum_{j=0}^{R}exp(g_{j}^{c}(s^{k}))} & if R > 1 \\ \frac{1}{1+exp(-g_{i}^{c}(s^{k}))} & if R =1 \end{matrix}\right. \]
- \(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
统一了SENet
和SKNet
的架构实现:
- 当
radix=1
时,Split-Attention Block
退化为对每个基数组执行Squeeze-And-Excitation
操作; - 当
radix=2
时,Split Attention Block
在各个基数组中执行了一个类似SKUnit
的多分支特征提取+soft
注意力
radix-major implementation
为了更易于编码实现,文章在附录中给出了分离组视角(radix-major view
),如下图所示
- 输入特征图首先分离为\(RK\)个分组数据,每个分组数据拥有一个基数组下标和一个分离组下标;
- 将相同分离组下标的分组数据排列在一起并执行串联操作;然后不同分离组下标的分组数据进行求和操作,这相当于同一基数组中各个分离组数据的求和,从而完成同一基数组中全局上下文的信息融合
- 对求和后的串联数据执行全局池化操作,这相当于执行跨通道的信息融合;
- 在池化层之后使用两个全连接层(分组数为\(K\))对各个基数组数据执行注意力权重预测;
- 最后使用
softmax
函数计算各个基数组不同分离组中各个通道的权重分配
tricks
平均下采样
在ResNet Bottleneck
实现中:
- 最开始在第一个\(1\times 1\)卷积上执行下采样操作;
- 之后优化为在中间\(3\times 3\)卷积上执行下采样操作;
- 在
ResNeSt
中,通过在\(3\times 3\)卷积之前或者之后执行平均池化操作来实现下采样操作。
ResNet-D
使用ResNet-D
代替ResNet
作为ResNeSt
的基础模型,其改变有:
- 使用3个\(3\times 3\)卷积替代stem层的\(7\times 7\)卷积;
- 对于一致性连接,如果需要执行下采样,那么在\(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\)表示标准残差块)