【PyTorch】按照论文思想实现通道和空间两种注意力机制

简介: 【PyTorch】按照论文思想实现通道和空间两种注意力机制
import torch
from torch import nn
class ChannelAttention(nn.Module):
    # ratio表示MLP中,中间层in_planes缩小的比例
    def __init__(self, in_plances, ratio=16) -> None:
        super().__init__()
        self.max_pool = nn.AdaptiveMaxPool2d((1,1))
        self.avg_pool = nn.AdaptiveAvgPool2d((1,1))
        '''
        (1) in_plances / ratio, 其结果为小数,导致模型报错;
        (2) in_plances // ratio, 向下取整;
        (3) Conv2d中bias为False主要是为了模拟MLP多层感知机的功能;
        '''
        self.mlp = nn.Sequential( # 此处没有中括号
            nn.Conv2d(in_plances, in_plances // ratio, 1, bias=False), # 此处为什么卷积不需要偏置,是为了模拟FC
            nn.ReLU(),
            nn.Conv2d(in_plances // ratio, in_plances, 1, bias=False) # python 中/与//的区别
        )
        self.sigmoid = nn.Sigmoid()
    def forward(self, x):
        x1 = self.max_pool(x)
        x1 = self.mlp(x1)
        x2 = self.avg_pool(x)
        x2 = self.mlp(x2)
        # 此处直接相加,而不是拼接
        # torch.cat(x1, x2)
        out = x1 + x2
        out = self.sigmoid(out)
        return out
class SpatialAttention(nn.Module):
    def __init__(self) -> None:
        super().__init__()
        self.conv2d = nn.Conv2d(2, 1, 7, padding=3, bias=False)
        self.sigmoid = nn.Sigmoid()        
    def forward(self, x):
        '''
        注意,此处并不是简单的最大值和均值池化操作,而是cross channel的;
        '''
        avg_pool = torch.mean(x, dim=1, keepdim=True) # Bx1xHxW
        max_pool, _ = torch.max(x, dim=1, keepdim=True) # Bx1xHxW, 此处非常容易出错,少_
        # Bx2xHxW
        out = torch.cat([avg_pool, max_pool], dim=1)
        out = self.conv2d(out)
        out = self.sigmoid(out)
        return out
if __name__ == '__main__':
    from torchinfo import summary
    # import hiddenlayer as h
    device = 'cuda:0' if torch.cuda.is_available() else 'cpu'
    print('Channel Attention')
    layer = ChannelAttention(32).to(device)
    summary(layer, (1, 32, 224, 224))
    print('Spatial Attention')
    layer = SpatialAttention().to(device)
    summary(layer, (1, 32, 224, 224))
    # graph = h.build_graph(layer, torch.zeros([1, 32, 224, 224]))
    # graph.theme = h.graph.THEMES['blue'].copy()
    # graph.save('test.png')
    print('done!')
目录
相关文章
|
机器学习/深度学习 关系型数据库 MySQL
大模型中常用的注意力机制GQA详解以及Pytorch代码实现
GQA是一种结合MQA和MHA优点的注意力机制,旨在保持MQA的速度并提供MHA的精度。它将查询头分成组,每组共享键和值。通过Pytorch和einops库,可以简洁实现这一概念。GQA在保持高效性的同时接近MHA的性能,是高负载系统优化的有力工具。相关论文和非官方Pytorch实现可进一步探究。
1556 4
|
机器学习/深度学习 算法 PyTorch
Pytorch自动求导机制详解
在深度学习中,我们通常需要训练一个模型来最小化损失函数。这个过程可以通过梯度下降等优化算法来实现。梯度是函数在某一点上的变化率,可以告诉我们如何调整模型的参数以使损失函数最小化。自动求导是一种计算梯度的技术,它允许我们在定义模型时不需要手动推导梯度计算公式。PyTorch 提供了自动求导的功能,使得梯度的计算变得非常简单和高效。
365 0
|
PyTorch 算法框架/工具 C++
Bert Pytorch 源码分析:二、注意力层
Bert Pytorch 源码分析:二、注意力层
198 0
|
PyTorch 算法框架/工具 索引
Pytorch学习笔记(2):数据读取机制(DataLoader与Dataset)
Pytorch学习笔记(2):数据读取机制(DataLoader与Dataset)
1087 0
Pytorch学习笔记(2):数据读取机制(DataLoader与Dataset)
|
5月前
|
缓存 并行计算 PyTorch
PyTorch CUDA内存管理优化:深度理解GPU资源分配与缓存机制
本文深入探讨了PyTorch中GPU内存管理的核心机制,特别是CUDA缓存分配器的作用与优化策略。文章分析了常见的“CUDA out of memory”问题及其成因,并通过实际案例(如Llama 1B模型训练)展示了内存分配模式。PyTorch的缓存分配器通过内存池化、延迟释放和碎片化优化等技术,显著提升了内存使用效率,减少了系统调用开销。此外,文章还介绍了高级优化方法,包括混合精度训练、梯度检查点技术及自定义内存分配器配置。这些策略有助于开发者在有限硬件资源下实现更高性能的深度学习模型训练与推理。
1009 0
|
机器学习/深度学习 PyTorch 算法框架/工具
CNN中的注意力机制综合指南:从理论到Pytorch代码实现
注意力机制已成为深度学习模型的关键组件,尤其在卷积神经网络(CNN)中发挥了重要作用。通过使模型关注输入数据中最相关的部分,注意力机制显著提升了CNN在图像分类、目标检测和语义分割等任务中的表现。本文将详细介绍CNN中的注意力机制,包括其基本概念、不同类型(如通道注意力、空间注意力和混合注意力)以及实际实现方法。此外,还将探讨注意力机制在多个计算机视觉任务中的应用效果及其面临的挑战。无论是图像分类还是医学图像分析,注意力机制都能显著提升模型性能,并在不断发展的深度学习领域中扮演重要角色。
526 10
|
8月前
|
机器学习/深度学习 数据可视化 PyTorch
PyTorch FlexAttention技术实践:基于BlockMask实现因果注意力与变长序列处理
本文介绍了如何使用PyTorch 2.5及以上版本中的FlexAttention和BlockMask功能,实现因果注意力机制与填充输入的处理。通过attention-gym仓库安装相关工具,并详细展示了MultiheadFlexAttention类的实现,包括前向传播函数、因果掩码和填充掩码的生成方法。实验设置部分演示了如何组合这两种掩码并应用于多头注意力模块,最终通过可视化工具验证了实现的正确性。该方法适用于处理变长序列和屏蔽未来信息的任务。
331 17
|
11月前
|
机器学习/深度学习 自然语言处理 数据建模
三种Transformer模型中的注意力机制介绍及Pytorch实现:从自注意力到因果自注意力
本文深入探讨了Transformer模型中的三种关键注意力机制:自注意力、交叉注意力和因果自注意力,这些机制是GPT-4、Llama等大型语言模型的核心。文章不仅讲解了理论概念,还通过Python和PyTorch从零开始实现这些机制,帮助读者深入理解其内部工作原理。自注意力机制通过整合上下文信息增强了输入嵌入,多头注意力则通过多个并行的注意力头捕捉不同类型的依赖关系。交叉注意力则允许模型在两个不同输入序列间传递信息,适用于机器翻译和图像描述等任务。因果自注意力确保模型在生成文本时仅考虑先前的上下文,适用于解码器风格的模型。通过本文的详细解析和代码实现,读者可以全面掌握这些机制的应用潜力。
771 3
三种Transformer模型中的注意力机制介绍及Pytorch实现:从自注意力到因果自注意力
|
11月前
|
机器学习/深度学习 PyTorch 算法框架/工具
聊一聊计算机视觉中常用的注意力机制以及Pytorch代码实现
本文介绍了几种常用的计算机视觉注意力机制及其PyTorch实现,包括SENet、CBAM、BAM、ECA-Net、SA-Net、Polarized Self-Attention、Spatial Group-wise Enhance和Coordinate Attention等,每种方法都附有详细的网络结构说明和实验结果分析。通过这些注意力机制的应用,可以有效提升模型在目标检测任务上的性能。此外,作者还提供了实验数据集的基本情况及baseline模型的选择与实验结果,方便读者理解和复现。
821 0
聊一聊计算机视觉中常用的注意力机制以及Pytorch代码实现
|
11月前
|
机器学习/深度学习 监控 PyTorch
以pytorch的forward hook为例探究hook机制
【10月更文挑战第9天】PyTorch中的Hook机制允许在不修改模型代码的情况下,获取和修改模型中间层的信息,如输入和输出等,适用于模型可视化、特征提取及梯度计算。Forward Hook在前向传播后触发,可用于特征提取和模型监控。实现上,需定义接收模块、输入和输出参数的Hook函数,并将其注册到目标层。与Backward Hook相比,前者关注前向传播,后者侧重反向传播和梯度处理,两者共同增强了对模型内部运行情况的理解和控制。
290 3

热门文章

最新文章

推荐镜像

更多