class Bottleneck(nn.Module):
"""标准的残差块。"""
def __init__(self, c1, c2, shortcut=True, g=1, k=(3, 3), e=0.5):
"""使用给定的输入/输出通道数、shortcut选项、组、卷积核和扩展因子初始化残差块。"""
super().__init__()
c_ = int(c2 * e) # 隐藏通道数
self.cv1 = Conv(c1, c_, k[0], 1)
self.cv2 = Conv(c_, c2, k[1], 1, g=g)
self.add = shortcut and c1 == c2
def forward(self, x):
"""'forward()'将YOLO FPN应用于输入数据。"""
return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))
总体而言,self.cv1
和 self.cv2
是两个卷积层,通过这两个卷积层的组合,实现了一个特征提取和转换的过程。这种设计通常在深度神经网络中用于提取输入特征的不同层次的表示。
-
Bottleneck
类是一个继承自nn.Module
的残差块模块。 -
__init__
方法用于初始化残差块,接受参数c1
(输入通道数)、c2
(输出通道数)、shortcut
(是否使用快捷连接,默认为 True)、g
(卷积组数,默认为 1)、k
(卷积核大小,默认为 (3, 3))、e
(扩展因子,默认为 0.5)。 -
在
__init__
方法中,通过扩展因子e
计算隐藏通道数c_
,然后创建两个卷积层self.cv1
和self.cv2
,分别用于特征变换。 -
forward
方法定义了前向传播操作。它将输入x
通过残差块,先经过self.cv1
和self.cv2
的卷积变换,然后根据shortcut
和通道数是否相等来决定是否使用快捷连接。如果使用快捷连接,则将输入x
与经过卷积的结果相加,否则直接返回卷积的结果 -
这里使用了两个
Conv
模块,分别命名为self.cv1
和self.cv2
。以下是这两个模块的参数及其含义的解释: -
self.cv1 = Conv(c1, c_, k[0], 1)
:c1
: 输入通道数(输入特征图的通道数)。c_
: 隐藏通道数