【扒代码】CGAFusion

class SpatialAttention(nn.Module):
    # 定义一个名为 SpatialAttention 的类,它继承自 PyTorch 的 nn.Module,用于创建一个空间注意力模块。

    def __init__(self):
        # 类构造函数,在初始化时调用。
        super(SpatialAttention, self).__init__()
        # 调用父类的构造函数。

        self.sa = nn.Conv2d(2, 1, 7, padding=3, padding_mode='reflect', bias=True)
        # 在模块中定义一个二维卷积层,用于空间注意力的计算。
        # 输入通道数为 2,输出通道数为 1。
        # 卷积核大小为 7x7,使用 'reflect' 填充模式,填充大小为 3。
        # 卷积层包含偏置项(bias)。

    def forward(self, x):
        # 定义前向传播函数,它接受输入 x 并返回空间注意力的输出。

        x_avg = torch.mean(x, dim=1, keepdim=True)
        # 计算输入 x 的通道平均值,dim=1 表示沿着通道维度计算平均值。
        # keepdim=True 表示保持输出的维度与输入相同。

        x_max, _ = torch.max(x, dim=1, keepdim=True)
        # 计算输入 x 的通道最大值,dim=1 表示沿着通道维度寻找最大值。
        # _ 表示我们不关心最大值的索引。

        x2 = torch.cat([x_avg, x_max], dim=1)
        # 将平均值和最大值沿着通道维度拼接起来,形成一个新的张量 x2。

        sattn = self.sa(x2)
        # 将拼接后的张量 x2 输入到之前定义的卷积层 self.sa 中,得到空间注意力图。

        return sattn
        # 返回空间注意力图,它将作为模块的输出。

这个 SpatialAttention 类可以用于神经网络中,以实现空间注意力机制,这通常用于增强模型对图像中特定区域的关注。通过计算平均池化和最大池化的结果,并将它们结合起来输入到卷积层,可以得到一个注意力权重图,这个权重图可以对输入特征图的每个空间位置分配一个权重,强调重要的特征并抑制不重要的特征

