列表

详情


44. 请你说说Attention Model

回答思路

人类视觉系统可以有选择地将注意力集中在较为显著的区域,以更好地捕捉时空间语意结构。注意力机制不仅能告诉人们何时何地关注,还能提高关注区域的表现力。

自然语言处理领域(NLP)最先引入被称为self-attention的注意力机制《Attention is all you need》 ,通过transformer模块捕捉长距离依赖特征,取得很大进展。随后注意力机制也在图像修复、超分辨率、风格迁移等计算机视觉领域得到广泛应用,常用的策略包括空间注意力、通道注意力等。

视频动作识别领域同样受益于该机制,主要可以分为spatial-wise和channel-wise两种模式。其中空间注意力模块以Non-Local为代表,主要关注不同位置特征的关系,捕获两个不同空间位置、时间位置的依赖关系。

通道级别的注意力,目的是增强最有用的通道的响应,削弱影响较小的通道的响应。考虑到直接进行对时空两个特征图进行拼接有些唐突(忽视了2D与3D之间信息的不同和相互关系)研究人员于是设计了一个新型的channel fusion和attention mechanism,来强调通道内部的相互关系,同时实现channel fuse和attention,即引入了通道融合和注意力机制。

对于计算机视觉领域任务,我们也可以通过Grad-CAM等方法将注意力图可视化出来,如图所示

左边是原图,右边可视化的注意力图,颜色越深的地方,表示模型越关注的地方。

代码示例

下面给出了两个常用的注意力模块的代码实现

#通道注意力class ChannelAttention(nn.Module):     def __init__(self,channel,reduction=16):         super().__init__()         self.maxpool=nn.AdaptiveMaxPool2d(1)         self.avgpool=nn.AdaptiveAvgPool2d(1)         self.se=nn.Sequential(             nn.Conv2d(channel,channel//reduction,1,bias=False),             nn.ReLU(),             nn.Conv2d(channel//reduction,channel,1,bias=False)         )         self.sigmoid=nn.Sigmoid()      def forward(self, x) :         max_result=self.maxpool(x)         avg_result=self.avgpool(x)         max_out=self.se(max_result)         avg_out=self.se(avg_result)         output=self.sigmoid(max_out+avg_out)         return output  #空间注意力class SpatialAttention(nn.Module):     def __init__(self,kernel_size=7):         super().__init__()         self.conv=nn.Conv2d(2,1,kernel_size=kernel_size,padding=kernel_size//2)         self.sigmoid=nn.Sigmoid()      def forward(self, x) :         max_result,_=torch.max(x,dim=1,keepdim=True)         avg_result=torch.mean(x,dim=1,keepdim=True)         result=torch.cat([max_result,avg_result],1)         output=self.conv(result)         output=self.sigmoid(output)         return output


上一题