FasterNet
类参数初始化
将图像切分为非重叠的图像块
PatchEmbed
类
将图像分解为非重叠的图像块有以下几个好处:
1.
缩小计算量:对于大尺寸的图像,直接对整个图像进行处理可能会导致计算和内存消耗过大。将图像切分为小块可以降低计算量,使得处理更加高效。
2.
提取局部特征:图像块相对于整个图像来说更加局部化,每个图像块中的特征更加集中于该块所对应的局部区域。这有助于模型更好地捕捉图像中的局部信息和细节。
3.
支持变尺寸输入:通过将图像切分为块,并对每个块进行嵌入,可以处理不同尺寸的输入图像,而不需要对整个图像进行大小调整。
4.
支持并行处理:将图像分割为块后,可以并行地对每个块进行处理,从而加速计算过程。这对于在硬件加速器(如GPU
)上进行高效推断和训练非常有用。
总之,将图像分解为非重叠的图像块并进行特征嵌入是为了提高计算效率、捕捉局部特征、支持变尺寸输入和实现并行处理,从而更好地应对图像分析任务的需求。
dpr
这个列表中的每个值代表了在不同层级的网络中应用
DropPath
操作的概率。
DropPath
是一种正则化技术,用于在训练过程中随机丢弃网络中的一些连接,以减少过拟合。通过在不同层级使用不同的DropPath 概率,可以在训练过程中控制不同层级的模型复杂度,从而增强模型的鲁棒性和泛化能力。
需要注意的是,
torch.linspace
函数生成的数列是一个包含浮点数的张量,通过
x.item()
将每个张量元素转换为 Python
标量值
构建
FasterNet
的多个阶段
BasicStage
类
class BasicStage(nn.Module):
def __init__(self,
dim,
depth,
n_div,
mlp_ratio,
drop_path,
layer_scale_init_value,
norm_layer,
act_layer,
pconv_fw_type
):
super().__init__()
# 包含多个 MLPBlock 的序列组成的 blocks 层
blocks_list = [
MLPBlock(
dim=dim,
n_div=n_div,
mlp_ratio=mlp_ratio,
drop_path=drop_path[i],
layer_scale_init_value=layer_scale_init_value,
norm_layer=norm_layer,
act_layer=act_layer,
pconv_fw_type=pconv_fw_type
)
for i in range(depth)
]
self.blocks = nn.Sequential(*blocks_list)
def forward(self, x: Tensor) -> Tensor:
x = self.blocks(x)
return x
作用
将多个
MLPBlock
组成一个阶段,每个
MLPBlock
通过前向传播对输入数据进行处理,并将处理结果作为下一个 MLPBlock
的输入。通过堆叠多个
MLPBlock
,可以形成深度的神经网络结构,用于特征提取和信息传递.
MLPBlock
类
MLPBlock
中先将输入特征的维度缩放到
MLP
层的隐藏维度,然后再将隐藏维度缩放回原始维度的操作,有以下几个原因:
1.
提高模型的表达能力:通过将输入特征的维度缩放到较高的隐藏维度,可以增加
MLP
层的参数量和非线性变换的能力,从而提高模型的表达能力。这种缩放操作允许 MLP
层对输入特征进行更复杂的非线性变换,以捕捉更多的特征信息。
2.
引入多尺度特征信息:通过缩放到不同的维度,可以在
MLP
层中引入多尺度的特征信息。输入特征经过缩放到隐藏维度后,隐藏维度的特征在不同尺度上进行了变换。随后再将隐藏维度的特征缩放回原始维度,将不同尺度的特征信息与原始特征进行融合,从而获得更丰富的特征表示。
x
=
self
.
blocks
(
x
)
return
x
3.
控制模型复杂度:缩放到隐藏维度后,
MLP
层的参数量相对于输入特征维度会增加。然后,再将隐藏维度的特征缩放回原始维度,可以控制 MLP
层的参数量,避免模型过于复杂。这种参数量的控制可以通过调节 MLP
比例
mlp_ratio
来实现,从而灵活地平衡模型的复杂性和性能。总而言之,通过先缩放维度到隐藏层,再缩放回原维度,可以提高模型的表达能力、引入多尺度特征信息,并灵活控制模型复杂度。这种设计可以帮助网络更好地学习和表示输入特征的相关信息。
定义部分卷积模块
Partial_conv3
类
对每一块进行
patch
操作
PatchMerging
类
PatchMerging
类用于将输入特征的补丁进行合并,以减小特征图的空间尺寸,并可选地对合并后的特 征进行归一化处理。这个操作通常在多层级特征提取过程中使用,以控制特征的维度和空间尺寸,适应不同的任务和模型结构。