class ChannelAttention(nn.Module):
    # 定义一个名为 ChannelAttention 的类,继承自 PyTorch 的 nn.Module,用于创建通道注意力模块。

    def __init__(self, dim, reduction=8):
        # 类构造函数,在初始化时调用。
        super(ChannelAttention, self).__init__()
        # 调用父类的构造函数。

        self.gap = nn.AdaptiveAvgPool2d(1)
        # 使用全局平均池化层,将输入特征图的每个通道的空间维度压缩到一个单一的数值。

        self.ca = nn.Sequential(
            # 定义一个通道注意力子网络,使用顺序容器来堆叠层。
            nn.Conv2d(dim, dim // reduction, 1, padding=0, bias=True),
            # 第一个卷积层,输入通道数为 dim,输出通道数为 dim // reduction,用于降维。
            # 卷积核大小为 1x1,没有填充(padding=0),包含偏置项(bias=True)。

            nn.ReLU(inplace=True),
            # 使用 ReLU 激活函数,inplace=True 表示在原地进行计算,减少内存使用。

            nn.Conv2d(dim // reduction, dim, 1, padding=0, bias=True),
            # 第二个卷积层,输入通道数为经过降维的 dim // reduction,输出通道数恢复为原始的 dim。
            # 同样使用 1x1 卷积核,没有填充,包含偏置项。
        )

    def forward(self, x):
        # 定义前向传播函数,接受输入 x 并返回通道注意力的输出。

        x_gap = self.gap(x)
        # 通过全局平均池化层处理输入 x,得到每个通道的全局空间信息。

        cattn = self.ca(x_gap)
        # 将全局平均池化的结果输入到通道注意力子网络中,计算每个通道的权重。

        return cattn
        # 返回通道注意力的权重,这些权重将用于调节输入特征图的通道响应。

ChannelAttention 类实现了一种通道注意力机制,它通过全局平均池化来聚合每个通道的空间信息,然后通过一个包含两个卷积层的网络来学习每个通道的重要性权重。这种机制通常用于特征重标定,允许网络自适应地强调有信息量的特征并抑制无关的特征。通过这种方式,通道注意力有助于提高模型对输入数据的表示能力,从而在各种视觉任务中提高性能。

class PixelAttention(nn.Module):
    # 定义一个名为 PixelAttention 的类,继承自 PyTorch 的 nn.Module,用于创建像素注意力模块。

    def __init__(self, dim):
        super(PixelAttention, self).__init__()
        # 调用父类的构造函数。

        self.pa2 = nn.Conv2d(2 * dim, dim, 7, padding=3, padding_mode='reflect', groups=dim, bias=True)
        # 定义一个二维卷积层,用于像素注意力的计算。
        # 输入通道数为 2 * dim,输出通道数为 dim。
        # 卷积核大小为 7x7,使用 'reflect' 填充模式,填充大小为 3。
        # 卷积层使用分组卷积,groups=dim,每个组独立卷积。
        # 卷积层包含偏置项(bias=True)。

        self.sigmoid = nn.Sigmoid()
        # 定义 Sigmoid 激活函数,用于将卷积层的输出转换为概率分布。

    def forward(self, x, pattn1):
        # 定义前向传播函数,接受输入特征图 x 和第一个注意力特征 pattn1,并返回像素注意力的输出。

        B, C, H, W = x.shape
        # 获取输入特征图 x 的形状。

        x = x.unsqueeze(dim=2)  # B, C, 1, H, W
        # 扩展输入特征图的维度,增加一个维度,用于与 pattn1 拼接。

        pattn1 = pattn1.unsqueeze(dim=2)  # B, C, 1, H, W
        # 扩展 pattn1 的维度,与 x 进行拼接。

        x2 = torch.cat([x, pattn1], dim=2)  # B, C, 2, H, W
        # 将 x 和 pattn1 沿着通道维度拼接。

        x2 = Rearrange('b c t h w -> b (c t) h w')(x2)
        # 使用 Rearrange 函数重新排列 x2 的形状,这里应该是一个错误,因为 PyTorch 没有内置的 Rearrange 函数。
        # 正确的操作可能是使用 view 或 permute 来重新排列张量。

        pattn2 = self.pa2(x2)
        # 将拼接和重新排列后的张量 x2 输入到之前定义的卷积层 self.pa2 中。

        pattn2 = self.sigmoid(pattn2)
        # 通过 Sigmoid 激活函数处理 self.pa2 的输出,得到像素级别的注意力权重。

        return pattn2
        # 返回像素注意力权重。

PixelAttention 类实现了一种像素级别的注意力机制,它通过卷积层处理输入特征图和第一个注意力特征图的拼接结果。这种机制旨在为每个像素分配一个权重,强调重要的像素并抑制不重要的像素。通过这种方式,像素注意力有助于增强模型对图像中关键信息的捕捉能力,提高处理图像相关任务的性能。

class CGAFusion(nn.Module):
    # 定义 CGAFusion 类,继承自 PyTorch 的 nn.Module,用于创建特征融合模块。
    
    def __init__(self, dim, reduction=8):
        super(CGAFusion, self).__init__()
        # 调用父类的构造函数。

        self.sa = SpatialAttention()
        # 创建空间注意力模块。

        self.ca = ChannelAttention(dim, reduction)
        # 创建通道注意力模块,dim 表示输入特征的维度,reduction 用于控制通道降维的比例。

        self.pa = PixelAttention(dim)
        # 创建像素注意力模块,dim 表示输入特征的维度。

        self.conv = nn.Conv2d(dim, dim, 1, bias=True)
        # 创建一个二维卷积层,用于处理融合后的特征图,卷积核大小为 1。

        self.sigmoid = nn.Sigmoid()
        # 创建 Sigmoid 激活函数,用于将输出转换为概率分布。

    def forward(self, x, y):
        # 定义前向传播函数,接受两个输入特征图 x 和 y。

        initial = x + y
        # 将两个输入特征图相加,作为初始融合特征。

        cattn = self.ca(initial)
        # 计算初始融合特征的通道注意力。

        sattn = self.sa(initial)
        # 计算初始融合特征的空间注意力。

        pattn1 = sattn + cattn
        # 将空间注意力和通道注意力相加。

        pattn2 = self.sigmoid(self.pa(initial, pattn1))
        # 计算像素级别的注意力权重,并通过 Sigmoid 函数进行归一化。

        result = initial + pattn2 * x + (1 - pattn2) * y
        # 根据像素注意力权重调整初始融合特征和输入特征的组合,生成最终的融合结果。

        result = self.conv(result)
        # 使用卷积层进一步处理融合结果。

        return result
        # 返回最终的特征融合结果。

功能解释CGAFusion 类实现了一个特征融合网络,它结合了空间注意力、通道注意力和像素注意力机制,用于调整和融合两个输入特征图 xy。通过这种方式,网络可以自适应地强调重要的特征并抑制不重要的特征,增强特征的表达能力。

  1. 空间注意力(Spatial Attention):关注特征图中重要的空间位置。
  2. 通道注意力(Channel Attention):关注特征中重要的通道。
  3. 像素注意力(Pixel Attention):在像素级别上调整特征的重要性。

最终,融合结果通过考虑这些注意力机制来生成,其中像素注意力权重用于调整输入特征图的组合,使得模型能够更加关注对任务更有区分性的特征。这种融合策略可以提高模型在图像分类、目标检测、语义分割等计算机视觉任务中的表现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值