论文:https://arxiv.org/pdf/1911.11929.pdf
代码:https://github.com/WongKinYiu/CrossStagePartialNetworks
1 核心思想
CSPNet的核心思想有两部分,一个是将feature map分成两部分进行前向计算,一部分经过bottleneck的操作,另一部分直接传递到下一层,这样做的好处是减少了梯度的重复计算。
本文的第二创新点是提出了一个新的多尺度特征融合方法,称之为EFM。
1.1 CSPNet
CSPNet是Cross Stage Partial Network的缩写。
DenseNet:Fig. 2(a) 是DenseNet中一个stage的详细结构。
DenseNet的每个阶段都包含一个Dense Block和一个Transition层,Dense Block又是由多个Dense层组成的。第i个dense层的输出会和该层的输入concatenate之后作为下一层的输入。可以表示为:
在反向传播过程中,梯度更新可以表示成:
上式中,
f
f
f是权重更新函数,
g
i
g_i
gi表示传递到第i个dense层的梯度。个人认为这个公式写的有问题,应该是:
w
1
′
=
f
(
w
1
,
g
2
,
g
3
,
g
4
,
⋯
,
g
k
)
w
2
′
=
f
(
w
2
,
g
3
,
g
4
,
⋯
,
g
k
)
w
3
′
=
f
(
w
3
,
g
4
,
⋯
,
g
k
)
⋯
w
k
′
=
f
(
w
k
,
g
k
)
w_{1^{'}} = f(w_1,g_2,g_3,g_4,\cdots,g_k)\\ w_{2^{'}} = f(w_2,g_3,g_4,\cdots,g_k)\\ w_{3^{'}} = f(w_3,g_4,\cdots,g_k)\\ \cdots \\ w_{k^{'}} = f(w_k,g_k)
w1′=f(w1,g2,g3,g4,⋯,gk)w2′=f(w2,g3,g4,⋯,gk)w3′=f(w3,g4,⋯,gk)⋯wk′=f(wk,gk)
结论是一致的,不同的dense layer之间存在了大量的梯度复用。
CSP:
CSP的思路如Fig. 2(b)所示,CSPDenseNet由一个partial dense block和一个partial transition layer组成。也就是把该block的原始输入分为两部分
[
x
0
′
,
x
0
′
′
]
[x^{'}_0,x^{''}_0]
[x0′,x0′′],
x
0
′
x^{'}_0
x0′直接传递到block的最后,
x
0
′
′
x^{''}_0
x0′′则在dense block中按层依序传播。最后得到的输出
[
x
0
′
′
,
x
1
,
x
2
,
⋯
,
x
k
]
[x^{''}_0,x_1,x_2,\cdots,x_k]
[x0′′,x1,x2,⋯,xk],会送入一个transition layer得到输出
x
T
x_T
xT,然后将
x
0
′
x^{'}_0
x0′和
x
T
x_T
xT拼接得到
[
x
0
′
,
x
T
]
[x^{'}_0,x_T]
[x0′,xT],再经过另一个transition层得到输出
x
U
x_U
xU。计算过程可以表示成:
这样做,
x
0
′
x_0^{'}
x0′没有经过Dense block的前向计算过程,计算量有所减小。同时,反向传播时,虽然依然存在梯度复用,但是因为只有
x
0
′
′
x_0^{''}
x0′′参与了Dense block的计算过程,反向传播的梯度的数据量也有所减少。总之,CSP的思想就是把输入分成两部分,一部分直接传递到最后,一部分按照原有顺序传递到最后,最后前向计算和反向梯度传播的计算量相比不分成两部分都有所减少,因此大大减少了整个过程的计算量。CSP全称是cross stage partial,也就是指
x
0
′
x_0^{'}
x0′这一partial,跨越多个Dense layer直接传递到后面。
partial dense block:
使用partial dense block的好处有:
- double梯度传输的路径:一条路是 x 0 ′ ′ x_0^{''} x0′′流经的dense block,另一条路是 x 0 ′ x_0^{'} x0′流经的直连通道;
- 平衡每一层的计算量:dense net中base layer的channel数量远大于dense block中channel数量的增加速度,通过只让 x 0 ′ ′ x_0^{''} x0′′流经dense block这一处理方式,几乎节约了一般的计算量;
- 减少内存访问,没看到论文中的公式是如何计算的,按照作者的说法大概节约了一般的内存访问。
partial Transition layer:
partial Transition layer的目的是最大化要结合的两份梯度的差异。作者设计了三种特征融合策略,分别是CSP(fusion first)、CSP(fusion last)和CSP使用的方式。三种情况的对比如Fig. 3所示:
三种方式的对比效果如下图所示:
CSP(fusion first)方式是先将
x
0
′
x_0^{'}
x0′和
x
0
′
′
x_0^{''}
x0′′经过dense block后的输出concatenate处理,然后再经过Transition层;CSP(fusion last)方式是先将
x
0
′
′
x_0^{''}
x0′′经过dense block后的输出经过Transition层,再将Transition后的输出和
x
0
′
x_0^{'}
x0′进行concatenate处理;最终作者采用的方式是先将
x
0
′
′
x_0^{''}
x0′′经过dense block后的输出经过Transition层,再将Transition后的输出和
x
0
′
x_0^{'}
x0′进行concatenate处理,处理后的输出再经过另一个Transition层得到最终的输出。理论上不理解为什么要这么做,只是根据Fig. 4作者给出了这样做在减少计算量的同时不会损失模型的分类准确率。
1.2 EFM
EFM,Exact Fusion Model。完成多尺度的特征融合,作者对比了三种特征融合方式,如Fig. 6所示:
第一种是FPN;
第二种是GFM,直接将多个不同分辨率的特征进行融合,具体融合方式是相加。
第三中是作者提出的EFM,每相邻两层之间进行特征融合,然后在FPN的基础上再添加一个bottom-up的通道。
2 实验结果
应用CSPNet,对于分类任务,可以在减少计算量的同时略微提升模型的分类准确率;对于检测任务,则可以在减少计算量的同时大幅提升模型的检测效果。
具体消融实验可以参考原文。
ps. 不知道是我哪方面知识储备不足,始终觉得这篇论文看不太懂,欢迎大家批评指导。