【语义分割|代码解析】CMTFNet-1: CNN and Multiscale Transformer Fusion Network 用于遥感图像分割!

【语义分割|代码解析】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 中一个基础模块的实现,包含了几个卷积类,分别是 ConvBNReLUConvBNConv,主要用于构建神经网络的卷积层。这些模块实现了卷积操作,支持批归一化(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.Conv2dnn.BatchNorm2d
  • torch.nn.functional:提供 PyTorch 中的功能性函数,不是模块化的层,例如激活函数和卷积等。
  • einops.rearrangeeinops.repeat:用于对张量的维度进行重新排列和重复,是常用的张量操作工具库 einops 的两个方法。
  • model.CMTFNet.ResNet:导入 CMTFNet 模型中的 ResNet 模块。
  • timm.models.layers.DropPathto_2tupletrunc_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_channelsout_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_channelsout_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

猜你喜欢

转载自blog.csdn.net/gaoxiaoxiao1209/article/details/143375851