来自于CVPR2020的一篇文章,
原文链接:https://arxiv.org/abs/1909.11378
代码发布地址: https://isrc.iscas.ac.cn/gitlab/research/acnet.(应该是暂时还没有发布,一直在留意,很期待)
论文提出了使用注意力卷积的二叉神经树进行细粒度分类,在树结构的边上进行注意力卷积操作,每个节点使用路由函数来定义从根节点到叶子结点的计算路径,结合所有叶子结点的预测值进行最终的预测。
思维导图
Model
整个的ACNet model由4部分组成,包括backbone、Branch Routing、Attention Transformer、Label Prediction。
符号定义:
定义一个pair
(
T
,
O
)
(\Bbb{T},\Bbb{O})
(T,O)。其中
T
\Bbb{T}
T代表树的拓扑,
O
\Bbb{O}
O代表沿着
T
\Bbb{T}
T边的操作集。
二叉树定义为
T
=
V
,
ε
\Bbb{T}={\mathcal{V},\mathcal{\varepsilon}}
T=V,ε,其中
V
=
v
1
.
v
2
.
.
.
.
v
n
\mathcal{V}={v_1.v_2....v_n}
V=v1.v2....vn是节点的集合,n是节点的数量。
ε
=
e
1
,
e
2
,
.
.
.
,
e
k
\mathcal{\varepsilon}={e_1,e_2,...,e_k}
ε=e1,e2,...,ek代表的是节点之间的边的集合,k是边的总数。因为使用的是完整的二叉树,所以边的总数是
n
=
2
h
−
1
,
k
=
2
h
−
2
n=2^h-1,k=2^h-2
n=2h−1,k=2h−2,
h
h
h就是
T
\Bbb{T}
T的高度啦。
Architecture
Backbone network module. 在实验中使用的是VGG-16(retaining the layers from conv1_1 to conv4_3)和ResNet-50 (retaining the layers from res_1 to res_4)
Branch routing module. 这个模块决定了将sample发送到哪个child(left or right),如Figure2(b)所示,第K层的第i个 routing module用
R
i
k
(
.
)
\mathcal{R}_i^k(.)
Rik(.)使用
1
×
1
1\times 1
1×1的卷积层进行表示,后面接一个简化的non-local(NL) block 和Squeeze-Excitation(SE)block,后者与前者在context modeling and fusion step共享相同implementation和transform step,以这种方式,集成上下文信息来更好的描述对象。之后使用average pooling、element-wise square-root and L2-normalization和一个具有sigmoid激活函数的全连接层来产生一个在【0,1】范围内的标量,来表示sample交给left child or right child的概率,
ϕ
i
k
(
x
j
)
∈
[
0
,
1
]
,
i
=
1
,
.
.
.
,
2
k
−
1
\phi_i^k(x_j)\in [0,1],i=1,...,2^{k-1}
ϕik(xj)∈[0,1],i=1,...,2k−1表示第j层的样本
x
j
∈
X
x_j\in X
xj∈X被交给right child产生routing module
R
i
k
(
x
j
)
\mathcal{R}_i^k(x_j)
Rik(xj)的输出概率,交给left child的概率就是1-
ϕ
i
k
(
x
j
)
\phi_i^k(x_j)
ϕik(xj),超过0.5就发送给对应的child。
Attention transformer. 此模块的详细结构如上图所示,将ASPP模块嵌入到Attention transformer中,它能够产生多个特征图,每个特征图的特征具有不同的比例、感受野和attention module。通过4个不同扩张率
i
.
e
.
1
,
6
,
12
,
18
i.e.1,6,12,18
i.e.1,6,12,18的parallel dilated convolutions可以产生multi-scale feature maps。融合特征图之后再传递给kernel size为
1
×
1
1\times 1
1×1,stride为1的卷积核。在ASPP之后再插入一个attention module (如上图红色部分),来指导网络专注于有意义的特征以获得准确的结果。
Label Prediction. 对于ACNet中的每一个叶子结点,使用标签预测模型
P
i
(
i
.
e
.
i
=
1
,
.
.
.
,
2
h
−
1
)
\mathcal{P_i}(i.e. i=1,...,2^{h-1})
Pi(i.e.i=1,...,2h−1)来预测对象
x
j
x_j
xj的subordinate category。
r
i
k
(
x
j
)
r_i^k(x_j)
rik(xj)是对象
x
j
x_j
xj从根节点到第k层的第i个节点的累积概率,例如,根节点到
R
i
k
(
.
)
\mathcal{R}_i^k(.)
Rik(.)的路径是
R
1
1
,
R
1
2
,
.
.
.
,
R
1
k
\mathcal{R}_1^1,\mathcal{R}_1^2,...,\mathcal{R}_1^k
R11,R12,...,R1k,那么也就是说一直选择的是left child,那么
r
i
k
(
x
j
)
=
∏
i
=
1
k
ϕ
1
i
(
x
j
)
r_i^k(x_j)=\prod_{i=1}^k \phi_1^i(x_j)
rik(xj)=∏i=1kϕ1i(xj)。这个模块的具体结构如Fig.2所示, batch normalizationlayer, a convolutional layer(kernel size 1 × 1,) a max pooling layer, a sqrt and L2 normalization layer, and a fully connected layer。那么第j个对象
x
j
x_j
xj的最终概率
C
(
x
j
)
\mathcal{C}(x_j)
C(xj)计算为所有叶子结点的累和乘以通过branch routing modules的累积概率。
C
(
x
j
)
=
∑
i
=
1
2
h
−
1
P
i
(
x
j
)
r
i
h
(
x
j
)
\mathcal{C(x_j)}=\sum_{i=1}^{2^{h-1}}\mathcal{P}_i(x_j)r_i^h(x_j)
C(xj)=∑i=12h−1Pi(xj)rih(xj)。需要注意的是
x
j
x_j
xj所有下级类别的置信度总和为1.
Training
Data augmentation. 使用裁剪和旋转来扩充数据,首先重新旋转缩放的图像,使其较短的一边为512 pixels,然后随机裁剪448
×
\times
× 448大小的patches,并随机旋转作为数据集。
Loss function. 从ACNet的结构,我们其实就可以很明显的看出它的损失函数是怎么构成的,它包括两部分,即叶子结点的预测损失和最终的预测损失。损失函数通过对叶节点的所有预测求和得出
h
h
h就是
T
\Bbb{T}
T的高度,
L
(
C
(
x
j
)
,
y
∗
)
L(C(x_j),y^*)
L(C(xj),y∗)是最终预测
C
(
x
j
)
\mathcal{C(x_j)}
C(xj)的negative logarithmic likelihood loss,
y
∗
y^*
y∗是ground truth label,
L
(
P
i
(
x
j
)
)
L(\mathcal{P}_i(x_j))
L(Pi(xj))是叶子结点的negative logarithmic likelihood loss。
Result
整个论文思路并没有很复杂,但是创新点很有意思,一直觉得传统的数据结构和神经网路找到一个好的契合点进行融合,可能会产生意想不到的火花。二叉树本身是一个比较特殊的数据结构,用它来跟神经网络进行结合,然后叶子结点的预测和最终的预测来产生联合损失,再加上Attention Module,得到很棒的效果。