万能的Attention及其代码实现

article/2025/10/14 21:09:15

最近看到以前的代码,想到了attention,趁着代码还在就来整理一下。

文章目录

  • [Squeeze-and-Excitation Networks](https://arxiv.org/abs/1709.01507)
  • [Concurrent Spatial and Channel ‘Squeeze &Excitation’ in Fully Convolutional Networks](https://arxiv.org/abs/1803.02579)
  • [CBAM: Convolutional Block Attention Module](https://arxiv.org/abs/1807.06521)

Squeeze-and-Excitation Networks

这是最有名的SEnet(也就是channel attention), 感兴趣的可以看论文
看图:
在这里插入图片描述
在这里插入图片描述
这里用到的操作:全局平均池化(将W X H X C的特征 变成1 X 1 X C ),全连接FC(两层,用两个FC层比用一个FC层的好处:具有更多非线性,可以更好拟合通道间复杂的相关性;极大的减少了参数量和计算量。缺点:不能保持spatial information),最后进行点乘,这个attention在很多网络结构都有了,例如Resnet
代码实现如下(python,超清晰明了简洁):

from torch import nn
import torch
class SELayer(nn.Module):def __init__(self, channel, reduction=16):super(SELayer, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.fc = nn.Sequential(nn.Linear(channel, channel // reduction, bias=False),nn.ReLU(inplace=True),nn.Linear(channel // reduction, channel, bias=False),nn.Sigmoid())def forward(self, x):b, c, _, _ = x.size() # b为batchy = self.avg_pool(x).view(b, c)y = self.fc(y).view(b, c, 1, 1)#return x * y.expand_as(x)return torch.mul(x,y)

Concurrent Spatial and Channel ‘Squeeze &Excitation’ in Fully Convolutional Networks

这是scSEnet,也就是把spatia和channel两种attention合并,下面把我ppt内容贴上来,感兴趣的可以仔细看论文
在这里插入图片描述
上面这张图就是channel attention ,和上一篇一样
在这里插入图片描述
这张图加了一个spatial attention, 至于操作呢,很简单粗暴,用1*1卷积直接把channel变为1,(也就是降维,将W X H X C的特征 变成 W X H X 1 ),最后也是点乘
最最后把两个attention 对应相加
代码实现如下(python,超清晰明了简洁):

import torch
import torch.nn as nn
class SCSEBlock(nn.Module):def __init__(self, channel, reduction=16):super(SCSEBlock, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.channel_excitation = nn.Sequential(nn.Linear(channel, int(channel//reduction)),nn.ReLU(inplace=True),nn.Linear(int(channel//reduction), channel),nn.Sigmoid())self.spatial_se = nn.Sequential(nn.Conv2d(channel, 1, kernel_size=1,stride=1, padding=0),nn.Sigmoid())def forward(self, x):bahs, chs, _, _ = x.size()# Returns a new tensor with the same data as the self tensor but of a different size.chn_se = self.avg_pool(x).view(bahs, chs)chn_se = self.channel_excitation(chn_se).view(bahs, chs, 1, 1)chn_se = torch.mul(x, chn_se)spa_se = self.spatial_se(x)spa_se = torch.mul(x, spa_se)return torch.add(chn_se, 1, spa_se)

CBAM: Convolutional Block Attention Module

这个题目已经告诉你了,它叫CBAM,直接上图吧,感兴趣的可以仔细看论文
在这里插入图片描述
看到这个图,是不是觉得就是SCSE 呢,怎么还可以发论文呢,人家有其他创新啦
在这里插入图片描述
对的就是你看到的,它在channel attention,spatial attention上分别动了手脚,用了两种不同的pooling,感兴趣的可以仔细看论文。
代码实现如下(python,超清晰明了简洁):

import torch
import torch.nn as nn
class CBAMBlock(nn.Module):def __init__(self, channel, reduction=16):super(CBAMBlock, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.max_pool = nn.AdaptiveMaxPool2d(1)self.channel_excitation = nn.Sequential(nn.Linear(channel,int(channel//reduction),bias=False),nn.ReLU(inplace=True),nn.Linear(int(channel//reduction),channel,bias=False),)self.sigmoid = nn.Sigmoid()self.spatial_excitation = nn.Sequential(nn.Conv2d(2, 1, kernel_size=7,stride=1, padding=3, bias=False),)def forward(self, x):bahs, chs, _, _ = x.size()# Returns a new tensor with the same data as the self tensor but of a different size.chn_avg = self.avg_pool(x).view(bahs, chs)chn_avg = self.channel_excitation(chn_avg).view(bahs, chs, 1, 1)chn_max = self.max_pool(x).view(bahs, chs)chn_max = self.channel_excitation(chn_max).view(bahs, chs, 1, 1)chn_add=chn_avg+chn_maxchn_add=self.sigmoid(chn_add)chn_cbam = torch.mul(x, chn_add)avg_out = torch.mean(chn_cbam, dim=1, keepdim=True)max_out, _ = torch.max(chn_cbam, dim=1, keepdim=True)cat = torch.cat([avg_out, max_out], dim=1)spa_add = self.spatial_excitation(cat)spa_add=self.sigmoid(spa_add)spa_cbam = torch.mul(chn_cbam, spa_add)return spa_cbam

以上三种attention都可以无缝隙的用在任何网络中,且不会改变W H C, 很方便,另外我们会发现,经过attention之后都会使用nn.sigmoid层,使得得到的结果变为(0-1)之间。至于效果嘛,看具体任务,详细内容可参考:attention


http://chatgpt.dhexx.cn/article/9FSoJlvO.shtml

相关文章

NLP中的Attention总结

Attention是模拟人脑的注意力机制。人在看到一些东西,往往只关注重要的信息,而忽略其他信息。自然语言处理中的attention是对文本分配注意力权重,Attention的本质就是从关注全部变为关注重点。 1 Attention的原理 Attention的计算过程&#…

Attention 理解汇总

在 Encoder-Decoder中,预测每个Decoder 的语义编码 c 是一样的,句子 X 中每个词对输出 Y 的每个词的影响都是相同的。 这样有两个弊端: 一是语义向量无法完全表示整个序列的信息; 二是先输入的内容携带的信息会被后输入的信息稀…

[深度学习] 自然语言处理 --- Self-Attention(三) 知识点与源码解析

在当前的 NLP 领域,Transformer / BERT 已然成为基础应用,而 Self-Attention 则是两者的核心部分,下面尝试用 Q&A 和源码的形式深入 Self-Attention 的细节。 一 Q&A 1. Self-Attention 的核心是什么? Self-Attention …

attention介绍

Attention 正在被越来越广泛的得到应用。 Attention 到底有什么特别之处?他的原理和本质是什么?Attention都有哪些类型?本文将详细讲解Attention的方方面面。 Attention 的本质是什么 Attention(注意力)机制如果浅层…

Attention原理

文章目录 Attention原理HAN原理利用Attention模型进行文本分类参考资料 Attention原理 转载一个Hierarchical Attention神经网络的实现 转载 图解Transformer 转载 Attention原理和源码解析 论文链接 Attention is All You Need HAN原理 论文链接Hierarchical Attention Net…

Transformer详解(二):Attention机制

1.Encoder-Decoder中的attention机制 上一篇文章最后,在Encoder-Decoder框架中,输入数据的全部信息被保存在了C。而这个C很容易受到输入句子长度的影响。当句子过长时,C就有可能存不下这些信息,导致模型后续的精度下降。Attentio…

attention模型

以机器翻译为例说明: 普通的RNN机器翻译模型: 次结构弱点在于当target句子太长时,前面encoder学习到的embedding vector(红边框)可能会被后面的decoder遗忘。因此改进版本如下: 这样,每次在输入target的word的时候,除了可以看到…

【深度学习】Self-Attention 原理与代码实现

1.Self-Attention 结构 在计算的时候需要用到矩阵Q(查询),K(键值),V(值)。在实际中,Self-Attention 接收的是输入(单词的表示向量x组成的矩阵X) 或者上一个 Encoder block 的输出。而Q,K,V正是通过 Self-Attention 的输入进行线性变换得到的。 2. Q, K, V 的计算 S…

Self -Attention、Multi-Head Attention、Cross-Attention

Self -Attention Transformer结构图 上图是论文中 Transformer 的内部结构图,左侧为 Encoder block,右侧为 Decoder block。红色圈中的部分为 Multi-Head Attention,是由多个 Self-Attention组成的,可以看到 Encoder block 包含一…

Attention Rollout

问题陈述 从图1a中的原始attention可以看出,只有在最开始的几层,不同位置的attention模式有一些区别,但是更高层中的attention权重更加一致。这表示随着模型层数的增加,嵌入的内容变得更加情境化,可能都带有类似的信息…

Attention可视化

Attention matrix: https://github.com/rockingdingo/deepnlp/blob/r0.1.6/deepnlp/textsum/eval.py plot_attention(data, X_labelNone, Y_labelNone)函数 #!/usr/bin/python # -*- coding:utf-8 -*-""" Evaluation Method for summarization tas…

Attention机制

文章目录 一、Attention机制是什么?二、推荐论文与链接三、self-attention 一、Attention机制是什么? Attention机制最早在视觉领域提出,九几年就被提出来的思想,真正火起来应该算是2014年Google Mind发表了《Recurrent Models o…

Attention详解

1.背景知识 Seq2Seq模型:使用两个RNN,一个作为编码器,一个作为解码器。 编码器:将输入数据编码成一个特征向量。 解码器:将特征向量解码成预测结果。 缺点:只将编码器的最后一个节点的结果进行了输出&am…

浅析NLP中的Attention技术

Attention(注意力机制)在NLP、图像领域被广泛采用,其显而易见的优点包括: (1)从context中捕捉关键信息; (2)良好的可视性和可解释性。 我们常用QKV模型来理解Attention&…

Attention 机制

文章目录 Attention 的本质是什么Attention 的3大优点Attention 的原理Attention 的 N 种类型 转载来源:https://easyai.tech/ai-definition/attention/ Attention 正在被越来越广泛的得到应用。尤其是 BERT 火爆了之后。 Attention 到底有什么特别之处&#xff1f…

详解Transformer中Self-Attention以及Multi-Head Attention

原文名称:Attention Is All You Need 原文链接:https://arxiv.org/abs/1706.03762 如果不想看文章的可以看下我在b站上录的视频:https://b23.tv/gucpvt 最近Transformer在CV领域很火,Transformer是2017年Google在Computation an…

Attention 一综述

近年来,注意力(Attention)机制被广泛应用到基于深度学习的自然语言处理(NLP)各个任务中。随着注意力机制的深入研究,各式各样的attention被研究者们提出,如单个、多个、交互式等等。去年6月,google机器翻译…

从Attention到Bert——1 Attention解读

下一篇从Attention到Bert——2 transformer解读 文章目录 1 Attention的发展历史2015-2017年 2 Attention的原理3 Multi-Head Attention4 Self-Attention为什么需要self-attention什么是self-attention 5 Position Embedding 最早,attention诞生于CV领域&#xff0…

Attention UNet

Attention UNet论文解析 - 知乎Attention UNet论文地址: https://arxiv.org/pdf/1804.03999.pdf 代码地址: https://github.com/ozan-oktay/Attention-Gated-NetworksAttention UNet在UNet中引入注意力机制,在对编码器每个分辨率上的特征与解…

attention

文章目录 Attention基本的Attention原理参考 Hierarchical Attention原理实践参考 Self Attentionother Attention Attention Attention是一种机制,可以应用到许多不同的模型中,像CNN、RNN、seq2seq等。Attention通过权重给模型赋予了区分辨别的能力&am…