【语义分割|代码解析】CMTFNet-1: CNN and Multiscale Transformer Fusion Network 用于遥感图像分割!
【语义分割|代码解析】CMTFNet-1: CNN and Multiscale Transformer Fusion Network 用于遥感图像分割!
文章目录
欢迎宝子们点赞、关注、收藏!欢迎宝子们批评指正!
祝所有的硕博生都能遇到好的导师!好的审稿人!好的同门!顺利毕业!
大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文:
可访问艾思科蓝官网,浏览即将召开的学术会议列表。会议入口:https://ais.cn/u/mmmiUz
论文地址:https://ieeexplore.ieee.org/document/10247595
前言
这段代码是 CMTFNet 中一个基础模块的实现,包含了几个卷积类,分别是 ConvBNReLU
、ConvBN
和 Conv
,主要用于构建神经网络的卷积层。这些模块实现了卷积操作,支持批归一化(Batch Normalization)和激活函数等操作,适合不同需求的卷积组合。以下是对代码的逐行解释:
import torch
import torch.nn as nn
import torch.nn.functional as F
from einops import rearrange, repeat
from model.CMTFNet.ResNet import *
from timm.models.layers import DropPath, to_2tuple, trunc_normal_
torch
:导入 PyTorch 主库,用于张量操作和计算。torch.nn
:导入 PyTorch 的nn
模块,包含神经网络的基本组件,如nn.Conv2d
和nn.BatchNorm2d
。torch.nn.functional
:提供 PyTorch 中的功能性函数,不是模块化的层,例如激活函数和卷积等。einops.rearrange
和einops.repeat
:用于对张量的维度进行重新排列和重复,是常用的张量操作工具库 einops 的两个方法。model.CMTFNet.ResNet
:导入 CMTFNet 模型中的ResNet
模块。timm.models.layers.DropPath
、to_2tuple
、trunc_normal_
:来自timm
库的一些工具函数,DropPath
是一种正则化方法,to_2tuple
用于将输入转换为包含两个相同元素的元组,trunc_normal_
用于截断的正态分布初始化。
1. 定义基础的卷积模块 ConvBNReLU
class ConvBNReLU(nn.Sequential):
def __init__(self, in_channels, out_channels, kernel_size=3, dilation=1, stride=1, norm_layer=nn.BatchNorm2d, groups=1, bias=False):
- 定义
ConvBNReLU
类,继承自nn.Sequential
,是一个顺序层的容器。 in_channels
和out_channels
:输入和输出的通道数。kernel_size
:卷积核大小,默认为 3。dilation
:卷积扩张率,用于控制卷积核的膨胀(默认为 1)。stride
:卷积步幅,默认为 1。norm_layer
:批归一化层的类型,默认为nn.BatchNorm2d
。groups
:用于控制分组卷积的数量,默认为 1。bias
:卷积操作是否使用偏置项。
super(ConvBNReLU, self).__init__(
nn.Conv2d(in_channels, out_channels, kernel_size=kernel_size, bias=bias,
dilation=dilation, stride=stride, padding=((stride - 1) + dilation * (kernel_size - 1)) // 2, groups=groups),
norm_layer(out_channels),
nn.ReLU6()
)
nn.Conv2d
:二维卷积层,指定in_channels
和out_channels
以及卷积核大小等参数。padding
:通过公式((stride - 1) + dilation * (kernel_size - 1)) // 2
计算填充大小,使输出大小不受步幅和扩张的影响。norm_layer(out_channels)
:指定批归一化层,减少内部协变量偏移。nn.ReLU6()
:ReLU6 激活函数,将输出限制在 0 到 6 之间。
2. 定义基础的卷积模块 ConvBN
class ConvBN(nn.Sequential):
def __init__(self, in_channels, out_channels, kernel_size=3, dilation=1, stride=1, norm_layer=nn.BatchNorm2d, bias=False):
- 定义
ConvBN
类,继承自nn.Sequential
,与ConvBNReLU
类似,只是没有激活函数。
super(ConvBN, self).__init__(
nn.Conv2d(in_channels, out_channels, kernel_size=kernel_size, bias=bias,
dilation=dilation, stride=stride, padding=((stride - 1) + dilation * (kernel_size - 1)) // 2),
norm_layer(out_channels)
)
- 包含二维卷积层
nn.Conv2d
和批归一化层norm_layer
,不包含激活函数。 padding
参数的计算方式与ConvBNReLU
中相同。
3. 定义基础的卷积模块 Conv
class Conv(nn.Sequential):
def __init__(self, in_channels, out_channels, kernel_size=3, dilation=1, stride=1, bias=False):
- 定义
Conv
类,继承自nn.Sequential
,只有卷积层,没有批归一化和激活函数。
super(Conv, self).__init__(
nn.Conv2d(in_channels, out_channels, kernel_size=kernel_size, bias=bias,
dilation=dilation, stride=stride, padding=((stride - 1) + dilation * (kernel_size - 1)) // 2)
)
- 仅包含
nn.Conv2d
层。 padding
参数的计算方式相同
总结
这段代码定义了三个卷积模块:
ConvBNReLU
:卷积 + 批归一化 + ReLU6 激活,用于增加非线性和稳定训练。ConvBN
:卷积 + 批归一化,没有激活函数,适用于网络中的某些部分。Conv
:仅卷积层,没有批归一化或激活函数,适用于特定的场景。
这些模块在 CMTFNet 中可能被用于不同的特征提取层或融合层,用以增强特征的提取和传递。
欢迎宝子们点赞、关注、收藏!欢迎宝子们批评指正!
祝所有的硕博生都能遇到好的导师!好的审稿人!好的同门!顺利毕业!
大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文:
可访问艾思科蓝官网,浏览即将召开的学术会议列表。会议入口:https://ais.cn/u/mmmiUz