精华内容
下载资源
问答
  • 网络用户查看跨网站时间分配的热图 使用此书签,您可以在每个网站上放置一个热图,显示普通 Web 用户如何在网站上分配他们的查看时间。 它对于开始登录页面并决定其布局的 Web 项目经理和设计师很有用。 这个怎么...
  • 作为一种代表性的图卷积网络,Graph Attention Network (GAT) 引入了注意力机制来实现更好的邻居聚合。通过学习邻居的权重,GAT 可以实现对邻居的加权聚合。因此,GAT 不仅对于噪音邻居较为鲁棒,注意力机制也赋予了...
  • 注意力机制在卷积网络的优化中,以及被广泛的使用。下面介绍几种非常著名的,应用于特征提取网络的注意力机制。SEnetSEnet(Squeeze-and-Excitation Network)考虑了特征通道之间的关系,在特征通道上加入了注意力...

    f2b92fefbb8f4d542657343a00e55300.png

    注意力机制在卷积网络的优化中,以及被广泛的使用。下面介绍几种非常著名的,应用于特征提取网络的注意力机制。

    • SEnet

    SEnet(Squeeze-and-Excitation Network)考虑了特征通道之间的关系,在特征通道上加入了注意力机制。

    SEnet通过学习的方式自动获取每个特征通道的重要程度,并且利用得到的重要程度来提升特征并抑制对当前任务不重要的特征。SEnet通过Squeeze模块和Exciation模块实现所述功能。

    ad6d66011fca248c6399582cc2bef748.png

    如上图所示,首先作者通过squeeze操作,对空间维度进行压缩,直白的说就是对每个特征图做全局池化,平均成一个实数值。该实数从某种程度上来说具有全局感受野。作者提到该操作能够使得靠近数据输入的特征也可以具有全局感受野,这一点在很多的任务中是非常有用的。

    紧接着就是excitaton操作,由于经过squeeze操作后,网络输出了1*1*C大小的特征图,作者利用权重w来学习C个通道直接的相关性。在实际应用时有的框架使用全连接,有的框架使用1*1的卷积实现,从参数计算角度我更加推荐使用1*1卷积,也就是下面代码中的fc2操作。该过程中作者先对C个通道降维再扩展回C通道。好处就是一方面降低了网络计算量,一方面增加了网络的非线性能力。

    最后一个操作时将exciation的输出看作是经过特征选择后的每个通道的重要性,通过乘法加权的方式乘到先前的特征上,从事实现提升重要特征,抑制不重要特征这个功能。

    SEnet的实现代码如下:

    #https://github.com/Amanbhandula/AlphaPose/blob/master/train_sppe/src/models/layers/SE_module.py
    class SELayer(nn.Module):
        def __init__(self, channel, reduction=1):
            super(SELayer, self).__init__()
            self.avg_pool = nn.AdaptiveAvgPool2d(1)
            self.fc1 = nn.Sequential(
                nn.Linear(channel, channel / reduction),
                nn.ReLU(inplace=True),
                nn.Linear(channel / reduction, channel),
                nn.Sigmoid())
            self.fc2 = nn.Sequential(
                nn.Conv2d(channel , channel / reduction, 1, bias=False)
                nn.ReLU(inplace=True),
                nn.Conv2d(channel , channel / reduction, 1, bias=False)
                nn.Sigmoid()
            )
    
        def forward(self, x):
            b, c, _, _ = x.size()
            y = self.avg_pool(x).view(b, c)
            y = self.fc1(y).view(b, c, 1, 1)
            return x * y
    • CBAM

    CBAM(Convolutional Block Attention Module)结合了特征通道和特征空间两个维度的注意力机制。

    CBAM通过学习的方式自动获取每个特征通道的重要程度,和SEnet类似。此外还通过类似的学习方式自动获取每个特征空间的重要程度。并且利用得到的重要程度来提升特征并抑制对当前任务不重要的特征。

    0421e9728cbbb6004f9a1279d3cf55f8.png

    CBAM提取特征通道注意力的方式基本和SEnet类似,如下ChannelAttention中的代码所示,其在SEnet的基础上增加了max_pool的特征提取方式,其余步骤是一样的。将通道注意力提取厚的特征作为空间注意力模块的输入。

    fc51d6b9e961992b4999c2d35affaff6.png

    CBAM提取特征空间注意力的方式:经过ChannelAttention后,最终将经过通道重要性选择后的特征图送入特征空间注意力模块,和通道注意力模块类似,空间注意力是以通道为单位进行最大和平均迟化,并将两者的结果进行concat,之后再一个卷积降成1*w*h的特征图空间权重,再将该权重和输入特征进行点积,从而实现空间注意力机制。

    7ee9e896c96d9c74170cf4319b5d5891.png

    CBAM的实现代码如下:

    #https://github.com/luuuyi/CBAM.PyTorch/blob/master/model/resnet_cbam.py
    class ChannelAttention(nn.Module):
        def __init__(self, in_planes, ratio=16):
            super(ChannelAttention, self).__init__()
            self.avg_pool = nn.AdaptiveAvgPool2d(1)
            self.max_pool = nn.AdaptiveMaxPool2d(1)
    
            self.fc1   = nn.Conv2d(in_planes, in_planes / 16, 1, bias=False)
            self.relu1 = nn.ReLU()
            self.fc2   = nn.Conv2d(in_planes / 16, in_planes, 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 self.sigmoid(out)
    #https://github.com/luuuyi/CBAM.PyTorch/blob/master/model/resnet_cbam.py
    class SpatialAttention(nn.Module):
        def __init__(self, kernel_size=7):
            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):
            avg_out = torch.mean(x, dim=1, keepdim=True)
            max_out, _ = torch.max(x, dim=1, keepdim=True)
            x = torch.cat([avg_out, max_out], dim=1)
            x = self.conv1(x)
            return self.sigmoid(x)
    • GSoP-Net

    d1fc02f87f36eabc69165e53c3b517ff.png

    给定一个输入张量,降维后,GSoP块先进行协方差矩阵计算,然后进行线性卷积和非线性激活的两个连续运算,得到输出张量,输出张量沿通道维数对原始输入进行缩放,一定程度上也是一种通道注意力的体现,但与SEnet不同的是该模块提出了2维平均池化,通过协方差的形式体现了通道与通道之间的关系。

    8e515caec9e59ac444ebdc4c8e2da568.png

    如上图所示,通过GSop模块的不同位置,作者提供了两个模型称为GSopNet1和GSopNet2。GSopNet2中还涉及到修改和推进(平方根和带参数)涉及到一些统计和线代上的知识。

    GSoP-Net的实现代码如下:

    # https://github.com/ZilinGao/Global-Second-order-Pooling-Convolutional-Networks/blob/master/torchvision/models/resnet.py
    # init
    if GSoP_mode == 1:
        self.avgpool = nn.AvgPool2d(14, stride=1)
        self.fc = nn.Linear(512 * block.expansion, num_classes)
        print("GSoP-Net1 generating...")
    else :
        self.isqrt_dim = 256
        self.layer_reduce = nn.Conv2d(512 * block.expansion, self.isqrt_dim, kernel_size=1, stride=1, padding=0, bias=False)
        self.layer_reduce_bn = nn.BatchNorm2d(self.isqrt_dim)
        self.layer_reduce_relu = nn.ReLU(inplace=True)
        self.fc = nn.Linear(int(self.isqrt_dim * (self.isqrt_dim + 1) / 2), num_classes)
        print("GSoP-Net2 generating...")
    
    # forward
    if self.GSoP_mode == 1:
        x = self.avgpool(x)
    else :
        x = self.layer_reduce(x)
        x = self.layer_reduce_bn(x)
        x = self.layer_reduce_relu(x)
    
        x = MPNCOV.CovpoolLayer(x)
        x = MPNCOV.SqrtmLayer(x, 3)
        x = MPNCOV.TriuvecLayer(x)
    • AA-Net

    0f126f44313efed2ce3acbfa8276d50c.png

    SENet对通道重新加权,CBAM独立地重新加权通道和空间位置。与这些方法不同,AA-Net使用可以共同参与空间和特征子空间的注意机制(每个头对应于特征子空间),引入额外的特征映射而不是精炼它们。 AA-Net的核心思想是使用自注意力机制,首先通过矩阵运算获得注意力权重图,通过多Head操作赋值多个空间,在多个空间内进行注意力点乘,实现自注意力机制。具体操作可以见博客:https://kexue.fm/archives/4765

    AA-Net的实现代码如下:

    # https://github.com/leaderj1001/Attention-Augmented-Conv2d/blob/master/in_paper_attention_augmented_conv/attention_augmented_conv.py
    class AugmentedConv(nn.Module):
        def __init__(self, in_channels, out_channels, kernel_size, dk, dv, Nh, relative):
            super(AugmentedConv, self).__init__()
            self.in_channels = in_channels
            self.out_channels = out_channels
            self.kernel_size = kernel_size
            self.dk = dk
            self.dv = dv
            self.Nh = Nh
            self.relative = relative
            self.conv_out = nn.Conv2d(self.in_channels, self.out_channels - self.dv, self.kernel_size, padding=1)
            self.qkv_conv = nn.Conv2d(self.in_channels, 2 * self.dk + self.dv, kernel_size=1)
            self.attn_out = nn.Conv2d(self.dv, self.dv, 1)
    
        def forward(self, x):
            # Input x
            # (batch_size, channels, height, width)
            batch, _, height, width = x.size(
            # conv_out
            # (batch_size, out_channels, height, width)
            conv_out = self.conv_out(x)
            # flat_q, flat_k, flat_v
            # (batch_size, Nh, height * width, dvh or dkh)
            # dvh = dv / Nh, dkh = dk / Nh
            # q, k, v
            # (batch_size, Nh, height, width, dv or dk)
            flat_q, flat_k, flat_v, q, k, v = self.compute_flat_qkv(x, self.dk, self.dv, self.Nh)
            logits = torch.matmul(flat_q.transpose(2, 3), flat_k)
            if self.relative:
                h_rel_logits, w_rel_logits = self.relative_logits(q)
                logits += h_rel_logits
                logits += w_rel_logits
            weights = F.softmax(logits, dim=-1)
            # attn_out
            # (batch, Nh, height * width, dvh)
            attn_out = torch.matmul(weights, flat_v.transpose(2, 3))
            attn_out = torch.reshape(attn_out, (batch, self.Nh, self.dv / self.Nh, height, width))
            # combine_heads_2d
            # (batch, out_channels, height, width)
            attn_out = self.combine_heads_2d(attn_out)
            attn_out = self.attn_out(attn_out)
            return torch.cat((conv_out, attn_out), dim=1)
    • ECA-Net

    上述提到的所有方法致力于开发更复杂的注意力模块,以获得更好的性能,不可避免地增加了计算负担。为了克服性能与复杂度权衡的悖论,ECANet就是一种用于提高深度CNNs性能的超轻注意模块。ECA模块,它只涉及k (k=9)参数,但带来了明显的性能增益。ECA模块通过分析SEnet的结构了解到降维和跨通道交互的影响,作者通过实验证明了降维是没有作用的(讲道理和我之前想的一样,,),并通过自适应内核大小的一维卷积实现局部跨通道的信息交互。

    1cbb4f6ad5c58104410badfedca471b0.png

    ECA-Net的实现代码如下:

    class eca_layer(nn.Module):
        """Constructs a ECA module.
        Args:
            channel: Number of channels of the input feature map
            k_size: Adaptive selection of kernel size
        """
        def __init__(self, channel, k_size=3):
            super(eca_layer, self).__init__()
            self.avg_pool = nn.AdaptiveAvgPool2d(1)
            self.conv = nn.Conv1d(1, 1, kernel_size=k_size, padding=(k_size - 1) // 2, bias=False) 
            self.sigmoid = nn.Sigmoid()
    
        def forward(self, x):
            # x: input features with shape [b, c, h, w]
            b, c, h, w = x.size()
    
            # feature descriptor on the global spatial information
            y = self.avg_pool(x)
    
            # Two different branches of ECA module
            y = self.conv(y.squeeze(-1).transpose(-1, -2))
            y = y.transpose(-1, -2).unsqueeze(-1)
    
            # Multi-scale information fusion
            y = self.sigmoid(y)
    
            return x * y.expand_as(x)
    # note
    # 1: pytorch 中的expand_as函数的用法
    将tensor扩展为参数tensor的大小。 该操作等效与:self.expand(tensor.size())
    >>> x = torch.tensor([[1], [2], [3]])
    >>> x.size()
    torch.Size([3, 1])
    >>> x.expand(3, 4)
    tensor([[ 1,  1,  1,  1],
            [ 2,  2,  2,  2],
            [ 3,  3,  3,  3]])
    >>> x.expand(-1, 4)   # -1 means not changing the size of that dimension
    tensor([[ 1,  1,  1,  1],
            [ 2,  2,  2,  2],
            [ 3,  3,  3,  3]])
    
    # 2: pytorch中的squeeze函数的用法
    torch.squeeze(input, dim=None, out=None) 将输入张量形状中的 1 去除并返回。
    >>> x = torch.zeros(2,1,2,1,2)
    >>> x.size()
    (2L, 1L, 2L, 1L, 2L)
    >>> y = torch.squeeze(x)
    >>> y.size()
    (2L, 2L, 2L)
    >>> y = torch.squeeze(x, 0)
    >>> y.size()
    (2L, 1L, 2L, 1L, 2L)
    >>> y = torch.squeeze(x, 1)
    >>> y.size()
    (2L, 2L, 1L, 2L)
    
    # 3.pytorch中transpose函数的用法
    #https://pytorch.org/docs/stable/torch.html?highlight=transpose#torch.transpose
    在对应的维度上进行转置操作
    >>> x = torch.randn(2, 3)
    >>> x
    tensor([[ 1.0028, -0.9893,  0.5809],
            [-0.1669,  0.7299,  0.4942]])
    >>> torch.transpose(x, 0, 1)
    tensor([[ 1.0028, -0.1669],
            [-0.9893,  0.7299],
            [ 0.5809,  0.4942]])
    
    #4. pytorch中unsqueeze函数的用法
    # https://pytorch.org/docs/stable/torch.html?highlight=unsqueeze#torch.unsqueeze
    在对应的维度上增加一个1维的维度
    >>> x = torch.tensor([1, 2, 3, 4])
    >>> torch.unsqueeze(x, 0)
    >>> list(x.size())
    tensor([[ 1,  2,  3,  4]])
    (1,4)
    >>> torch.unsqueeze(x, 1)
    >>> list(x.size())
    tensor([[ 1],
            [ 2],
            [ 3],
            [ 4]])
    (4,1)

    下图展示了上述各个注意力算法在ImageNet上的性能。

    e1d90a7faea41c593c22c9fff05e9e56.png
    展开全文
  • 综述---图像处理中的注意力机制

    万次阅读 多人点赞 2019-04-15 23:26:56
    论文阅读: 图像分类中的注意力机制(attention) 介绍了Spatial transformer networks、Residual Attention Network、Two-level Attention、SENet、Deep Attention Selective Network 计算机视觉中的注意力机制...

    重磅好文:微软亚研:对深度神经网络中空间注意力机制的经验性研究
    论文:An Empirical Study of Spatial Attention Mechanisms in Deep Networks
    高效Transformer层出不穷,谷歌团队综述文章一网打尽

    论文阅读: 图像分类中的注意力机制(attention)
    介绍了Spatial transformer networks、Residual Attention Network、Two-level Attention、SENet、Deep Attention Selective Network

    计算机视觉中的注意力机制(Visual Attention)

    快速理解图像处理中注意力机制的应用
    主要讲解了2017CPVR文章:Residual Attention Network for Image Classification

    Attention机制的文章总结
    计算机视觉技术self-attention最新进展

    ECCV2018–注意力模型CBAM
    【论文复现】CBAM: Convolutional Block Attention Module
    BAM: Bottleneck Attention Module算法笔记

    基于注意力机制的细腻度图像分类
    讲解RACNN
    此外还有MACNN等方法。

    概要

    为什么需要视觉注意力

    计算机视觉(computer vision)中的注意力机制(attention)的基本思想就是想让系统学会注意力——能够忽略无关信息而关注重点信息。为什么要忽略无关信息呢?

    注意力分类与基本概念

    神经网络中的「注意力」是什么?怎么用?这里有一篇详解
    该文分为: 硬注意力、软注意力、此外,还有高斯注意力、空间变换

    就注意力的可微性来分:

    1. Hard-attention,就是0/1问题,哪些区域是被 attentioned,哪些区域不关注.硬注意力在图像中的应用已经被人们熟知多年:图像裁剪(image cropping)
      硬注意力(强注意力)与软注意力不同点在于,首先强注意力是更加关注点,也就是图像中的每个点都有可能延伸出注意力,同时强注意力是一个随机的预测过程,更强调动态变化。当然,最关键是强注意力是一个不可微的注意力训练过程往往是通过增强学习(reinforcement learning)来完成的。(参考文章:Mnih, Volodymyr, Nicolas Heess, and AlexGraves. “Recurrent models of visual attention.” Advances inneural information processing systems. 2014.)

    硬注意力可以用Python(或Tensorflow)实现为:

    g = I[y:y+h, x:x+w]
    

    上述存在的唯一的问题是它是不可微分的;你如果想要学习模型参数的话,就必须使用分数评估器(score-function estimator)关于这一点,我的前一篇文章中有对其的简要介绍。

    1. Soft-attention,[0,1]间连续分布问题,每个区域被关注的程度高低,用0~1的score表示.

      软注意力的关键点在于,这种注意力更关注区域或者通道,而且软注意力是确定性的注意力,学习完成后直接可以通过网络生成,最关键的地方是软注意力是可微的,这是一个非常重要的地方。可以微分的注意力就可以通过神经网络算出梯度并且前向传播和后向反馈来学习得到注意力的权重。
      然而,这种类型的软注意力在计算上是非常浪费的。输入的黑色部分对结果没有任何影响,但仍然需要处理。同时它也是过度参数化的:实现注意力的sigmoid 激活函数是彼此相互独立的。它可以一次选择多个目标,但实际操作中,我们经常希望具有选择性,并且只能关注场景中的一个单一元素。由DRAW和空间变换网络(Spatial Transformer Networks)引入的以下两种机制很好地别解决了这个问题。它们也可以调整输入的大小,从而进一步提高性能。

    就注意力关注的域来分:

    1. 空间域(spatial domain)
    2. 通道域(channel domain)
    3. 层域(layer domain)
    4. 混合域(mixed domain)
    5. 时间域(time domain):还有另一种比较特殊的强注意力实现的注意力域,时间域(time domain),但是因为强注意力是使用reinforcement learning来实现的,训练起来有所不同

    一个概念:Self-attention自注意力,就是 feature map 间的自主学习,分配权重(可以是 spatial,可以是 temporal,也可以是 channel间)

    软注意力

    The application of two-level attention models in deep convolutional neural network for fine-grained image classification—CVPR2015

    1. Spatial Transformer Networks(空间域注意力)—2015 nips

    Spatial Transformer Networks(STN)模型[4]是15年NIPS上的文章,这篇文章通过注意力机制,将原始图片中的空间信息变换到另一个空间中并保留了关键信息。

    这篇文章认为之前pooling的方法太过于暴力,直接将信息合并会导致关键信息无法识别出来,所以提出了一个叫空间转换器(spatial transformer)的模块,将图片中的的空间域信息做对应的空间变换,从而能将关键的信息提取出来。

    spatial transformer其实就是注意力机制的实现,因为训练出的spatial transformer能够找出图片信息中需要被关注的区域,同时这个transformer又能够具有旋转、缩放变换的功能,这样图片局部的重要信息能够通过变换而被框盒提取出来。
    在这里插入图片描述
    比如这个直观的实验图:

    (a)列是原始的图片信息,其中第一个手写数字7没有做任何变换,第二个手写数字5,做了一定的旋转变化,而第三个手写数字6,加上了一些噪声信号;
    (b)列中的彩色边框是学习到的spatial transformer的框盒(bounding box),每一个框盒其实就是对应图片学习出来的一个spatial transformer;
    ©列中是通过spatial transformer转换之后的特征图,可以看出7的关键区域被选择出来,5被旋转成为了正向的图片,6的噪声信息没有被识别进入。

    2. SENET (通道域)—2017CPVR

    在这里插入图片描述
    中间的模块就是SENet的创新部分,也就是注意力机制模块。这个注意力机制分成三个部分:挤压(squeeze),激励(excitation),以及scale(attention)。
    流程:

    1. 将输入特征进行 Global AVE pooling,得到 11 Channel
    2. 然后bottleneck特征交互一下,先压缩 channel数,再重构回channel数
    3. 最后接个 sigmoid,生成channel 间0~1的 attention weights,最后 scale 乘回原输入特征

    详见《论文阅读笔记—SENET》

    轻量模块ECANet(通道注意力超强改进)

    深度解析 | CVPR2020 | 通道注意力超强改进,轻量模块ECANet来了!即插即用,显著提高CNN性能|已开源

    3. Residual Attention Network(混合域)—2017

    文章中注意力的机制是软注意力基本的加掩码(mask)机制,但是不同的是,这种注意力机制的mask借鉴了残差网络的想法,不只根据当前网络层的信息加上mask,还把上一层的信息传递下来,这样就防止mask之后的信息量过少引起的网络层数不能堆叠很深的问题。

    文提出的注意力mask,不仅仅只是对空间域或者通道域注意,这种mask可以看作是每一个特征元素(element)的权重。通过给每个特征元素都找到其对应的注意力权重,就可以同时形成了空间域和通道域的注意力机制

    很多人看到这里就会有疑问,这种做法应该是从空间域或者通道域非常自然的一个过渡,怎么做单一域注意力的人都没有想到呢?原因有:

    • 如果你给每一个特征元素都赋予一个mask权重的话,mask之后的信息就会非常少,可能直接就破坏了网络深层的特征信息;
    • 另外,如果你可以加上注意力机制之后,残差单元(Residual Unit)的恒等映射(identical mapping)特性会被破坏,从而很难训练。

    该文章的注意力机制的创新点在于提出了残差注意力学习(residual attention learning),不仅只把mask之后的特征张量作为下一层的输入,同时也将mask之前的特征张量作为下一层的输入,这时候可以得到的特征更为丰富,从而能够更好的注意关键特征。
    在这里插入图片描述
    文章中模型结构是非常清晰的,整体结构上,是三阶注意力模块(3-stage attention module)。每一个注意力模块可以分成两个分支(看stage2),上面的分支叫主分支(trunk branch),是基本的残差网络(ResNet)的结构。而下面的分支是软掩码分支(soft mask branch),而软掩码分支中包含的主要部分就是残差注意力学习机制。通过下采样(down sampling)和上采样(up sampling),以及残差模块(residual unit),组成了注意力的机制。

    模型结构中比较创新的残差注意力机制是:
    在这里插入图片描述
    H是注意力模块的输出,F是上一层的图片张量特征,M是软掩码的注意力参数。这就构成了残差注意力模块,能将图片特征和加强注意力之后的特征一同输入到下一模块中。F函数可以选择不同的函数,就可以得到不同注意力域的结果:
    在这里插入图片描述

    1. f1是对图片特征张量直接sigmoid激活函数,就是混合域的注意力;

    2. f2是对图片特征张量直接做全局平均池化(global average pooling),所以得到的是通道域的注意力(类比SENet);

    3. f3 是求图片特征张量在通道域上的平均值的激活函数,类似于忽略了通道域的信息,从而得到空间域的注意力。

    Non-local Neural Networks, CVPR2018

    FAIR的杰作,主要 inspired by 传统方法用non-local similarity来做图像 denoise

    主要思想也很简单,CNN中的 convolution单元每次只关注邻域 kernel size 的区域,就算后期感受野越来越大,终究还是局部区域的运算,这样就忽略了全局其他片区(比如很远的像素)对当前区域的贡献。

    所以 non-local blocks 要做的是,捕获这种 long-range 关系:对于2D图像,就是图像中任何像素对当前像素的关系权值;对于3D视频,就是所有帧中的所有像素,对当前帧的像素的关系权值。

    网络框架图也是简单粗暴:
    在这里插入图片描述
    文中有谈及多种实现方式,在这里简单说说在DL框架中最好实现的 Matmul 方式:

    1. 首先对输入的 feature map X 进行线性映射(说白了就是 1x1x1 卷积,来压缩通道数),然后得到 θ , ϕ , g \theta, \quad \phi, \quad g θ,ϕ,g 特征
    2. 通过reshape操作,强行合并上述的三个特征除通道数外的维度,然后对 进行矩阵点乘操作,得到类似协方差矩阵的东西(这个过程很重要,计算出特征中的自相关性,即得到每帧中每个像素对其他所有帧所有像素的关系)
    3. 然后对自相关特征 以列or以行(具体看矩阵 g 的形式而定) 进行 Softmax 操作,得到0~1的weights,这里就是我们需要的 Self-attention 系数
    4. 最后将 attention系数,对应乘回特征矩阵 g 中,然后再上扩 channel 数,与原输入 feature map X 残差一下,完整的 bottleneck

    嵌入在 action recognition 框架中的attention map 可视化效果:
    在这里插入图片描述

    图中的箭头表示,previous 若干帧中的某些像素 对最后图(当前帧)的脚关节像素的贡献关系。由于是soft-attention,其实每帧每个像素对对其有贡献关系,图中黄色箭头是把响应最大的关系描述出来。

    总结

    Pros:non-local blocks很通用的,容易嵌入在任何现有的 2D 和 3D 卷积网络里,来改善或者可视化理解相关的CV任务。比如前不久已有文章把 non-local 用在 Video ReID [2] 的任务里。

    Cons:文中的结果建议把non-local 尽量放在靠前的层里,但是实际上做 3D 任务,靠前的层由于 temporal T 相对较大,构造及点乘操作那步,超多的参数,需要耗费很大的GPU Memory

    Interaction-aware Attention, ECCV2018

    美图联合中科院的文章

    这文章扯了很多 Multi-scale 特征融合,讲了一堆 story,然并卵;直接说重点贡献**,就是在 non-local block 的协方差矩阵基础上,设计了基于 PCA 的新loss,更好地进行特征交互**。作者认为,这个过程,特征会在channel维度进行更好的 non-local interact,故称为 Interaction-aware attention

    那么问题来了,怎么实现 通过PCA来获得 Attention weights呢?

    文中不直接使用 协方差矩阵的特征值分解 来实现,而是使用下述等价形式:

    CBAM: Convolutional Block Attention Module(通道域+空间域), ECCV2018

    这货就是基于 SE-Net [5]中的 Squeeze-and-Excitation module 来进行进一步拓展,

    具体来说,文中把 channel-wise attention 看成是教网络 Look 'what’;而spatial attention 看成是教网络 Look ‘where’,所以它比 SE Module 的主要优势就多了后者

    在这里插入图片描述

    总体图

    在这里插入图片描述

    通道注意力和空间注意力子图

    通道注意力公式:
    M c ( F ) = σ ( M L P ( A v g P o o l ( F ) ) + M L P ( M a x P o o l ( F ) ) ) = σ ( W 1 ( W 0 ( F  avg  c ) ) + W 1 ( W max ⁡ c ) ) ) \begin{aligned} \mathbf{M}_{\mathbf{c}}(\mathbf{F}) &=\sigma(M L P(A v g P o o l(\mathbf{F}))+M L P(M a x P o o l(\mathbf{F}))) \\ &=\sigma\left(\mathbf{W}_{\mathbf{1}}\left(\mathbf{W}_{\mathbf{0}}\left(\mathbf{F}_{\text { avg }}^{\mathrm{c}}\right)\right)+\mathbf{W}_{\mathbf{1}}\left(\mathbf{W}_{\mathbf{\operatorname { m a x }}}^{\mathrm{c}}\right)\right) ) \end{aligned} Mc(F)=σ(MLP(AvgPool(F))+MLP(MaxPool(F)))=σ(W1(W0(F avg c))+W1(Wmaxc)))

    空间注意力公式:(空间域注意力是通过对通道axis进行AvgPool和MaxPool得来的)
    M s ( F ) = σ ( f 7 × 7 ( [ A v g P o o l ( F ) ; M a x P o o l ( F ) ] ) ) = σ ( f 7 × 7 ( [ F a v g s ; F max ⁡ s ] ) ) \begin{aligned} \mathbf{M}_{\mathbf{s}}(\mathbf{F}) &=\sigma\left(f^{7 \times 7}([A v g P o o l(\mathbf{F}) ; M a x P o o l(\mathbf{F})])\right) \\ &=\sigma\left(f^{7 \times 7}\left(\left[\mathbf{F}_{\mathbf{a v g}}^{\mathbf{s}} ; \mathbf{F}_{\mathbf{\operatorname { m a x }}}^{\mathbf{s}}\right]\right)\right) \end{aligned} Ms(F)=σ(f7×7([AvgPool(F);MaxPool(F)]))=σ(f7×7([Favgs;Fmaxs]))

    CBAM 特别轻量级,也方便在端部署。

    DANet:Dual Attention Network for Scene Segmentation(空间域+通道域), CPVR2019

    code: https://github.com/junfu1115/DANet
    最近才在arXiv挂出来的,把Self-attention的思想用在图像分割,可通过long-range上下文关系更好地做到精准分割。

    主要思想也是上述文章 CBAM 和 non-local 的融合变形

    把deep feature map进行spatial-wise self-attention,同时也进行channel-wise self-attetnion,最后将两个结果进行 element-wise sum 融合。
    在这里插入图片描述
    这样做的好处是:

    在 CBAM 分别进行空间和通道 self-attention的思想上,直接使用了 non-local 的自相关矩阵 Matmul 的形式进行运算,避免了 CBAM 手工设计 pooling,多层感知器 等复杂操作

    CCNet

    本篇文章的亮点在于用了巧妙的方法减少了参数量。在上面的DANet中,attention map计算的是所有像素与所有像素之间的相似性,空间复杂度为(HxW)x(HxW),而本文采用了criss-cross思想,只计算每个像素与其同行同列即十字上的像素的相似性,通过进行循环(两次相同操作),间接计算到每个像素与每个像素的相似性,将空间复杂度降为(HxW)x(H+W-1),以图为例为下:
    在这里插入图片描述
    整个网络的架构与DANet相同,只不过attention模块有所不同,如下图:在计算矩阵相乘时每个像素只抽取特征图中对应十字位置的像素进行点乘,计算相似度。
    在这里插入图片描述
    经过一轮此attention计算得到的attention map如下图R1所示,对于每个元素只有十字上的相似性,而通过两轮此计算,对于每个元素就会得到整张图的相似性,如R2。
    在这里插入图片描述
    得到此结果的原因如下图,经过一轮计算,每个像素可以得到在其十字上的相似性,对于不同列不同行(不在其十字上)的像素是没有相似性的,但是这个不同行不同列像素同样也进行了相似性计算,计算了在其十字上的相似性,那么两个十字必有相交,在第二次attention计算的时候,通过交点,相当于是间接计算了这两个不同列不同行像素之间的相似性

    实验结果达到了SOTA水平,但没有计算全部像素的attention方法准确率高

    OCNet

    OCNet: Object Context Network for Scene Parsing (Microsoft Research)论文解析
    图像语义分割(13)-OCNet: 用于场景解析的目标语义网络

    摘要
      论文侧重于语义分割中的语义聚集策略,即不再逐像素的进行预测而是将相似的像素点聚集后进行语义分割,由此提出了目标语义池化策略,它通过利用属于同一物体的像素集合的信息来得到某一个该物体包含的像素的标签,其中像素集合被称为目标语义。
      具体实现受到自注意力机制的影响包含两个步骤:1)计算单个像素和所有像素之间的相似性从而得到目标语义和每一个像素的映射;2)得到目标像素的标签。结果比现有的语义聚集策略例如PPM和ASPP这些不区别单一像素和目标语义之间是否存在属于关系的策略更加准确。

    不得不说,这篇论文和DANet撞车了,而且撞的死死的,用的同样的核心内容

    GCNet:Non-local Networks Meet Squeeze-Excitation Networks and Beyond

    Non-local Networks Meet Squeeze-Excitation Networks and Beyond 论文解读
    GCNet 网络结构结构了non-local network和Squeeze-excitation networks.我们知道non-local network(NLNet)可以捕获长距离依赖关系。可以发现NLnet的网络结构采用的是自注意力机制来建模像素对关系。**在这篇文章中non-local network的全局上下文在不同位置几乎是相同的,这表明学习到了无位置依赖的全局上下文,因此这样导致了大量的计算量的浪费。作者在这里提出了一种简化版的模型去获得全局上下文信息。**使用的是query-independent(可以理解为无query依赖)的建模方式。同时更可以共享这个简化的结构和SENet网络结构。因此作者在这里联合了这三种方法产生了一个global context(GC) block

    注意增强型卷积

    用自注意力增强卷积:这是新老两代神经网络的对话(附实现)
    PyTorch 实现地址:https://github.com/leaderj1001/Attention-Augmented-Conv2d

    PS:启示就是在卷积算子的基础上,加入了多个注意力head(每个自注意head就是no-local block。),然后将这些head concat到一起。

    机制
    卷积运算有一个显著缺陷,即仅在局部近邻上工作,也由此会错失全局信息。另一方面,自注意则是获取长程交互性方面的一项近期进展,但还主要应用于序列建模和生成建模任务上。在这篇论文中,我们研究了将自注意(作为卷积的替代)用于判别式视觉任务的问题。我们提出了一种全新的二维相对自注意机制,研究表明这足以在图像分类任务上替代卷积作为一种单独的原语。我们在对照实验中发现,当结合使用卷积与自注意时所得到的结果最好。因此我们提出使用这种自注意机制来增强卷积算子,具体做法是将卷积特征图与通过自注意产生的一组特征图连接起来

    在这里插入图片描述
    图:注意增强型卷积:对于每个空间位置 (h, w),都根据查询和键值在图像上计算出 N_h 个注意图(attention map)。这些注意图被用于计算 N_h 个这些值的加权平均 V。然后将所得结果连接起来,再重新调整形状以匹配原来的体空间维度并与一个逐点卷积混合。多头注意是以并行的方式应用于标准的卷积运算,输出再连接到一起。
    在这里插入图片描述

    单个注意力head

    给定一个形状为 (H, W, F_in) 的输入张量,我们将其展开为一个矩阵 X ∈ R H W × F i n X \in \mathbb{R}^{H W \times F_{i n}} XRHW×Fin,并如 Transformer 架构提出的那样执行多头注意。则单个头 h 的自注意机制输出为
    在这里插入图片描述
    其中, W q , W k ∈ R F i n × d k h , W v ∈ R F i n × d v h W_{q}, W_{k} \in \mathbb{R}^{F_{i n} \times d_{k}^{h}}, W_{v} \in \mathbb{R}^{F_{i n} \times d_{v}^{h}} Wq,WkRFin×dkh,WvRFin×dvh是可学习的线性变换,它们分别将输入 X 映射到查询 Q、键值 K(xys:当矩阵相乘进行自相关时,一个称为query,一个称为key) 和值 V。
    所有头的输出可以连接起来:
    MHA ⁡ ( X ) = \operatorname{MHA}(X)= MHA(X)= Concat [ O 1 , … , O N h ] W O \left[O_{1}, \ldots, O_{N h}\right] W^{O} [O1,,ONh]WO

    我们使用不同规模不同类型的模型(其中包括 ResNet 和一种当前最佳的可移动式受限网络)进行了广泛的实验,结果表明注意增强能在 ImageNet 图像分类与 COCO 目标检测任务上实现稳定的提升,同时还能保证参数数量大体接近。尤其值得提及的是,我们的方法在 ImageNet 上实现的 top-1 准确度优于 ResNet50 基准 1.3%我们的方法还在 COCO 目标检测上超过 RetinaNet 基准 1.4 mAP。
    注意增强仅需极少量的计算负担就能实现系统性的改善,并且在所有实验中都明显优于流行的 Squeeze-and-Excitation 通道式注意方法
    实验还有个让人惊讶的结果:在 ImageNet 上全自注意模型(注意增强的一种特例)的表现仅略逊于对应的全卷积模型,这说明自注意本身就是一种强大的图像分类基本方法。

    PAN: Pyramid Attention Network for Semantic Segmentation(层域)—CVPR2018

    亮点1:论文是将Attention机制与金字塔结构结合作为本文的亮点,这样可以在高层语义指导的基础上来提取相对与较低层的精确的密集特征,取代了其他方法里面的复杂的空洞卷积dilated和多个编码解码器的操作,跳出了以往常常用到的U-Net结构
    亮点2::采用了一个全局pooling进行底层特征的权值加权,对特征的map起到的选取的作用。
    在这里插入图片描述
    模块一:FPA(FeaturePyramid Attention)特征金字塔Attention

    • 解决的问题:不同的scale大小的图片以及不同大小的物体给物体分割带来了困难
    • 现有的方法:类似于PSPNet、DeepLab采用空间金字塔pooling实现不同的尺度以及多孔金字塔池化ASPP结构,问题一:pooling容易丢失掉局部信息,问题二:ASPP因为是一种稀疏的操作会造成棋盘伪影效应,问题三:只是简单地多个scale concat缺乏上下文的信息,没有关注上下文信息情况下效果不佳(下图作图为现有的方法),该部分处理主要是用在处理高层特征上的操作。
    • 提出的方案:如右图所示,在提取到高层特征之后不再进行pooling的操作,而是通过三个继续的卷积实现更高层的语义,我们知道更高层的语义会更加接近ground truth的情况,会关注一些物体信息,所以用更高层的语义来作为一种Attention的指导,与高层特征做完1×1卷积不变化大小的情况下进行相乘,也就是加强了具有物体信息的部位带有的权值,得到了带有Attention的输出,同时因为金字塔卷积的结构采用不同大小的卷积核,代表着不同的感受野,所以也解决不同物体不同scale的问题。

    在这里插入图片描述
    模块二:

    • 解决的问题:对于高层的特征常常可以实现有效的分类,但是重构原始图像的解析度或者说predict上无法精细地实现。
    • 现有的方法:类似于SegNet、Refinenet、提拉米苏结构等等都是采用了U-Net的结构,采用了解码器decoder也就是反卷积之类再加上底层的特征,一层层地往上累加以便恢复图像细节,论文中讲到了这种虽然是可以实现底层和高层的结合以及图像重构,但是computation burden
    • 提出的方案:如下图所示,抛弃了decoder的结构,原始形式是直接用底层特征加FPA得到的高层特征,但在skip底层特征的时候论文采用了高层特征作为指导设置了相应的权重,使得底层与高层的权重保持一致性,高层特征采用了Global Pooling得到权重,底层特征经过一个卷积层实现与高层特征相同数量的map,然后相乘后再高底层相加。这样减少了decoder复杂的计算同时也是一种新的高底层融合的形式。具体地说:
      • 我们对低层次特征执行 3×3 的卷积操作,以减少 CNN 特征图的通道数。
      • 从高层次特征生成的全局上下文信息依次经过 1×1 卷积、批量归一化 (batch normalization) 和非线性变换操作 (nonlinearity),然后再与低层次特征相乘。
      • 最后,高层次特征与加权后的低层次特征相加并进行逐步的上采样过程。
      • 我们的 GAU 模块不仅能够更有效地适应不同尺度下的特征映射,还能以简单的方式为低层次的特征映射提供指导信息。

    在这里插入图片描述

    Multi-Context Attention for Human Pose Estimation

    Tell Me Where to Look: Guided Attention Inference Network

    硬注意力

    一种通过引入硬注意力机制来引导学习视觉回答任务的研究

    软注意力机制已在计算机视觉领域取得了广泛的应用和成功。但是我们发现硬注意力机制在计算机视觉任务中的研究还相对空白。**而硬注意力机制能够从输入信息中选择重要的特征,因此它被视为是一种比软注意力机制更高效、直接的方法。**本次,将为大家介绍一种通过引入硬注意力机制来引导学习视觉回答任务的研究。此外结合 L2 正则化筛选特征向量,可以高效地促进筛选的过程并取得更好的整体表现,而无需专门的学习过程。

    1. Diversified visual attention networks for fine-grained object classification—2016

    2. Deep networks with internal selective attention through feedback connections (通道域)—NIPS 2014

    提出了一种Deep Attention Selective Network (dasNet)。在训练完成后,通过强化学习(Separable Natural Evolution Strategies)来动态改变attention。具体来说,attention调整的是每个conv filter的权重(和SENet一样有木有,都是channel维度)。policy是一个neural network,RL部分的算法如下:
    在这里插入图片描述
    其中每次while循环代表一次SNES迭代,M表示训练好的CNN,u和Sigma是policy参数对应的分布超参,p是采样p个policy参数,n是随机抽取n张图片。

    3.Fully Convolutional Attention Networks for Fine-Grained Recognition

    本文利用基于强化学习的视觉 attenation model 来模拟学习定位物体的part,并且在场景内进行物体分类。这个框架模拟人类视觉系统的识别过程,通过学习一个任务驱动的策略,经过一系列的 glimpse 来定位物体的part。那么,这里的 glimpse 是什么呢?每一个 glimpse 对应一个物体的part。将原始的图像以及之前glimpse 的位置作为输入,下一次 glimpse位置作为输出,作为下一次物体part。每一个 glimpse的位置作为一个 action,图像和之前glimpse的位置作为 state,奖励衡量分类的准确性。本文方法可以同时定位多个part,之前的方法只能一次定位一个part

    4 . 时间域注意力(RNN)

    这个概念其实比较大,因为计算机视觉只是单一识别图片的话,并没有时间域这个概念,但是[7]这篇文章中,提出了一种基于递归神经网络(Recurrent Neural Network,RNN)的注意力机制识别模型。

    RNN模型比较适合的场景是数据具有时序特征,比如使用RNN产生注意力机制做的比较好的是在自然语言处理的问题上。因为自然语言处理的是文本分析,而文本产生的背后其实是有一个时序上的关联性,比如一个词之后还会跟着另外一个词,这就是一个时序上的依赖关联性。

    而图片数据本身,并不具有天然的时序特征,一张图片往往是一个时间点下的采样。但是在视频数据中,RNN就是一个比较好的数据模型,从而能够使用RNN来产生识别注意力。

    特意将RNN的模型称之为时间域的注意力,是因为这种模型在前面介绍的空间域,通道域,以及混合域之上,又新增加了一个时间的维度。这个维度的产生,其实是基于采样点的时序特征

    Recurrent Attention Model [7]中将注意力机制看成对一张图片上的一个区域点的采样,这个采样点就是需要注意的点。而这个模型中的注意力因为不再是一个可以微分的注意力信息,因此这也是一个强注意力(hard attention)模型。这个模型的训练是需要使用增强学习(reinforcementlearning)来训练的,训练的时间更长。

    这个模型更需要了解的并不是RNN注意力模型,因为这个模型其实在自然语言处理中介绍的更详细,更需要了解的是这个模型的如何将图片信息转换成时序上的采样信号的:

    在这里插入图片描述
    这个是模型中的关键点,叫Glimpse Sensor,我翻译为扫视器,这个sensor的关键点在于先确定好图片中需要关注的点(像素),这时候这个sensor开始采集三种信息,信息量是相同的,一个是非常细节(最内层框)的信息,一个是中等的局部信息,一个是粗略的略缩图信息。

    这三个采样的信息是在 l t − 1 l_{t-1} lt1 位置中产生的图片信息,而下一个时刻,随着t的增加,采样的位置又开始变化,至于l随着t该怎么变化,这就是需要使用增强学习来训练的东西了。

    自注意力

    自注意力机制在计算机视觉中的应用
    用Attention玩转CV,一文总览自注意力语义分割进展

    自注意力机制是注意力机制的改进,其减少了对外部信息的依赖,更擅长捕捉数据或特征的内部相关性。

    在神经网络中,我们知道卷积层通过卷积核和原始特征的线性结合得到输出特征,由于卷积核通常是局部的,为了增加感受野,往往采取堆叠卷积层的方式,实际上这种处理方式并不高效。同时,计算机视觉的很多任务都是由于语义信息不足从而影响最终的性能。自注意力机制通过捕捉全局的信息来获得更大的感受野和上下文信息。

    自注意力机制 (self-attention)[1] 在序列模型中取得了很大的进步;另外一方面,上下文信息(context information)对于很多视觉任务都很关键,如语义分割,目标检测。自注意力机制通过(key, query, value)的三元组提供了一种有效的捕捉全局上下文信息的建模方式。接下来首先介绍几篇相应的工作,然后分析相应的优缺点以及改进方向。

    RelatedWorks

    Attention is all you need [1] 是第一篇提出在序列模型中利用自注意力机制取代循环神经网络的工作,取得了很大的成功。其中一个重要的模块是缩放点积注意力模块(scaled dot-product attention)。文中提出(key,query, value)三元组捕捉长距离依赖的建模方式,如下图所示,key和query通过点乘的方式获得相应的注意力权重,最后把得到的权重和value做点乘得到最终的输出。
    在这里插入图片描述

    Non-localneural network [2] 继承了(key, query, value) 三元组的建模方式, 提出了一个高效的non-local 模块, 如下图所示。在Resnet网络中加入non-local模块后无论是目标检测还是实例分割,性能都有一个点以上的提升(mAP),这说明了上下文信息建模的重要性。在这里插入图片描述

    Danet [3]是来自中科院自动化的工作,其核心思想就是通过上下文信息来监督语义分割任务。作者采用两种方式的注意力形式,如下图所示,分别是spatial和 channel上,之后进行特征融合,最后接语义分割的head 网络。思路上来说很简单,也取得了很好的效果。
    在这里插入图片描述
    Ocnet[4]是来自微软亚洲研究所的工作。同样它采用(key, query, value)的三元组,通过捕捉全局的上下文信息来更好的监督语义分割任务。与Danet [3]不同的是它仅仅采用spatial上的信息。最后也取得了不错的结果。
    在这里插入图片描述

    DFF [5] 是来自微软亚洲研究所视觉计算组的工作。如下图所示,它通过光流来对视频不同帧之间的运动信息进行建模, 从而提出了一个十分优雅的视频检测框架DFF。其中一个很重要的操作是warp, 它实现了点到点之间的对齐。在此以后出现了很多关于视频检测的工作,如, FGFA[6],Towards High Performance [7]等,他们大部分都是基于warp这个特征对其操作。由于光流网络的不准确性以及需要和检测网络进行联合训练,这说明现在视频检测中的光流计算其实不准确的。如何进行更好的建模来代替warp操作,并且起到同样的特征对其的作用是很关键的。通常而言我们假设flow运动的信息不会太远,这容易启发我们想到通过每个点的邻域去找相应的运动后的特征点,具体做法先不介绍了,欢迎大家思考(相关操作和自注意力机制)。
    在这里插入图片描述

    自注意力的缺点和改进策略

    前面主要是简单的介绍了自注意力机制的用途,接下来分析它的缺点和相应的改进策略,由于每一个点都要捕捉全局的上下文信息,这就导致了自注意力机制模块会有很大的计算复杂度和显存容量。如果我们能知道一些先验信息,比如上述的特征对其通常是一定的邻域内,我们可以通过限制在一定的邻域内来做。另外还有如何进行高效的稀疏化,以及和图卷积的联系,这些都是很开放的问题,欢迎大家积极思考。

    接下来介绍其他的一些改进策略,Senet[9] 启发我们channel上的信息很重要,如下图所示。

    CBAW [10] 提出了结合spatial和channel的模块,如下图所示,在各项任务上也取得很好的效果。
    在这里插入图片描述

    最后介绍一篇来自百度IDL的结合channel as spatial的建模方式的工作 [11]。本质上是直接在(key, query, value)三元组进行reshape的时候把channel的信息加进去,但是这带来一个很重要的问题就是计算复杂度大大增加。我们知道分组卷积是一种有效的降低参数量的方案,这里也采用分组的方式。但是即使采用分组任然不能从根本上解决计算复杂度和参数量大的问题,作者很巧妙的利用泰勒级数展开后调整计算key, query, value的顺序,有效的降低了相应的计算复杂度。下表是优化后的计算量和复杂度分析,下图是CGNL模块的整体框架。

    自注意力小结

    自注意力机制作为一个有效的对上下文进行建模的方式,在很多视觉任务上都取得了不错的效果。同时,这种建模方式的缺点也是显而易见的,一是没有考虑channel上信息,二是计算复杂度仍然很大。相应的改进策,一方面是如何进行spatial和channel上信息的有效结合,另外一方面是如何进行捕捉信息的稀疏化,关于稀疏的好处是可以更加鲁棒的同时保持着更小的计算量和显存。最后,图卷积作为最近几年很火热的研究方向,如何联系自注意力机制和图卷积,以及自注意力机制的更加深层的理解都是未来的很重要的方向。

    多尺度,多注意力结合

    ElementAI提出超复杂多尺度细粒度图像分类Attention模型

    展开全文
  • 【机器学习】注意力机制

    千次阅读 2020-04-19 21:41:03
    1 注意力机制定义 1.1 定义 深度学习中的注意力机制从本质上讲和人类的选择性视觉注意力机制类似,核心目标也是从众多信息中选择出对当前任务目标更关键的信息注意力机制就是一种加权 1.2 为什么注意力机制可以发挥...

    1 注意力机制定义

    1.1 定义

    深度学习中的注意力机制从本质上讲和人类的选择性视觉注意力机制类似,核心目标也是从众多信息中选择出对当前任务目标更关键的信息注意力机制就是一种加权


    1.2 为什么注意力机制可以发挥重要作用

    卷积是如何提取特征的? 卷积操作实际上是向量的内积,而两个向量的内积代表他们的相关程度
    卷积是是一个线性的过程,为了增加非线性特征,加入了池化层和激活层。这个过程是一系列矩阵乘法和元素对应非线性乘法,特征元素用过加法相互作用。
    注意力机制加入了对应元素相乘,可以加大特征的非线性,而且简化了其他运算


    2 注意力分类

    2.1 按照可微分性不同

    硬注意力:和图像的裁剪类似
    软注意力
    在这里插入图片描述
    高斯注意力机制:通过利用参数化的一维高斯滤波器来创建图像大小的注意力图
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EDi8972p-1587283373788)(en-resource://database/1722:1)]

    [1] Kosiorek A, Bewley A, Posner I. Hierarchical attentive recurrent tracking[C]//Advances in Neural Information Processing Systems. 2017: 3053-3061.
    代码地址:https://github.com/akosiorek/hart

    2.2 关注的域不同

    空间域 :内容的注意力机制
    通道域 :通道之间的注意力机制
    时间域:一种硬注意力机制,加入时间信息
    混合域 内容和通道的注意力融合

    2.3 空间域的注意力机制

    在这里插入图片描述
    代码地址:https://github.com/kevinzakka/spatial-transformer-network

    2.4 通道域的注意力机制

    在这里插入图片描述
    代码地址:https://github.com/hujie-frank/SENet

    2.5 混合域的注意力机制

    在这里插入图片描述
    在这里插入图片描述
    代码地址:https://github.com/tengshaofeng/ResidualAttentionNetwork-pytorch

    总结

    空间注意力机制就是通过,一定的方法训练出一个变换空间,用来感受我们的目标位置。并且添加到后续的网络中增加训练效果。
    通道注意力也就是通过学习,增强有用特征的占用比、

    其他注意力模型

    在这里插入图片描述

    展开全文
  • 注意力机制热力图可视化

    千次阅读 2020-12-01 13:11:51
    import tensorflow as tf import numpy as np import cv2 def visualize_attention_map(attention_map): """ The attention map is a matrix ranging from 0 to 1, where the greater the value, ...
    import tensorflow as tf
    import numpy as np
    import cv2
    
    def visualize_attention_map(attention_map):
    
        """
        The attention map is a matrix ranging from 0 to 1, where the greater the value,
        the greater attention is suggests.
        :param attention_map: np.numpy matrix hanging from 0 to 1
        :return np.array matrix with rang [0, 255]
        """    
        attention_map_color = np.zeros(
            shape=[attention_map.shape[0], attention_map.shape[1], 3],
            dtype=np.uint8    
        )
    
        red_color_map = np.zeros(
            shape=[attention_map.shape[0], attention_map.shape[1]],
            dtype=np.uint8
        ) + 255    
        
        red_color_map = red_color_map * attention_map
        red_color_map = np.array(red_color_map, dtype=np.uint8)
        
        attention_map_color[:, :, 2] = red_color_map    
    
        return attention_map_color

     

    展开全文
  • https://www.zhihu.com/question/274926848?sort=created
  • 在行人重识别中,注意力机制往往通过引入一个 注意力核(attention kernel)来实现,注意力核可以突出行人图像中的"有用的信息"(例如,衣服上的logo,背包),压制"无用的信息"(例如,背景)。使用了注意力机制...
  • python热图_Python-热图

    2020-09-22 16:51:08
    python热图 Python-热图 (Python - Heat Maps) Advertisements 广告 Previous Page 上一页 Next Page 下一页 A heatmap contains values representing various shades of the same colour for each ...
  • 来源:...为了让你更好地理解热图,我们Ptengine(铂金分析)团队整理了8种热图的用法,希望能帮助你快速高效地优化网站。该如何拉近与客户的距离?你至少要排查以下8点,然...
  • ClickHeat是一个很酷的javascript库,它可以帮你统计一个页面上用户点击的热度分布图,支持中文显示。
  • python 画热图方式

    2020-10-07 19:53:35
    im = plt.imshow(data, cmap=plt.cm.jet) plt.colorbar(im) plt.show() 最后热图的排序和data排序一致
  • import numpy as np import matplotlib.pyplot as plt def normalization(data): rang=np.max(data)-np.min(data) return (data-np.min(data))/rang def save_1_feature_map(feature_map): ...
  • 3. NLP中注意力机制起源 4. NLP中的注意力机制 5. Hierarchical Attention 6. Attention机制的本质 7. Self-Attention 8. Memory-based Attention 9. Soft/Hard Attention 10. Global/Local Att...
  • 注意力模型是近年来在序列处理领域新提出的机器学习方法,在语言翻译等领域取得了不错的效果。要想了解注意力模型,那么必须对现在的机器学习各领域有一定的了解,而且要了解encoder-decoder基本思想。 首先可以...
  • 上一篇热图给大家讲解了如何在地图上绘制热图,那有的小伙伴会说,我不需要地图,我就想做一个展示数据分布的普通热图, 不行吗?好,没问题,今天就给大家讲解一个美观的热图~ 先放效果图: 有些小伙伴可能会...
  •  对于全遮罩图像,眼睛和嘴巴都吸引了注意力,而对于重放图像和照片图像,注意力在面部的分布几乎是随机的。然而,对于真实的脸来说,注意力主要集中在下巴上,并有规律地分布。 图14 (Top-2-down行):测试...
  • 热图(Heat Map)的绘制

    千次阅读 2018-07-15 18:39:34
    热图是无监督聚类的一种第一行:标签无监督聚类的结果状态。绿色为一类,白色另一类第二行: 真实分类状态(金标准)。绿色下的灰色为分类正确的,黑色为分类错误的。白色下的黑色为分类正确的,灰色为分类错误的。...
  • Heatmap,热图的应用和相关技术

    千次阅读 2012-03-20 14:11:25
    Heatmap,热图的应用和相关技术 Heatmap热图,可以非常直观的呈现一些原本不易理解或表达的数据,比如密度、频率、温度等,改用区域和颜色这种更容易被人理解的方式来呈现。热图实际上是三维可视化的俯瞰效果。...
  • 图神经网络(GNN)是机器学习中最热门的研究方向之一,在提出后的十几年里被不断扩展,先后发展出了图卷积网络、 图注意力网络、图自编码器、图生成网络和图时空网络等多个子领域。最近,图注意力网...
  • 局部病变补丁是使用热图注意力)层从全局图像中裁剪出来的。BCE表示二元交叉熵损失。 为了从注意力的角度理解模型在做什么,我们必须首先了解软注意力和硬注意力之间的区别。本质上,注意力根据一些外部或内部(自...
  • https://blog.csdn.net/hpulfc/article/details/80448570
  • Pytorch可视化神经网络热力图

    千次阅读 2021-02-17 17:01:41
    from PIL import Image import torch import torchvision.transforms as transforms import numpy as np import matplotlib.pyplot as plt import cv2 def draw_CAM(model,img_path,save_path,resize=227,isSave=...
  • ![![图片说明](https://img-ask.csdn.net/upload/201804/16/1523879709_506244.png)... 在很多博客和外文文献都会看到类似这样的示意图,想请问一下具体要怎么做到打印这类图片呢?如果能有个小例子就最好了 :) 感谢。
  • 论文中注意力机制可视化图的制作

    千次阅读 2019-07-25 11:52:36
    最近在使用注意力机制实现文本分类,我们需要观察每一个样本中,模型的重心放在哪里了,就是观察到权重最大的token。这时我们需要使用热力图进行可视化。 我这里用到:seaborn seaborn.heatmap seaborn.heatmap...
  •  对UE(User Experience)或者UI(User Interface)而言,比较二者(注意力热图和点击热图)的差异具有非常重要的价值。如果某个区域吸引了很多目光,那么干嘛我们不把最重要的内容放在这里呢?反过来,如果某个...
  • pytorch CAM得到热力图

    千次阅读 热门讨论 2020-12-16 18:55:37
    if use_gpu: logit = net(img_variable.cuda()).detach().cpu() else: logit = net(img_variable).detach() params = list(net.parameters())[-2] # 这个 -2 要注意,改成自己网络的对应层数,全连接层前面那一层,...
  • 原文 名词 Attention机制 BBs building blocks DL deep learning HSI Hyperspectral image ...所提出的基于注意的方法是数据驱动的,在深度体系结构的不同深度重新使用卷积激活,识别光谱中信息最丰富的区域
  • 来源:机器学习研究组订阅自从引入网络以来,深度学习中的注意力机制在机器翻译和社区中广受欢迎。然而,在计算机视觉中,卷积神经网络 (CNN) 仍然是常态,自注意力才刚刚开始慢慢渗透到研究的...
  • 基本是机器翻译,也进行了基本的人工矫正,凑活看吧 原论文:《An Introductory Survey on Attention ...首先源于人类直觉,后来适用于机器翻译以进行自动tokens对齐,注意机制,一种可用于根据每个元素分配的重...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,358
精华内容 543
关键字:

注意力热图