赞
踩
Bottleneck CSP(Cross Stage Partial)是一种常用于计算机视觉任务的卷积神经网络(CNN)中的瓶颈层类型。它是传统瓶颈层(如ResNet中常见的Bottleneck,关于Bottleneck介绍请参考文章yolo组件之Bottleneck层总结)的扩展。
瓶颈层旨在减少网络的计算复杂性和内存需求,同时提高性能。它通过使用1x1卷积来减小输入特征图的空间维度,然后应用更复杂的操作(如3x3卷积)。通过减小空间维度,可以减少后续层所需的参数和计算量,同时保持网络的表示能力。
在CSP的背景下,瓶颈层进一步增强,通过引入跨阶段部分连接。这些连接允许信息在网络的不同阶段或块之间流动,有助于改善信息传播和梯度流动。通过连接不同阶段,网络可以利用在不同尺度和抽象级别上学到的特征,从而提高性能。
Bottleneck CSP层通常包括以下操作:
1x1卷积:它减少输入通道的数量以节省内存和计算量。
3x3卷积:它使用更大的感受野执行主要特征提取。
跨阶段部分连接:这些连接将上一阶段/块的输出与当前阶段/块的输出合并。这允许信息在不同阶段之间流动,有助于保留低层次细节并改善梯度流动。
激活函数:通常,会应用非线性激活函数(如ReLU)以引入非线性。
批归一化:通常用于归一化激活并稳定训练过程。
Dropout(可选):可以应用Dropout正则化来在训练过程中随机丢弃一些激活以防止过拟合。
CSP瓶颈层结构在Bottleneck部分存在一个可修改的参数n,标识使用的Bottleneck结构个数!这一条也是我们的主分支,是对残差进行学习的主要结构,右侧分支nn.Conv2d实际上是shortcut分支实现不同stage的连接。
- class BottleneckCSP(nn.Module):
- # ch_in, ch_out, number, shortcut, groups, expansion
- def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):
- super(BottleneckCSP, self).__init__()
- c_ = int(c2 * e) # hidden channels
- self.cv1 = Conv(c1, c_, 1, 1)
- self.cv2 = nn.Conv2d(c1, c_, 1, 1, bias=False)
- self.cv3 = nn.Conv2d(c_, c_, 1, 1, bias=False)
- self.cv4 = Conv(2 * c_, c2, 1, 1)
- self.bn = nn.BatchNorm2d(2 * c_) # applied to cat(cv2, cv3)
- self.act = nn.LeakyReLU(0.1, inplace=True)
- self.m = nn.Sequential(*[Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)])
-
- def forward(self, x):
- y1 = self.cv3(self.m(self.cv1(x)))
- y2 = self.cv2(x)
- return self.cv4(self.act(self.bn(torch.cat((y1, y2), dim=1))))
参数说明:
c1:BottleneckCSP 结构的输入通道维度;
c2:BottleneckCSP 结构的输出通道维度;
n:bottleneck 结构 结构的个数;
shortcut:是否给bottleneck 结构添加shortcut连接,添加后即为ResNet模块;
g:groups,通道分组的参数,输入通道数、输出通道数必须同时满足被groups整除;
e:expansion: bottleneck 结构中的瓶颈部分的通道膨胀率,使用0.5即为变为输入的1212;
torch.cat((y1, y2), dim=1):这里是指定在第1个维度上进行合并,即在channel维度上合并;
c_:BottleneckCSP 结构的中间层的通道数,由膨胀率e决定
Bottleneck CSP是一种在卷积神经网络中常用的瓶颈层类型,它通过结合瓶颈结构和跨阶段部分连接的方式,提高了网络的性能和效率。它在图像分类、目标检测、语义分割等计算机视觉任务中得到广泛应用,并取得了良好的效果。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。