精华内容
下载资源
问答
  • Attention.zip文件中总结了几种关于注意力机制代码,有keras和tensorflow,还有PyTorch框架的
  • 用matlab实现注意力机制模块
  • 【python】注意力机制代码

    千次阅读 2021-06-08 17:48:52
    梳理目前主流的注意力机制代码,目前以pytorch为例。 说明: 特征图维度的组织形式为:(batch,channel,height,width) 1. 正文 1.1 SEBlock 2017 考虑通道间的注意力之间的关系,在通道上加入注意力机制 论文:...

    every blog every motto: You can do more than you think.

    0. 前言

    梳理目前主流的注意力机制代码,目前以pytorch为例。
    说明:

    1. 特征图维度的组织形式为:(batch,channel,height,width)
    2. 后续增加

    1. 正文

    1.1 SEBlock 2017

    考虑通道间的注意力之间的关系,在通道上加入注意力机制
    论文:https://arxiv.org/abs/1709.01507
    代码:https://github.com/hujie-frank/SENet
    在这里插入图片描述
    对于输入特征图C2,其后加上SE注意力模块

    1.1.1 步骤

    主要分三步:

    1. squeeze,对空间维度进行压缩,代码上即利用全局平均池化将每个通道平均成一个值,该值具有全局感受野。(通俗理解:一个通道理解为一个大饼,多个通道就是多个大饼垒在一起。全局平均池化即将一个大饼平均成一个点,整体看,类似一个垒起来的色子)
      维度变化:(2,512,8,8)-> (2,512,1,1) ==> (2,512)
    2. excitation, 利用权重学习上面各通道间的相关性,代码实现有全连接和卷积核为1的卷积操作两种方式。
      维度变化:(2,512)-> (2,512//reducation)->(2,512) ==>(2,512,1,1)
      说明: 该过程先降维在升维,降维倍数由reducation参数决定,降低网络的计算量,其中的激活函数增加了网络的非线性。
    3. scale: 通过上面excitation的操作输出了每个通道的重要性,在通过乘法加权操作乘以输入数据C2,从而提升重要特征,抑制不重要特征。
      维度变化:(2,512,8,8)*(2,512,1,1) -> (2,512,16,16)

    小结: 即输入维度为(2,512,8,8),输出维度为:(2,512,8,8)
    说明: 上述步骤中的“->”表示维度变化方向,“==>”表示通过view方法改变了维度。


    1.1.2 更加清晰的理解图

    在这里插入图片描述

    说明:

    1. 全连接和1 × 1的卷积效果类似,上图显示为全连接,亦可为1*1的卷积,下同,不赘述。
    2. 激活函数位置见代码,下同。

    1.1.3 代码

    1. pytorch

    class SELayer(nn.Module):
        def __init__(self, channel, reduction=4):
            """ SE注意力机制,输入x。输入输出特征图不变
                1.squeeze: 全局池化 (batch,channel,height,width) -> (batch,channel,1,1) ==> (batch,channel)
                2.excitaton: 全连接or卷积核为1的卷积(batch,channel)->(batch,channel//reduction)-> (batch,channel) ==> (batch,channel,1,1) 输出y
                3.scale: 完成对通道维度上原始特征的标定 y = x*y 输出维度和输入维度相同
    
            :param channel: 输入特征图的通道数
            :param reduction: 特征图通道的降低倍数
            """
            super(SELayer, self).__init__()
            # 自适应全局平均池化,即,每个通道进行平均池化,使输出特征图长宽为1
            self.avg_pool = nn.AdaptiveAvgPool2d(1)
    
            # 全连接的excitation
            self.fc = nn.Sequential(
                nn.Linear(channel, channel // reduction),
                nn.ReLU(inplace=True),
                nn.Linear(channel // reduction, channel),
                nn.Sigmoid()
            )
            # 卷积网络的excitation
            # 特征图变化:
            # (2,512,1,1) -> (2,512,1,1) -> (2,512,1,1)
            self.fc2 = nn.Sequential(
                nn.Conv2d(channel, channel // reduction, 1, bias=False),
                nn.ReLU(inplace=True),
                nn.Conv2d(channel // reduction, channel, 1, bias=False),
                nn.Sigmoid()
            )
    
        def forward(self, x):
            # (batch,channel,height,width) (2,512,8,8)
            b, c, _, _ = x.size()
            # 全局平均池化 (2,512,8,8) -> (2,512,1,1) -> (2,512)
            y = self.avg_pool(x).view(b, c)
            # (2,512) -> (2,512//reducation) -> (2,512) -> (2,512,1,1)
            y = self.fc(y).view(b, c, 1, 1)
            # (2,512,8,8)* (2,512,1,1) -> (2,512,8,8)
            pro = x * y
            return x * y
    

    2. tensorflow/keras

    # SEBlock
    feature_map_shape = input_x.shape  # input feature map shape
    x = tf.reduce_mean(x, [1, 2])  # reduce along axis 1 and 2 ,height,width,
    x = Dense(feature_map_shape[-1] / 16, activation=tf.nn.relu)(x)  # (batch,channel) -> (batch,channel/16)
    x = Dense(feature_map_shape[-1], activation=tf.nn.relu)(x)  # (batch,channel/16) -> (batch,channel)
    x = tf.multiply(input_x, x)  # multiply along channel
    

    说明:

    1. 当使用全连接时,forward中平均池 (squeeze),
    # 全局平均池化 (2,512,8,8) -> (2,512,1,1) -> (2,512)
    y = self.avg_pool(x).view(b, c)
    
    1. 当使用1*1卷积,forward中平均池化(squeeze),
    # 全局平均池化 (2,512,8,8) -> (2,512,1,1) 
    y = self.avg_pool(x)
    

    1.2 CBAM 2018

    论文:https://arxiv.org/abs/1807.06521
    代码:https://github.com/luuuyi/CBAM.PyTorch
    CBAM可以无缝集成任何CNN架构中,开销不大,早期的注意力机制一种。
    在这里插入图片描述
    实验结果表明:顺序链接比并行连接好,其中通道注意力在前优于空间注意力在前。

    1.2.1 通道注意力机制

    1.2.1.1 概述

    通道注意力机制和上面的SEBlock类似,唯一不同的是加了一个最大池化。而后,最大池化和平均池化共用一个多层感知机(mlp), 再将结果相加和输入特征图进行点乘传入空间注意力机制。
    说明: 主要步骤省略,可参考SEBlock和下面代码中的注释。
    在这里插入图片描述

    1.2.1.2 更加清晰的理解图

    在这里插入图片描述

    1.2.1.3 代码

    说明: forward中,为了方便理解,展开书写了,等价于最开始注释了的几行。

    class ChannelAttention(nn.Module):
        def __init__(self, in_channel, ratio=16):
            """ 通道注意力机制 同最大池化和平均池化两路分别提取信息,后共用一个多层感知机mlp,再将二者结合
    
            :param in_channel: 输入通道
            :param ratio: 通道降低倍率
            """
            super(ChannelAttention, self).__init__()
            # 平均池化
            self.avg_pool = nn.AdaptiveAvgPool2d(1)
            # 最大池化
            self.max_pool = nn.AdaptiveMaxPool2d(1)
    
            # 通道先降维后恢复到原来的维数
            self.fc1 = nn.Conv2d(in_channel, in_channel // ratio, 1, bias=False)
            self.relu1 = nn.ReLU()
            self.fc2 = nn.Conv2d(in_channel // ratio, in_channel, 1, bias=False)
            self.sigmoid = nn.Sigmoid()
    
        def forward(self, x):
            # 平均池化
            # avg_out = self.fc2(self.relu1(self.fc1(self.avg_pool(x))))
            # 最大池化
            # max_out = self.fc2(self.relu1(self.fc1(self.max_pool(x))))
    		# out = avg_out + max_out
            # return x*self.sigmoid(out)
            
            # 平均池化一支 (2,512,8,8) -> (2,512,1,1) -> (2,512/ration,1,1) -> (2,512,1,1)
            # (2,512,8,8) -> (2,512,1,1)
            avg = self.avg_pool(x)
            # 多层感知机mlp (2,512,8,8) -> (2,512,1,1) -> (2,512/ration,1,1) -> (2,512,1,1)
            # (2,512,1,1) -> (2,512/ratio,1,1)
            avg = self.fc1(avg)
            avg = self.relu1(avg)
            # (2,512/ratio,1,1) -> (2,512,1,1)
            avg_out = self.fc2(avg)
    
            # 最大池化一支
            # (2,512,8,8) -> (2,512,1,1)
            max = self.max_pool(x)
            # 多层感知机
            # (2,512,1,1) -> (2,512/ratio,1,1)
            max = self.fc1(max)
            max = self.relu1(max)
            # (2,512/ratio,1,1) -> (2,512,1,1)
            max_out = self.fc2(max)
    
            # (2,512,1,1) + (2,512,1,1) -> (2,512,1,1)
            out = avg_out + max_out
            return x*self.sigmoid(out)
    

    1.2.2 空间注意力机制

    1.2.2.1 概述

    将空间注意力机制的的结果作为新的输入特征图,主要步骤:

    1. 输入特征图,经过最大池化,平均池化(通道维度压缩,与前面的通道注意力机制不同)
      维度变化:(2,512,8,8 ) -> (2,1,8,8)
    2. 将最大池化和平均池化在通道方向上合并
      维度变化:(2,1,8,8)+ (2,1,8,8) -> (2,2,8,8)
      3.经过卷积,通道变为1,再经过激活函数
      维度变化:(2,2,8,8)-> (2,1,8,8)
    3. 和输入特征图点乘
      维度变化:(2,512,8,8) * (2,1,8,8) -> (2,512,8,8)
      在这里插入图片描述

    1.2.2.2 更加清晰的理解图

    说明: 下面两种图例其实是一个意思,即,单通道特征图,为了看起来更加清晰用了两种颜色。
    在这里插入图片描述

    1.2.2.3 代码

    class SpatialAttention(nn.Module):
        def __init__(self, kernel_size=7):
            """ 空间注意力机制 将通道维度通过最大池化和平均池化进行压缩,然后合并,再经过卷积和激活函数,结果和输入特征图点乘
    
            :param kernel_size: 卷积核大小
            """
            super(SpatialAttention, self).__init__()
    
            assert kernel_size in (3, 7), 'kernel size must be 3 or 7'
            padding = 3 if kernel_size == 7 else 1
    
            self.conv1 = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False)
            self.sigmoid = nn.Sigmoid()
    
        def forward(self, x):
            print('x shape', x.shape)
            # (2,512,8,8) -> (2,1,8,8)
            avg_out = torch.mean(x, dim=1, keepdim=True)
            # (2,512,8,8) -> (2,1,8,8)
            max_out, _ = torch.max(x, dim=1, keepdim=True)
            # (2,1,8,8) + (2,1,8,8) -> (2,2,8,8)
            cat = torch.cat([avg_out, max_out], dim=1)
            # (2,2,8,8) -> (2,1,8,8)
            out = self.conv1(cat)
            return x * self.sigmoid(out)
    
    
    展开全文
  • Attention 是一种通用的带权池化方法,输入由两部分构成:询问(query)和...点积注意力 class DotProductAttention(nn.Module): def __init__(self, dropout, **kwargs): super(DotProductAttention, self).__init_
  • import math import torch import torch.nn as nn import os def file_name_walk(file_dir): for root, dirs, files in os.walk(file_dir): # print(root, root) # 当前目录路径 print(dirs, dirs) # 当前路径下...
  • 但为什么还要引入注意力机制呢?计算能力的限制:当要记住很多“信息“,模型就要变得更复杂,然而目前计算能力依然是限制神经网络发展的瓶颈。 优化算法的限制:虽然局部连接、权重共享以及pooling等优化操作可以让...
  • 论文基于注意力机制的卷积神经网络模型源代码 要求 python2.7 keras 2.0 斯克莱恩 麻木 keras后端= theano 论文中提出一种基于注意力机制的卷积神经网络模型 文件说明: 先生:电影评论数据集,分为两个文件,一个...
  • 汇总了自Non-local和SENet之后的十几篇发表于CVPR/ICCV的经典的注意力方法,包括cbam、a2net、psanet、danet、apcnet、sknet、ccnet、gcnet、annnet、ocrnet、sanet、ecanet
  • 针对这些问题,提出了一种基于注意力机制的特征融合算法。该算法利用注意力机制来融合不同尺度的特征,通过对每个通道的特征进行权重分配来学习不同通道间特征的相关性。将基于注意力机制的特征融合算法与YOLO V3相...
  • Attention机制的本质来自于人类视觉注意力机制。人们视觉在感知东西的时候一般不会是一个场景从到头看到尾每次全部都看,而往往是根据需求观察注意特定的一部分。而且当人们发现一个场景经常在某部分出现自己想观察...
  • import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np import os import pandas as pd import sklearn import sys import tensorflow as tf import time from tensorflow import keras ...
  • 针对基于深度学习的传统方法对于次显著细节信息关注不足的问题,提出一种基于多尺度注意力机制的多分支网络来统筹图像的显著信息及次显著信息。首先,将多尺度特征融合方法(MSFF)与注意力机制相结合,设计了一个多尺度...
  • 作为一种代表性的图卷积网络,Graph Attention Network (GAT) 引入了注意力机制来实现更好的邻居聚合。通过学习邻居的权重,GAT 可以实现对邻居的加权聚合。因此,GAT 不仅对于噪音邻居较为鲁棒,注意力机制也赋予了...
  • 代码为基于RNN的Tensorflow实现文本分类任务的注意力机制,笔者亲测有效,不需要环境配置等,欢迎大家下载。
  • Implementations for a whole family of attention-mechanisms, tailored for many-to-one sequence tasks and compatible with TensorFlow 2.0 with Keras integration.
  • 即注意力权重施加的方式和位置不同,将注意力机制分为空间域、通道域和混合域三种,并且介绍了一些关于这些不同注意力的先进注意力模型,仔细分析了他们的的设计方法和应用领域,给出了实现的代码与实验结果。...

    原文链接:

    图像处理注意力机制Attention汇总(附代码,SE、SK、ECA、CBAM、DA、CA等)

    1. 介绍

    注意力机制(Attention Mechanism)是机器学习中的一种数据处理方法,广泛应用在自然语言处理(NLP)、图像处理(CV)及语音识别等各种不同类型的机器学习任务中。根据注意力机制应用于域的不同,即注意力权重施加的方式和位置不同,将注意力机制分为空间域、通道域和混合域三种,并且介绍了一些关于这些不同注意力的先进注意力模型,仔细分析了他们的的设计方法和应用领域,给出了实现的代码与实验结果。

    https://github.com/ZhugeKongan/Attention-mechanism-implementation

    2. 空间域注意力方法

    对于卷积神经网络,CNN每一层都会输出一个C x H x W的特征图,C就是通道,同时也代表卷积核的数量,亦为特征的数量,H 和W就是原始图片经过压缩后的图的高度和宽度,而空间注意力就是对于所有的通道,在二维平面上,对H x W尺寸的特征图学习到一个权重矩阵,对应每个像素都会学习到一个权重。而这些权重代表的就是某个空间位置信息的重要程度 ,将该空间注意力矩阵附加在原来的特征图上,增大有用的特征,弱化无用特征,从而起到特征筛选和增强的效果。代表的Self-Attention、Non-local Attention以及Spatial Transformer等。

    2.1 自注意力:Self-Attention

    自注意力是目前应用最广泛的注意力机制之一,self-attention及其变体广泛应用与自然语言处理、图像处理及语音识别的各个领域,特别是NLP领域,基于self-attention的Transformer结构已经成为NLP技术的基石。CV领域的self-attention也来源于NLP,甚至在某些分割、识别任务上直接套用NLP的Transformer结构并且取得了非常好的结果。

    自注意力的结构下图所示,它是从NLP中借鉴过来的思想,因此仍然保留了Query, Key和Value等名称。对应图中自上而下分的三个分支,计算时通常分为三步:

    (1) 第一步是将query和每个key进行相似度计算得到权重,常用的相似度函数有点积,拼接,感知机等;

    (2) 第二步一般是使用一个softmax函数对这些权重进行归一化,转换为注意力;

    (3) 第三步将权重和相应的键值value进行加权求和得到最后的attention。

    自注意力是基于特征图本身的关注而提取的注意力。对于卷积而言,卷积核的设置限制了感受野的大小,导致网络往往需要多层的堆叠才能关注到整个特征图。而自注意的优势就是它的关注是全局的,它能通过简单的查询与赋值就能获取到特征图的全局空间信息。

    2.2 非局部注意力:Non-local Attention

    Non-local Attention是研究self-attention在CV领域应用非常重要的文章。主要思想也很简单,CNN中的卷积单元每次只关注邻域kernel size 的区域,就算后期感受野越来越大,终究还是局部区域的运算,这样就忽略了全局其他片区(比如很远的像素)对当前区域的贡献。所以Non-local blocks 要做的是,捕获这种long-range 关系:对于2D图像,就是图像中任何像素对当前像素的关系权值;对于3D视频,就是所有帧中的所有像素,对当前帧的像素的关系权值。

    论文中有谈及多种实现方式,在这里简单说说在深度学习框架中最好实现的Matmul 方式,如上所示:

    (1) 首先对输入的feature map X 进行线性映射(说白了就是1*1*1 卷积,来压缩通道数),然后得到θ,Φ,g特征;

    (2) 通过reshape操作,强行合并上述的三个特征除通道数外的维度,然后对θ,Φ进行矩阵点乘操作,得到类似协方差矩阵的东西(这个过程很重要,计算出特征中的自相关性,即得到每帧中每个像素对其他所有帧所有像素的关系);

    (3) 然后对自相关特征以列或以行(具体看矩阵g 的形式而定) 进行Softmax 操作,得到0~1的权重,这里就是我们需要的Self-attention 系数;

    (4) 最后将attention系数,对应乘回特征矩阵g 中,然后再与原输入的特征图残差一下,获得non-local block的输出。

    3. 通道域注意力方法

    不同与空间注意力,通道域注意力类似于给每个通道上的特征图都施加一个权重,来代表该通道与关键信息的相关度的话,这个权重越大,则表示相关度越高。在神经网络中,越高的维度特征图尺寸越小,通道数越多,通道就代表了整个图像的特征信息。如此多的通道信息,对于神经网络来说,要甄别筛选有用的通道信息是很难的,这时如果用一个通道注意力告诉该网络哪些是重要的,往往能起到很好的效果,这时CV领域做通道注意力往往比空间好的一个原因。代表的是SENet、SKNet、ECANet等。

    3.1 SENet

    如果说Self-Attention是NLP领域的神,那么SE注意力就是CV领域的真神。如果你想为你的网络提高精度,那么SE注意力是一个很好的选择。SE注意力在CV领域有很强的普适性,任何网络添加上SE注意力基本都能有一定提升。该论文就是靠着这个模型获得了ImageNet的冠军。

    上图是SENet的模型结构,该注意力机制主要分为三个部分:挤压(squeeze),激励(excitation),以及注意(scale )。

    首先是 Squeeze 操作,从空间维度来进行特征压缩,将h*w*c的特征变成一个1*1*c的特征,得到向量某种程度上具有全域性的感受野,并且输出的通道数和输入的特征通道数相匹配,它表示在特征通道上响应的全域性分布。算法很简单,就是一个全局平均池化。

    其次是 Excitation 操作,通过引入 w 参数来为每个特征通道生成权重,其中 w 就是一个多层感知器,是可学习的,中间经过一个降维,减少参数量。并通过一个 Sigmoid 函数获得 0~1 之间归一化的权重,完成显式地建模特征通道间的相关性。

    最后是一个 Scale 的操作,将 Excitation 的输出的权重看做是经过选择后的每个特征通道的重要性,通过通道宽度相乘加权到先前的特征上,完成在通道维度上的对原始特征的重标定。

    3.2 SKNet

    SKNet是基于SENet的改进,他的思路是在提高精度。而很多网络使用了各种Trick来降低计算量,比如SENet多层感知机间添加了降维。SKNet就是想如果不牺牲那么多计算量,能否精度提高一些呢?因此它设置了一组动态卷积选择来实现精度提升。

    上图所示是SKNet的基本结构。主要创新点是设置了一组动态选择的卷积,分为三个部分操作Split、Fuse、Select。

    (1)Split:对输入向量X进行不同卷积核大小的完整卷积操作(组卷积),特别地,为了进一步提升效率,将5x5的传统卷积替代为dilation=2,卷积核为3x3的空洞卷积;

    (2)Fuse:类似SE模块的处理,两个feature map相加后,进行全局平均池化操作,全连接先降维再升维的为两层全连接层,输出的两个注意力系数向量a和b,其中a+b=1;

    (3)Select:Select操作对应于SE模块中的Scale。Select使用a和b两个权重矩阵对之前的两个feature map进行加权操作,它们之间有一个类似于特征挑选的操作。

    4. 混合域注意力方法

    除了前面两章提到的空间域和通道域注意力,在CV领域应用更广的还有它们之间的结合,即空间与通道结合的混合域注意力机制。思想也是很简单,通道和空间对网络都有提升作用,那么它们间的有效结合必定会给网络带来更大的促进作用。根据DL任务的不同,它们结合方式也存在区别,有代表性的是CBAM、DANet、CCNet、Residual Attention等

    4.1 CBAM

    CBAM来自于 ECCV2018的文章Convolutional Block Attention Module,是如今CV领域注意力食物链顶端的存在。它也是基于SENet的改进,具体来说,论文中把 channel-wise attention 看成是教网络 Look ‘what’;而spatial attention 看成是教网络 Look ‘where’,所以它比 SE Module 的主要优势就多了后者。

    上图所示是CBAM的基本结构,前面是一个使用SENet的通道注意力模块,后面的空间注意力模块设计也参考了SENet,它将全局平均池化用在了通道上,因此作用后就得到了一个二维的空间注意力系数矩阵。值得注意的是,CBAM在空间与通道上同时做全局平均和全局最大的混合pooling,能够提取到更多的有效信息。

    4.2 DANet

    DANet来自于CVPR 2019的文章Dual Attention Network for Scene Segmentation,注意思想也是参考了上述提到的CBAM 和Non-local 的融合变形。具体来说就是,结构框架使用的是CBAM,具体方法使用的是self-attention。

    上图所示是DANet注意力模块的基本结构,主要包括Position Attention Module 和 Channel Attention Module。两个模块使用的方法都是self-attention,只是作用的位置不同,一个是空间域的self-attention,一个是通道域的self-attention。这样做的好处是:在CBAM 分别进行空间和通道self-attention的思想上,直接使用了non-local 的自相关矩阵Matmul 的形式进行运算,避免了CBAM 手工设计pooling,多层感知器等复杂操作。同时,把Self-attention的思想用在图像分割,可通过long-range上下文关系更好地做到精准分割。

    5 实验

    为了评估各种注意力机制的性能,我们在CIFAR-100上进行了的实验。对每组实验,我们都以Resnet18为Baseline,训练160epoch,初始学习率为0.1,80epoch调整到0.01,160epoch时调整到0.001。Batch size设置为128,实验带momentum的SGD优化器。读取输入时,首先进行随机裁剪和随机翻转的数据增强。特别地,为最大化注意力效果,实验开始时我们都进行1个epoch的warm-up操作,取最好5个epoch的平均作为最后结果。

    可以看出,综合性能混合域注意力表现出较好的性能,空间域注意力的表现是最差的,其中一个原因是空间注意力应用与空间特征图上,但cifar100图像分辨有限(32*32),因此空间注意力并没有表现出很好的增强效果。通道注意力表现出很好的普适性,其中SKNet在这几组实验中获得了最好表现,这归因与其动态卷积核的设置,但相比其他轻量级的注意力,它需要占据更多的内存和参数量,而且组卷积的并行设置会导致训练速度变慢。

    代码附件:

    https://github.com/ZhugeKongan/Attention-mechanism-implementation

    展开全文
  • Attention:注意力机制在Keras当中的实现 目录 所需环境 tensorflow-gpu==1.13.1 keras==2.1.5 LSTM中的注意力机制 在本库中,我将注意力机制施加在LSTM的Step上,目的是注意输入进来的样本,每一个Step的重要程度。...
  • 提出了Attention-YOLO算法,该算法借鉴了基于项的注意力机制,将通道注意力及空间注意力机制加入特征提取网络之中,使用经过筛选加权的特征向量来替换原有的特征向量进行残差融合,同时添加二阶项来减少融合过程中的...
  • 注意力机制

    2021-01-07 01:24:44
    注意力机制 在“编码器—解码器(seq2seq)”⼀节⾥,解码器在各个时间步依赖相同的背景变量(context vector)来获取输⼊序列信息。当编码器为循环神经⽹络时,背景变量来⾃它最终时间步的隐藏状态。将源序列输入...
  • Keras的多对一注意力机制。 通过pip安装 pip install attention 导入源代码 from attention import Attention # [...] m = Sequential ([ LSTM ( 128 , input_shape = ( seq_length , 1 ), return_sequences = ...
  • GATE的pytorch实现,图自编码器+注意力机制
  • 盖特 这是关于图注意力网络的代码实现
  • 注意力模型Python程序

    2019-03-14 17:36:50
    提供详细的注意力模型的python程序,并提供具体实例验证
  • 自然语言处理,对文本进行分类,也适用于恶意代码API函数序列分类
  • 与以往的事件检测方法相比,本文将两类任务视作同一个任务,避免了上游任务对下游任务的影响,使用神经网络学习特征,引入注意力机制突出重点信息。在MELL语料上进行生物事件抽取实验,结果表明准确率和召回率较高,...
  • 相反,人类将注意力集中于局部视觉空间,以便在需要的时间和场合获取信息并对不同时段的信息进行合并,构建内在场景表现,指导日后的注意力分配及决策过程。 《视觉注意循环模型》,2014 本文将探讨如何实施注意...

     

    全文共3028字,预计学习时长6分钟

     

    图片来源:unsplash.com/@titouanc

    人类感知的一个重要特质在于个体无法同时处理全部信息。相反,人类将注意力集中于局部视觉空间,以便在需要的时间和场合获取信息并对不同时段的信息进行合并,构建内在场景表现,指导日后的注意力分配及决策过程。

    《视觉注意循环模型》,2014

    本文将探讨如何实施注意力,以及在实施过程如何脱离更大的模型。这是因为在现实模型中实施注意力时,很多时的重点在于管理数据与控制不同的向量,而非注意力本身。

    我们将在进行注意力评分的同时计算注意文本向量。

    左:层次式点积注意力机制 右:以下将计算的多头注意力机制

    注意力评分:

    首先浏览一下评分功能的输入。假设处于解码阶段的第一步骤。评分功能的首个输入是解码器的隐藏状态(假定一循环神经网络有三个隐藏节点——尽管在实际应用中并不稳定,但便于说明)。

    dec_hidden_state = [5,1,20]

    将向量视觉化:

    %matplotlib inlineimport numpy as npimport matplotlib.pyplot as pltimport seaborn as sns

    将解码器隐藏状态视觉化:

    plt.figure(figsize=(1.5, 4.5))sns.heatmap(np.transpose(np.matrix(dec_hidden_state)), 
    annot=True, cmap=sns.light_palette(“purple”, as_cmap=True), linewidths=1)

    结果如下:

    评分功能首次运行的结果是单一注释(编码器隐藏状态),如下所示:

    annotation = [3,12,45] #e.g. Encoder hidden state

    将单一注释视觉化:

    plt.figure(figsize=(1.5, 4.5))sns.heatmap(np.transpose(np.matrix(annotation)), 
    annot=True, cmap=sns.light_palette(“orange”, as_cmap=True), linewidths=1)

    实施:为单一注释评分

    计算单一注释的点积。

    NumPy点参与此运算过程:

    def single_dot_attention_score(dec_hidden_state, enc_hidden_state):
    #return the dot product of the two vectors return np.dot
    (dec_hidden_state, enc_hidden_state) single_dot_attention_score
    (dec_hidden_state, annotation)

    结果:927

    注释矩阵

    来看一下如何同时对所有注释评分。为实现这一目的,形成注释矩阵如下:

    annotations = np.transpose([[3,12,45], [59,2,5], [1,43,5], [4,3,45.3]])

    可将其视觉化如下(每一栏都是编码器时间步骤的隐藏状态):

    ax = sns.heatmap(annotations, annot=True, cmap=sns.light_palette(“orange”, as_cmap=True), 
    linewidths=1)

    实施:同时对所有注释评分

    应用矩阵操纵计算所有注释评分。继续使用点积评分方法,但首先需要转置dec_hidden_state状态,而后使用矩阵注释扩充。

    def dot_attention_score(dec_hidden_state, annotations): 
    # return the product of dec_hidden_state transpose and enc_hidden_states 
    return np.matmul(np.transpose(dec_hidden_state), annotations)
    attention_weights_raw = dot_attention_score(dec_hidden_state, annotations)
    attention_weights_raw

    获得评分后,应用柔性最大值传输函数:

    def softmax(x): x = np.array(x, dtype=np.float128) e_x = np.exp(x) 
    return e_x / e_x.sum(axis=0)attention_weights = softmax(attention_weights_raw)
    attention_weights

    重新对注释评分

    评分后,根据评分对每个注释进行扩充,进而得到一个注意力文本向量。下方为该公式的扩充部分(将解决括号中的部分)。

    def apply_attention_scores(attention_weights, annotations): 
    # Multiple the annotations by their weights return attention_weights 
    * annotationsapplied_attention = apply_attention_scores
    (attention_weights, annotations)applied_attention

    已对注意力重新评分,接下来将文本向量视觉化:

    # Let’s visualize our annotations after applying 
    attention to themax = sns.heatmap(applied_attention, annot=True, cmap=sns.
    light_palette(“orange”, as_cmap=True), linewidths=1)

    将结果与视觉化的原始注释对比,可发现第二和第三个注释(栏)几乎被擦除。第一个注释保留部分值,而第四个注释的代表性最强。

    计算注意力文本向量

    所有持续生成注意力文本向量的部分将总结为这四栏,进而生成单一注意力文本向量。

    def calculate_attention_vector(applied_attention): 
    return np.sum(applied_attention, axis=1)attention_vector = calculate_
    attention_vector(applied_attention)attention_vector
    # Let’s visualize the attention context vectorplt.figure(figsize=(1.5, 4.5))sns.
    heatmap(np.transpose(np.matrix(attention_vector)), annot=True, cmap=sns.
    light_palette(“Blue”, as_cmap=True), linewidths=1)

    现在我们已有了文本向量,可将其与隐藏状态连接,并穿过一隐藏层提供该解码时间步骤的结果。

    代码传送门:Attention Basics:https://github.com/Garima13a/Attention-Mechanism-Basics

    留言 点赞 关注

    我们一起分享AI学习与发展的干货
    欢迎关注全平台AI垂类自媒体 “读芯术”

    展开全文
  • ”,其中,如果注意力机制总是提供类似的标注权重,作者提出了一个额外的正则化损失的度量,以防止嵌入矩阵的冗余问题。 全局(软)注意力 Dzmitry Bahdanau等人在 Neural Machine Translation by Jointly Learning ...

    点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”


    者:ongunuzaymacar

    编译:ronghuaiyang

    导读

    之前给大家介绍了一些attention相关的内容,今天给大家分享一个github仓库,实现了attention家族的几乎所有的类型,而且即插即用,非常方便。


    介绍

    这个仓库包含了对整个注意力机制家族的自定义层的实现,兼容TensorFlow和Keras。注意力机制改变了机器翻译,其在自然语言处理领域的应用日益广泛。从更广泛的意义上说,它们的目标是消除由RNNs中输入序列产生的隐藏状态的固定长度编码而导致的信息压缩和丢失。这个仓库中的层是专门为多对一序列任务定制的,比如情感分类和语言模型。

    注意力机制的类型

    640?wx_fmt=png

    自注意力机制

    程建鹏等在“Long Short-Term Memory-Networks for Machine Reading”中首次提出。其思想是将来自输入序列的相同隐藏状态空间的不同位置关联起来,基于多个组件共同构成序列的整体语义这一论点。这种方法通过多跳注意力将这些不同位置的信息组合在一起。这种特殊的实现遵循了周汉林等人的“A Structured Self-Attentive Sentence Embedding”,其中,如果注意力机制总是提供类似的标注权重,作者提出了一个额外的正则化损失的度量,以防止嵌入矩阵的冗余问题。

    640?wx_fmt=png

    全局(软)注意力

    Dzmitry Bahdanau等人在Neural Machine Translation by Jointly Learning to Align and Translate中首次提出这个概念。其思想是基于编码器RNN的所有隐藏状态,推导出一个上下文向量。因此,这种类型的注意力关注的是整个输入状态空间。

    640?wx_fmt=png

    局部(硬)注意力

    徐立文等在"Show, Attend and Tell: Neural Image title Generation with Visual Attention"中首次引入,Minh-Thang Luong等人在Effective Approaches to Attention-based Neural Machine Translation中将其应用于NLP中。其思想是通过将注意力集中在从输入序列派生出来的隐藏状态集合中的一小部分token上,从而减少全局注意力的成本。这个窗口为 [p_t-D,p_t+D],其中 D=width,我们忽略了跨越序列边界的位置。对齐位置 p_t通过a)单调对齐: 令 p_t=t,或b)预测对齐:令 p_t=S*sigmoid(FC1(tanh(FC2(h_t))) ,其中全连接层是可训练的权重矩阵。由于 tf.cast()和类似的方法,生成整数索引值是不可微的,因此该实现派生一个对齐的位置的浮点值,并使用高斯分布来调整所有源隐藏状态的注意力权重,而不是切割实际窗口。我们还提出了一个实验性的对齐类型,c)完全预测对齐:设置 p_t,如ii)中所示,但是将它应用于所有源隐藏状态( h_s),而不是目标隐藏状态( h_t)。然后,选择顶部的 @window_width 位置来构建上下文向量,其余部分为零。

    640?wx_fmt=png

    对齐函数

    640?wx_fmt=png

    每个函数都会计算给定目标隐藏状态( h_t)和源隐藏状态( h_s的对齐分数。

    640?wx_fmt=png

    其中H为编码器RNN给出的隐藏状态数,其中Wa和va为可训练权矩阵。

    实现细节

    • 应该注意的是,每一层都只在多对一序列生成中使用应用程序进行测试,但是理论上应该能够适应其他领域,只需要稍微调整。一个明显的想法是用 tf.keras.layers.TimeDistributed()为多对多序列任务包装层。

    • -每一层都是 tf.keras.layers.Layer()的子类。

    • 每个自定义类的 __init__()方法调用其父类的初始化方法,并定义特定于每个层的其他属性。

    • get_config()方法调用其父方法的配置方法,并定义该层引入的自定义属性。

    • 如果自定义层包含方法 build(),则它包含可训练参数。以 Attention()层为例,输入需要更多关注的损失信号的反向传播表明该层的权重发生了变化。

    • call()方法是对输入张量执行的实际操作。

    • compute_output_shape()方法避免使用间距。

    例子

    这些层可以在几秒钟内插入到你的项目中(无论是语言模型还是其他类型的RNNs),就像使用Keras中集成的任何其他TensorFlow层一样。请看下面的例子:

    from tensorflow.keras.layers import Input, Embedding, LSTM, Dense	
    from layers import Attention, SelfAttention	
    X = Input(shape=(sequence_length,), batch_size=batch_size) # define input layer for summary	
    ## Token Embedding (Pretrained or Not) ##	
    embedding = Embedding(input_dim=vocabulary_size, output_dim=embedded_dimensions)(X)	
    ## Encoding Recurrent Layers ##	
    encoder = LSTM(units=recurrent_units, return_sequences=True)(embedding) # keep timesteps	
    ## Decoding with Attention ##	
    decoder = Attention(size=attention_size, alignment_type=attention_type)(encoder)	
    ## Prediction Layer ##	
    Y = Dense(units=vocabulary_size, activation='softmax')(decoder)

    其中 alignment_type是 'global''local-m''local-p', 和 'local-p*'其中之一。对于自注意力,调用 SelfAttention(size=attention_size) 层。

    资源

    • 上面提到的所有的论文

    • https://www.tensorflow.org/beta/tutorials/text/nmtwithattention

    • https://github.com/philipperemy/keras-attention-mechanism/issues/14

    • https://lilianweng.github.io/lil-log/2018/06/24/attention-attention.html

    640?wx_fmt=png— END—

    原文:https://github.com/ongunuzaymacar/attention-mechanisms

    640?wx_fmt=jpeg

    请长按或扫描二维码关注本公众号

    喜欢的话,请给我个好看吧640?wx_fmt=gif


    展开全文
  • LSTM(RNN)中的注意力机制

    千次阅读 2021-03-16 16:56:54
    参考: 睿智的seq2seq模型3——注意力机制概念详解与其在LSTM中的使用 bilibili视频
  • 注意力机制BAM和CBAM详细解析(附代码

    万次阅读 多人点赞 2020-04-26 00:17:41
    论文题目①:BAM: Bottleneck Attention Module 论文题目②:CBAM:CBAM: Convolutional Block Attention Module Bottlenet attention Module(BAM...因此,作者提出了BAM注意力机制,仿照人的眼睛聚焦在图像几个重...
  • 注意力机制使用;卷积神经网络的变体keras实现

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 146,115
精华内容 58,446
关键字:

注意力机制代码