CSPNet: A New Backbone that can Enhance Learning Capability of CNN (CSP模块)

发布于:2025-07-10 ⋅ 阅读:(23) ⋅ 点赞:(0)

3. Method 方法

3.1 Cross Stage Partial Network 跨阶段局部网络

3.1.1 Cross Stage Partial Network 跨阶段局部网络
3.1.1.1 ResNet 和 DenseNet 的优缺点

  主流的卷积神经网络(CNN)架构,如ResNet [8]、ResNeXt [37]、DenseNet [11],其输出通常是中间层输出的线性或非线性组合。因此,一个k层CNN的输出可以表示为:
y=F(x0)=xk=Hk(xk−1,Hk−1(xk−2,Hk−2(xk−3,…,H1(x0),x0)(1) \begin{aligned} y &= F(x_0) = x_k \\& = H_k(x_{k - 1}, H_{k - 1}(x_{k - 2}, H_{k - 2}(x_{k - 3}, \ldots, H_1(x_0), x_0) \tag{1} \end{aligned} y=F(x0)=xk=Hk(xk1,Hk1(xk2,Hk2(xk3,,H1(x0),x0)(1)
  其中,FFF是从输入x0x_0x0到目标yyy的映射函数,它也是整个CNN的模型。对于HkH_kHk,它是CNNkkk层的操作函数。通常,它由一组卷积层一个非线性激活函数组成。如果我们以ResNet和DenseNet为例,它们可以分别用公式2和公式3表示:
xk=Rk(xk−1)+xk−1=Rk(xk−1)+Rk−1(xk−2)+…+R1(x0)+x0(2) \begin{aligned} x_k &= R_k(x_{k - 1}) + x_{k - 1} \\&= R_k(x_{k - 1}) + R_{k - 1}(x_{k - 2}) + \ldots + R_1(x_0) + x_0 \tag{2} \end{aligned} xk=Rk(xk1)+xk1=Rk(xk1)+Rk1(xk2)++R1(x0)+x0(2)
xk=[Dk(xk−1),xk−1]=[Dk(xk−1),Dk−1(xk−2),…,D1(x0),x0](3) \begin{aligned} x_k &= [D_k(x_{k - 1}), x_{k - 1}] \\&= [D_k(x_{k - 1}), D_{k - 1}(x_{k - 2}), \ldots, D_1(x_0), x_0]\tag{3} \end{aligned} xk=[Dk(xk1),xk1]=[Dk(xk1),Dk1(xk2),,D1(x0),x0](3)
  在以上两个公式中,RRRDDD分别代表残差层密集层的计算操作,这些操作通常由2 - 3个卷积层组成。
  从以上两个公式可以看出,无论是残差层还是密集层,构成它们的每个卷积层的输入都会接收所有之前层的输出
①为什么可以梯度路径最小化:本来梯度要从k层传递到给1层,要层层传递,k先给k-1,k-1再给k-2等等,现在梯度可以直接 “跳过” 中间层
  在这种情况下,梯度路径的长度可以最小化,从而使反向传播过程中的梯度流动更加高效。
②解决了梯度消失问题,但是为什么导致重复学习冗余信息:前面很多层的特征有重叠、冗余、反复用相似梯度去更新,会使网络学习重复、没必要的信息、增加计算量
  然而,我们也知道,这种架构设计会让第kkk层将梯度传递到所有k−1,k−2,…,1k - 1, k - 2, \ldots,1k1,k2,,1层,并利用这些梯度来更新权重,这将导致重复学习冗余信息

3.1.1.2 改进版

  最近,一些研究尝试使用经过筛选的HkH_kHk的输入 来提高学习能力和参数利用率。
  ①例如,SparseNet [44] 使用指数间隔连接,使HkH_kHk直接与Hk−1,Hk−2,Hk−4,…,H2n,…H_{k - 1}, H_{k - 2}, H_{k - 4}, \ldots, H_{2^n}, \ldotsHk1,Hk2,Hk4,,H2n,相关联。
  ②ShuffleNetV2 [2]使用分裂通道使Hk仅与Hk−1通道的一半直接相关,并且它的等式可以表示为S([Hk(xk−1[1:c/2]),xk−1(c/2+1:c])])S([H_k(x_{k - 1}[1:c/2]), x_{k - 1}(c/2 + 1:c])])S([Hk(xk1[1:c/2]),xk1(c/2+1:c])]),其中SSS表示混洗操作xk−1[1:c/2]x_{k - 1}[1:c/2]xk1[1:c/2]表示xk−1x_{k - 1}xk1的第一个到c/2c/2c/2个通道。
  ③对于PyramidNet [7] 和PRN [33],它们都使用不同数量的通道来构建ResNet,以实现梯度分流的效果。

3.1.1.2 本文提出的CSP

  当前最先进的方法着重于优化每个层的HiH_iHi函数,而我们提出CSPNet直接优化FFF函数,优化方式如下:
y=M([x0′,T(F(x0′′))])(4) y = M([x_0', T(F(x_0''))]) \tag{4} y=M([x0,T(F(x0′′))])(4)
  其中,x0x_0x0沿通道维度被分成两部分,表示为x0=[x0′,x0′′]x_0 = [x_0', x_0'']x0=[x0,x0′′]
T用于截断,M用于混合
  TTT 是过渡函数,用于截断H1,H2,…,HkH_1, H_2, \ldots, H_kH1,H2,,Hk 的梯度流,MMM 是过渡函数,用于混合这两个分割部分。
  接下来,我们将展示如何将CSPNet整合到DenseNet中,并解释如何解决CNN中重复学习信息的问题。
在这里插入图片描述

3.1.2 DenseNet 密集网络

  图2(a)展示了黄等人提出的DenseNet的一级详细结构 。
  DenseNet的每一级都包含一个密集块一个过渡层,每个密集块由kkk个密集层组成,第iii个密集层的输出会与第iii个密集层的输入进行拼接,拼接后的结果将作为第(i+1)(i + 1)(i+1)个密集层的输入。

3.1.2.1 正向

  上述机制可用以下等式表示:
x1=w1∗x0x2=w2∗[x0,x1]⋮xk=wk∗[x0,x1,…,xk−1](5) \begin{align*} x_1&=w_1 * x_0\\ x_2&=w_2 * [x_0, x_1]\\ &\vdots\\ x_k&=w_k * [x_0, x_1, \ldots, x_{k - 1}] \end{align*}\tag{5} x1x2xk=w1x0=w2[x0,x1]=wk[x0,x1,,xk1](5)
  其中∗*表示卷积操作符,[x0,x1,…][x_0, x_1, \ldots][x0,x1,]表示对x0,x1,…x_0, x_1, \ldotsx0,x1,进行拼接wiw_iwixix_ixi分别是第iii个密集层的权重输出

3.1.2.2 反向梯度传播

  如果使用反向传播来更新权重,权重更新的等式可写为:
w1′=f1(w1,g1)w2′=f2(w2,[g0,g1])⋮wk′=fk(wk,[g0,g1,…,gk−1])(6) \begin{align*} w_1'&=f_1(w_1, g_1)\\ w_2'&=f_2(w_2, [g_0, g_1])\\ &\vdots\\ w_k'&=f_k(w_k, [g_0, g_1, \ldots, g_{k - 1}]) \end{align*}\tag{6} w1w2wk=f1(w1,g1)=f2(w2,[g0,g1])=fk(wk,[g0,g1,,gk1])(6)
  其中fif_ifi是第iii个密集层的权重更新函数,gig_igi表示传播到第iii个密集层的梯度。我们可以发现,大量的梯度信息被重复用于更新不同密集层的权重。这将导致不同的密集层反复学习复制的梯度信息。

3.1.3 Cross Stage Partial DenseNet 跨阶段局部密集网络

  所提出的CSPDenseNet的单阶段架构如图2(b)所示。
  CSPDenseNet的一个阶段由一个局部密集块一个局部过渡层组成。

3.1.3.1 局部密集块

  在局部密集块中,一个阶段的基础层特征图通过通道划分为两部分,即x0=[x0′,x0′′]x_0 = [x_0', x_0'']x0=[x0,x0′′]。在x0′x_0'x0x0′′x_0''x0′′之间,前者直接连接到阶段末尾后者将经过一个密集块

3.1.3.2 局部过渡层

  局部过渡层涉及的所有步骤如下:首先,密集层的输出[x0′′,x1,…,xk][x_0'', x_1, \ldots, x_k][x0′′,x1,,xk]将经过一个过渡层。其次,该过渡层的输出xTx_TxT将与x0′x_0'x0 拼接,并经过另一个过渡层,然后生成输出xUx_UxU

3.1.3.3 前向传播和梯度更新

  CSPDenseNet前向传播和权重更新的等式如公式7和公式8所示:
xk=wk∗[x0′′,x1,…,xk−1]xT=wT∗[x0′′,x1,…,xk]xU=wU∗[x0′,xT](7) \begin{align*} x_k &= w_k * [x_0'', x_1, \ldots, x_{k - 1}] \\ x_T &= w_T * [x_0'', x_1, \ldots, x_k] \\ x_U &= w_U * [x_0', x_T] \end{align*}\tag{7} xkxTxU=wk[x0′′,x1,,xk1]=wT[x0′′,x1,,xk]=wU[x0,xT](7)
wk′=fk(wk,{g0′′,g1,…,gk−1})wT′=fT(wT,{g0′′,g1,…,gk})wU′=fU(wU,{g0′,gT})(8) \begin{align*} w_k' &= f_k(w_k, \{g_0'', g_1, \ldots, g_{k - 1}\}) \\ w_T' &= f_T(w_T, \{g_0'', g_1, \ldots, g_k\}) \\ w_U' &= f_U(w_U, \{g_0', g_T\}) \end{align*}\tag{8} wkwTwU=fk(wk,{g0′′,g1,,gk1})=fT(wT,{g0′′,g1,,gk})=fU(wU,{g0,gT})(8)
  可以看到,来自密集层的梯度被单独整合。另一方面,未经过密集层的特征图x0′x_0'x0 也被单独整合。用于更新权重的梯度信息两侧均不包含属于另一侧的重复梯度信息。
  总体而言,所提出的CSPDenseNet保留了DenseNet特征复用特性的优势,同时通过截断梯度流防止了过多的重复梯度信息。这一思想通过设计分层特征融合策略实现,并在局部过渡层中应用。

3.1.4 Partial Dense Block 局部密集块

  设计局部密集块的优势如下:

  1. 增加梯度路径:通过分割与合并策略,梯度路径的数量可翻倍。由于采用了跨阶段策略,能够缓解因使用显式特征图复制进行拼接而产生的弊端。
  2. 平衡各层计算量:通常,DenseNet中基础层的通道数远大于增长率。在局部密集块中,参与密集层操作的基础层通道数仅为原始数量的一半,因此可有效解决近一半的计算瓶颈问题。
  3. 减少内存流量:假设DenseNet中一个密集块的基础特征图尺寸为w×h×cw \times h \times cw×h×c,增长率为ddd,且共有mmm个密集层。那么,该密集块的内存流量(CIO)为(c×m)+((m2+m)×d)/2(c \times m) + ((m^2 + m) \times d)/2(c×m)+((m2+m)×d)/2,而局部密集块的内存流量为((c×m)+(m2+m)×d)/2((c \times m) + (m^2 + m) \times d)/2((c×m)+(m2+m)×d)/2。由于mmmddd通常远小于ccc,局部密集块最多能够节省网络一半的内存流量 。
3.1.5 Partial Transition Layer 局部过渡层

  设计局部过渡层的目的是最大化梯度组合的差异。局部过渡层是一种分层特征融合机制,它采用截断梯度流的策略,防止不同层学习重复的梯度信息。
  在此,我们设计了两种CSPDenseNet的变体,以展示这种梯度流截断对网络学习能力的影响。图3(c)和图3(d)展示了两种不同的融合策略。CSP(先融合)指的是将两部分生成的特征图拼接,然后执行过渡操作。若采用该策略,大量梯度信息会被重复利用。对于CSP(后融合)策略,密集块的输出会先经过过渡层,然后再与来自第一部分的特征图进行拼接。若采用CSP(后融合)策略,由于梯度流被截断,梯度信息不会被重复利用。若使用图3所示的四种架构进行图像分类,相应结果如图4所示。可以看出,若采用CSP(后融合)策略进行图像分类,计算成本显著降低,但top-1准确率仅下降0.1% 。另一方面,CSP(先融合)策略确实有助于大幅降低计算成本,但top-1准确率显著下降了1.5% 。通过在跨阶段采用分割与合并策略,我们能够有效降低信息整合过程中出现重复的可能性。从图4所示结果可以明显看出,若能有效减少重复的梯度信息,网络的学习能力将大幅提升。
在这里插入图片描述
在这里插入图片描述

3.1.6 Apply CSPNet to Other Architectures 将CSPNet应用于其他架构

  CSPNet也可应用于ResNet和ResNeXt,其架构如图5所示。由于仅有一半的特征通道会经过Res(X)块,因此不再需要引入瓶颈层。这使得在浮点运算量(FLOPs)固定时,内存访问成本(MAC)的理论下限得以确定 。在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到