【语义分割|代码解析】CMTFNet-2: CNN and Multiscale Transformer Fusion Network 用于遥感图像分割!
【语义分割|代码解析】CMTFNet-2: CNN and Multiscale Transformer Fusion Network 用于遥感图像分割!
文章目录
- 【语义分割|代码解析】CMTFNet-2: CNN and Multiscale Transformer Fusion Network 用于遥感图像分割!
- 前言
- 1. 定义 `SeparableConvBNReLU` 类
- 2. 定义基础的分离卷积模块 `SeparableConvBN`
- 3. 定义基础的分离卷积模块 `SeparableConv`
- 总结
欢迎宝子们点赞、关注、收藏!欢迎宝子们批评指正!
祝所有的硕博生都能遇到好的导师!好的审稿人!好的同门!顺利毕业!
大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文:
可访问艾思科蓝官网,浏览即将召开的学术会议列表。会议入口:https://ais.cn/u/mmmiUz
论文地址:https://ieeexplore.ieee.org/document/10247595
前言
这段代码实现了三种分离卷积类,分别为 SeparableConvBNReLU
、SeparableConvBN
和 SeparableConv
。这些类的核心是分离卷积的应用,它通过深度卷积和逐点卷积的组合来减少参数量和计算量。以下是逐行解释:
1. 定义 SeparableConvBNReLU
类
class SeparableConvBNReLU(nn.Sequential):
def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, dilation=1,
norm_layer=nn.BatchNorm2d):
- 定义
SeparableConvBNReLU
类,继承自nn.Sequential
,包含深度卷积、逐点卷积、批归一化和激活函数。 in_channels
和out_channels
:输入和输出的通道数。kernel_size
:卷积核大小,默认为 3。stride
:卷积步幅,默认为 1。dilation
:卷积扩张率,控制卷积核的膨胀,默认为 1。norm_layer
:归一化层类型,默认为nn.BatchNorm2d
。
super(SeparableConvBNReLU, self).__init__(
nn.Conv2d(in_channels, in_channels, kernel_size, stride=stride, dilation=dilation,
padding=((stride - 1) + dilation * (kernel_size - 1)) // 2,
groups=in_channels, bias=False),
nn.Conv2d
:实现深度卷积,通过设置groups=in_channels
使每个输入通道与相应的输出通道独立卷积。padding
:通过公式((stride - 1) + dilation * (kernel_size - 1)) // 2
计算,保持输出尺寸不变。
norm_layer(in_channels),
nn.Conv2d(in_channels, out_channels, kernel_size=1, bias=False),
norm_layer(in_channels)
:对深度卷积的输出进行批归一化。nn.Conv2d(in_channels, out_channels, kernel_size=1, bias=False)
:逐点卷积(1x1卷积),整合深度卷积的结果,改变通道数。
norm_layer(out_channels),
nn.ReLU6()
)
norm_layer(out_channels)
:对逐点卷积的输出进行批归一化。nn.ReLU6()
:ReLU6 激活函数,将输出值限制在 0 和 6 之间,适合移动端模型。
2. 定义基础的分离卷积模块 SeparableConvBN
class SeparableConvBN(nn.Sequential):
def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, dilation=1,
norm_layer=nn.BatchNorm2d):
SeparableConvBN
类的定义与SeparableConvBNReLU
类似,但不包含激活函数。
super(SeparableConvBN, self).__init__(
nn.Conv2d(in_channels, in_channels, kernel_size, stride=stride, dilation=dilation,
padding=((stride - 1) + dilation * (kernel_size - 1)) // 2,
groups=in_channels, bias=False),
- 深度卷积的设置与
SeparableConvBNReLU
类相同。
nn.Conv2d(in_channels, out_channels, kernel_size=1, bias=False),
norm_layer(out_channels),
)
- 逐点卷积层用于调整输出通道数,接批归一化,作为模块的最后一层。
3. 定义基础的分离卷积模块 SeparableConv
class SeparableConv(nn.Sequential):
def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, dilation=1):
- 定义
SeparableConv
类,包含深度卷积和逐点卷积,但不包含批归一化和激活函数。
super(SeparableConv, self).__init__(
nn.Conv2d(in_channels, in_channels, kernel_size, stride=stride, dilation=dilation,
padding=((stride - 1) + dilation * (kernel_size - 1)) // 2,
groups=in_channels, bias=False),
nn.Conv2d(in_channels, out_channels, kernel_size=1, bias=False)
)
- 仅包括深度卷积和逐点卷积,用于需要较低计算量且无需额外归一化的情况。
总结
SeparableConvBNReLU
:包含深度卷积、逐点卷积、批归一化和 ReLU6 激活函数。SeparableConvBN
:包含深度卷积、逐点卷积和批归一化,无激活函数。SeparableConv
:包含深度卷积和逐点卷积,适合无需批归一化和激活的场景。
这些模块在 CMTFNet 中用于高效特征提取,适合处理高分辨率遥感图像的数据量较大且计算成本高的问题。
欢迎宝子们点赞、关注、收藏!欢迎宝子们批评指正!
祝所有的硕博生都能遇到好的导师!好的审稿人!好的同门!顺利毕业!
大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文:
可访问艾思科蓝官网,浏览即将召开的学术会议列表。会议入口:https://ais.cn/u/mmmiUz