精华内容
下载资源
问答
  • keras, TensorFlow中加入注意力机制原文:https://blog.csdn.net/qq_38410428/article/details/103695032第一步:找到要修改文件的源代码在里面添加通道注意力机制和空间注意力机制所需库from keras.layers import ...

    keras, TensorFlow中加入注意力机制原文:https://blog.csdn.net/qq_38410428/article/details/103695032

    第一步:找到要修改文件的源代码

    在里面添加通道注意力机制和空间注意力机制

    所需库

    from keras.layers import GlobalAveragePooling2D, GlobalMaxPooling2D, Reshape, Dense, multiply, Permute, Concatenate, Conv2D, Add, Activation, Lambda

    from keras import backend as K

    from keras.activations import sigmoid

    1

    2

    3

    通道注意力机制

    def channel_attention(input_feature, ratio=8):

    channel_axis = 1 if K.image_data_format() == "channels_first" else -1

    channel = input_feature._keras_shape[channel_axis]

    shared_layer_one = Dense(channel//ratio,

    kernel_initializer='he_normal',

    activation = 'relu',

    use_bias=True,

    bias_initializer='zeros')

    shared_layer_two = Dense(channel,

    kernel_initializer='he_normal',

    use_bias=True,

    bias_initializer='zeros')

    avg_pool = GlobalAveragePooling2D()(input_feature)

    avg_pool = Reshape((1,1,channel))(avg_pool)

    assert avg_pool._keras_shape[1:] == (1,1,channel)

    avg_pool = shared_layer_one(avg_pool)

    assert avg_pool._keras_shape[1:] == (1,1,channel//ratio)

    avg_pool = shared_layer_two(avg_pool)

    assert avg_pool._keras_shape[1:] == (1,1,channel)

    max_pool = GlobalMaxPooling2D()(input_feature)

    max_pool = Reshape((1,1,channel))(max_pool)

    assert max_pool._keras_shape[1:] == (1,1,channel)

    max_pool = shared_layer_one(max_pool)

    assert max_pool._keras_shape[1:] == (1,1,channel//ratio)

    max_pool = shared_layer_two(max_pool)

    assert max_pool._keras_shape[1:] == (1,1,channel)

    cbam_feature = Add()([avg_pool,max_pool])

    cbam_feature = Activation('hard_sigmoid')(cbam_feature)

    if K.image_data_format() == "channels_first":

    cbam_feature = Permute((3, 1, 2))(cbam_feature)

    return multiply([input_feature, cbam_feature])

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    空间注意力机制

    def spatial_attention(input_feature):

    kernel_size = 7

    if K.image_data_format() == "channels_first":

    channel = input_feature._keras_shape[1]

    cbam_feature = Permute((2,3,1))(input_feature)

    else:

    channel = input_feature._keras_shape[-1]

    cbam_feature = input_feature

    avg_pool = Lambda(lambda x: K.mean(x, axis=3, keepdims=True))(cbam_feature)

    assert avg_pool._keras_shape[-1] == 1

    max_pool = Lambda(lambda x: K.max(x, axis=3, keepdims=True))(cbam_feature)

    assert max_pool._keras_shape[-1] == 1

    concat = Concatenate(axis=3)([avg_pool, max_pool])

    assert concat._keras_shape[-1] == 2

    cbam_feature = Conv2D(filters = 1,

    kernel_size=kernel_size,

    activation = 'hard_sigmoid',

    strides=1,

    padding='same',

    kernel_initializer='he_normal',

    use_bias=False)(concat)

    assert cbam_feature._keras_shape[-1] == 1

    if K.image_data_format() == "channels_first":

    cbam_feature = Permute((3, 1, 2))(cbam_feature)

    return multiply([input_feature, cbam_feature])

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    构建CBAM

    def cbam_block(cbam_feature,ratio=8):

    """Contains the implementation of Convolutional Block Attention Module(CBAM) block.

    As described in https://arxiv.org/abs/1807.06521.

    """

    cbam_feature = channel_attention(cbam_feature, ratio)

    cbam_feature = spatial_attention(cbam_feature, )

    return cbam_feature

    1

    2

    3

    4

    5

    6

    7

    8

    在相应的位置添加CBAM

    inputs = x

    residual = layers.Conv2D(filter, kernel_size = (1, 1), strides = strides, padding = 'same')(inputs)

    residual = layers.BatchNormalization(axis = bn_axis)(residual)

    cbam = cbam_block(residual)

    x = layers.add([x, residual, cbam])

    1

    2

    3

    4

    5

    6

    这样就在任意位置加入了注意力机制啦。返回列表华为云比赛-垃圾分类挑战-数据集、源代码解析与下载

    展开全文
  • 针对RGB-D图像的语义分割问题,提出了一种结合通道注意力机制的RefineNet网络。考虑到网络特征图中各个通道重要性的不同,将通道注意力机制分别引入基本RefineNet的编码器和解码器模块,以增强网络对重要特征的学习...
  • 本文是在阅读完《Residual Attention Network for Image Classification》所做的笔记,由于本人对注意力机制了解甚浅,笔记当中若有不恰当的地方,还望指出。0 前言计算机视觉中的注意力机制的基本思想是让模型学会...

    20f2f65ff1e669c0991dd818d158a38e.png

    本文是在阅读完《Residual Attention Network for Image Classification》所做的笔记,

    由于本人对注意力机制了解甚浅,笔记当中若有不恰当的地方,还望指出。

    0 前言

    计算机视觉中的注意力机制的基本思想是让模型学会专注,把注意力集中在重要的信息上而忽视不重要的信息。

    举个简单的例子,对于图像分类任务,有只狗在广阔无垠的沙漠里漫步,模型能识别出有只狗,那假如狗是在茂密的森林里散步呢,模型有可能识别不出来,这是为什么呢?

    因为模型并没有把注意力放在狗上,而是放在整张图上,这样一旦换了背景,模型很有可能会分类出错。而我们人类却能很好地对此进行分类,因为我们只关注场景中是否有狗,而不关注背景究竟是沙漠还是森林,可以简单地理解这就是注意力机制。

    那如果让模型也像我们一样只关注场景中是否有狗,那岂不是分类会更准?是的,会更准。

    1 介绍

    接下来本文将介绍Residual Attention Network,它是一种注意力网络。受注意力机制和深度神经网络的启发,作者提出了Residual Attention Network,它主要包含数个堆积的Attention Module,每一个Module专注于不同类型的注意力信息,而这样简单地堆积Attention Module会对特征的表达有负面的,所以作者提出了Attention Residual Learning。

    Residual Attention Network的结构如下:

    615cd2d0e1045dc42164e87957f93d74.png

    在详细介绍Residual Attention Network的设计之前,先看看它的优点。

    优点:

    (1) 生成的特征更具判别度,即在特征空间中,类内差距小,类间差距大

    (2) 逐渐增加Attention Module的数量,能持续提高模型的性能

    (3) 能以端到端的训练方式整合到深层网络当中

    原因:

    (1) Stacked network structure:分工不同,不同的Attention Module能捕获不同的注意力信息,这里的不同模块是指所处的位置不同,而模块的结构是一样的

    (2) Attention Residual Learning:Stacked network structure会导致性能明显的下降,于是提出了Attention Residual Learning,这个会在下面介绍

    (3) Bottom-up top-down feedforward attention

    2 网络设计

    615cd2d0e1045dc42164e87957f93d74.png

    2.0 Attention Module

    Residual Attention Network由多个Attention Module组成。每一个Attention Module分为两条branch,一条是mask branch,另一条是trunk branch。trunk branch负责提取特征,mask branch负责生成注意力信息(即权重)。

    假定一个模块H的输入是x,trunk branch的输出是T(x),mask branch的输出是M(x),则模块H的输出是

    ,其中i是像素点的位置,c是对应的通道位置。这其实是Residual Attention Network自称为mixed attention的原因。例如T(x)的维数为(channel, height, width),那么M(x)的维数也为(channel, height, width),这样两个张量进行点乘操作,也就是空间对应位置的值进行相乘。

    在Attention Module中,mask不仅做为前向传播的特征选择器,还做为反向传播的梯度过滤器,公式一看便知,

    其中

    是mask branch的参数,
    是trunk branch的参数。从上面的公式可以看出mask branch能抑制来自噪声的wrong gradients,这使得Attention Module对噪声具有更强的鲁棒性。

    那为什么要使用多个Attention Module呢?

    如果只使用单个的Attention Module,会存在以下问题:

    (1) 图片的背景可能是混乱的、复杂的,前景的形态可能是多变的,例如不同的狗在不同的背景之下,而这把这样的重任交给单个的Attention Module,这样效果肯定是不如人意的

    (2) 单个Attention Module只修正特征一次,如果恰好这次的修正是不恰当的,也就是注意力发挥的作用是负面的,那后续的特征就没有得到再次修正的机会了,那这样的结果肯定也是不如人意的

    当然了,Residual Attention Network很好地解决了上述的两个问题,它使用多个Attention Module,每一个trunk branch有其对应的mask branch,这样不同的mask branch就能学到不同的注意力信息。

    a514b6bab83bb935d287a3e4516c5bc7.png

    如上图,这是一张热空气气球的图片,在Low-level处,有对应的Sky mask清除蓝色的颜色特征,同时在High-level处,有对应的Ballon instance mask修正part feature。

    2.1 Attention Residual Learning

    然而,简单地堆积Attention Module却会导致性能的明显下降。这其中的原因有两个,一是mask的值是在0-1之间,如果特征图反复地和mask做点乘运算,无疑会降低深层特征层的值(0.9 * 0.9 * 0.9*0.9 ......会变得很小),另一个是soft mask会破坏trunk branch的良好特性。

    为此,作者提出了attention residual learning。Attention Module的输出H可重新定义为:

    ,其中M(x)的取值范围在0-1之间,如果M(x)的值接近于0,那么H(x)的值会近似等于T(x),这样从理论上讲,有Attention Module的效果肯定不会差过没有Attention Module的效果。这里的M(x)是关键,通过添加这个Mask,模型可以自适应地提高重要的特征同时忽视来自trunk branch的噪声。

    da89ea6e87e5745e8268b1fe90ae7daa.png

    在介绍处提到的Bottom-up top-down feedforward attention其实就是这里的down sample和up sample。

    堆积Attention Module并使用Attention residual learning,能使模型在保留重要的特征情况下还不破坏原始特征的特性。堆积的Attention Modules能渐渐地修正特征图,从下图可知,层数越深,特征越清晰。

    9f9e28717cfeabab67629d62d2b39abb.png

    2.2 Soft Mask Branch

    2540a5cb64cac214499df45abcde3043.png

    622307f057b79b3b4290eadd61d4bf2b.png

    其中r表示的是相邻最大池化之间残差模块的数目,上图就是其中一个Soft Mask Branch,包括fast feed-forward sweep和top-down feedback step,前者用于快速地收集整张图片的全局信息,后者用于把全局信息和原始特征图结合起来。

    2.3 Spatial Attention and Channel Attenion

    对应于mixed attention、channel attention、spatial attention这三种注意力机制,作者分别使用了三种不同类型的激活函数。对于mixed attention

    ,是在每个channel和每个spatioal position简单地使用了sigmoid函数,对于channel attention
    ,是在channel这个维度添加了L2正则化,对于spatial attention
    ,是在spatial这个维度使用了sigmoid函数。具体的公式如下:

    ddae628efc67aab1c07423557370cea3.png

    其中i是像素点的位置,c是对应的通道位置,

    分别表示第c层的均值和标准差,
    是第i点这个位置的特征向量。

    f9a76f997e37cd37fbe0a1590ecbadcc.png

    实验结果如上图,mixed attention的效果最好,这表示让Attention Module自适应地改变而不添加额外的约束会获得更好的性能。

    3 总结

    作者提出了Residual Attention Network,它包含数个Attention Module,并使用了Attention Residual Learning。Residual Attention Network效果好的原因有两,一是包含数个Attention Module,这样每个Attention Module都能关注不同类型的注意力信息,二是把top-down注意力机制整合到bottom-up top-down feedforward结构当中。

    展开全文
  • Attention机制在近几年来在图像,自然语言处理等领域中都取得了重要的突破,被证明有益于提高模型的性能。 Attention机制本身也是符合人脑和人眼的感知机制,这次我们主要以计算机视觉领域为例,讲述Attention机制...

    Attention机制在近几年来在图像,自然语言处理等领域中都取得了重要的突破,被证明有益于提高模型的性能。

    Attention机制本身也是符合人脑和人眼的感知机制,这次我们主要以计算机视觉领域为例,讲述Attention机制的原理,应用以及模型的发展

    何为Attention机制?

    所谓Attention机制,便是聚焦于局部信息的机制,比如,图像中的某一个图像区域。随着任务的变化,注意力区域往往会发生变化。
    在这里插入图片描述
    面对上面这样的一张图,如果你只是从整体来看,只看到了很多人头,但是你拉近一个一个仔细看就了不得了,都是天才科学家。

    图中除了人脸之外的信息其实都是无用的,也做不了什么任务,Attention机制便是要找到这些最有用的信息,可以想到,最简单的场景就是从照片中检测人脸了。

    基于Attention的显著目标检测

    和注意力机制相伴而生的一个任务便是显著目标检测,即salient object detection。它的输入是一张图,输出是一张概率图,概率越大的地方,代表是图像中重要目标的概率越大,即人眼关注的重点,一个典型的显著图如下:
    在这里插入图片描述
    右图就是左图的显著图,在头部位置概率最大,另外腿部,尾巴也有较大概率,这就是图中真正有用的信息。

    显著目标检测需要一个数据集,而这样的数据集的收集便是通过追踪多个实验者的眼球在一定时间内的注意力方向进行平均得到,典型的步骤如下:
    (1) 让被测试者观察图。

    (2) 用eye tracker记录眼睛的注意力位置。

    (3) 对所有测试者的注意力位置使用高斯滤波进行综合。

    (4) 结果以0~1的概率进行记录。

    于是就能得到下面这样的图,第二行是眼球追踪结果,第三行就是显著目标概率图。

    在这里插入图片描述
    上面讲述的都是空间上的注意力机制,即关注的是不同空间位置,而在CNN结构中,还有不同的特征通道,因此不同特征通道也有类似的原理 ,下面一起讲述。

    Attention模型架构

    注意力机制的本质就是定位到感兴趣的信息,抑制无用信息,结果通常都是以概率图或者概率特征向量的形式展示,从原理上来说,主要分为空间注意力模型,通道注意力模型,空间和通道混合注意力模型三种,这里不区分soft和hard attention。

    1.空间注意力模型(spatial attention)

    不是图像中所有的区域对任务的贡献都是同样重要的,只有任务相关的区域才是需要关心的,比如分类任务的主体,空间注意力模型就是寻找网络中最重要的部位进行处理。

    我们在这里给大家介绍两个具有代表性的模型,第一个就是Google DeepMind提出的STN网络(Spatial Transformer Network[1]),它通过学习输入的形变,从而完成适合任务的预处理操作,是一种基于空间的Attention模型,网络结构如下:

    在这里插入图片描述
    这里的Localization Net用于生成仿射变换系数,输入是C×H×W维的图像,输出是一个空间变换系数,它的大小根据要学习的变换类型而定,如果是仿射变换,则是一个6维向量。

    这样的一个网络要完成的效果如下图:
    在这里插入图片描述
    即定位到目标的位置,然后进行旋转等操作,使得输入样本更加容易学习。这是一种一步调整的解决方案,当然还有很多迭代调整的方案,感兴趣可以去有三知识星球星球中阅读。

    相比于Spatial Transformer Networks 一步完成目标的定位和仿射变换调整,Dynamic Capacity Networks[2]则采用了两个子网络,分别是低性能的子网络(coarse model)和高性能的子网络(fine model)。

    • 低性能的子网络(coarse model)用于对全图进行处理,定位感兴趣区域,如下图中的操作fc。
    • 高性能的子网络(fine model)则对感兴趣区域进行精细化处理,如下图的操作ff。
    • 两者共同使用,可以获得更低的计算代价和更高的精度。
      在这里插入图片描述
      由于在大部分情况下我们感兴趣的区域只是图像中的一小部分,因此空间注意力的本质就是定位目标并进行一些变换或者获取权重。
    2 通道注意力机制

    对于输入2维图像的CNN来说,一个维度是图像的尺度空间,即长宽,另一个维度就是通道,因此基于通道的Attention也是很常用的机制。

    SENet(Sequeeze and Excitation Net)[3]是2017届ImageNet分类比赛的冠军网络,本质上是一个基于通道的Attention模型,它通过建模各个特征通道的重要程度,然后针对不同的任务增强或者抑制不同的通道,原理图如下。

    在这里插入图片描述
    在正常的卷积操作后分出了一个旁路分支,首先进行Squeeze操作(即图中Fsq(·)),它将空间维度进行特征压缩,即每个二维的特征图变成一个实数,相当于具有全局感受野的池化操作,特征通道数不变。

    然后是Excitation操作(即图中的Fex(·)),它通过参数w为每个特征通道生成权重,w被学习用来显式地建模特征通道间的相关性。在文章中,使用了一个2层bottleneck结构(先降维再升维)的全连接层+Sigmoid函数来实现。

    得到了每一个特征通道的权重之后,就将该权重应用于原来的每个特征通道,基于特定的任务,就可以学习到不同通道的重要性。

    将其机制应用于若干基准模型,在增加少量计算量的情况下,获得了更明显的性能提升。作为一种通用的设计思想,它可以被用于任何现有网络,具有较强的实践意义。而后SKNet[4]等方法将这样的通道加权的思想和Inception中的多分支网络结构进行结合,也实现了性能的提升。

    通道注意力机制的本质,在于建模了各个特征之间的重要性,对于不同的任务可以根据输入进行特征分配,简单而有效。

    3 空间和通道注意力机制的融合

    前述的Dynamic Capacity Network是从空间维度进行Attention,SENet是从通道维度进行Attention,自然也可以同时使用空间Attention和通道Attention机制

    CBAM(Convolutional Block Attention Module)[5]是其中的代表性网络,结构如下:
    在这里插入图片描述
    通道方向的Attention建模的是特征的重要性,结构如下:

    在这里插入图片描述
    同时使用最大pooling和均值pooling算法,然后经过几个MLP层获得变换结果,最后分别应用于两个通道,使用sigmoid函数得到通道的attention结果。

    空间方向的Attention建模的是空间位置的重要性,结构如下:
    在这里插入图片描述
    首先将通道本身进行降维,分别获取最大池化和均值池化结果,然后拼接成一个特征图,再使用一个卷积层进行学习。

    这两种机制,分别学习了通道的重要性和空间的重要性,还可以很容易地嵌入到任何已知的框架中。

    除此之外,还有很多的注意力机制相关的研究,比如残差注意力机制,多尺度注意力机制,递归注意力机制等。

    展开全文
  • 其次,引入通道注意力机制,使网络更关注特征层中的有效特征通道,重新调整特征图;最后,用空对地目标检测数据进行了对比实验。结果表明,改进模型的平均精度均值比基于视觉几何组(VGG16)的单步多框检测算法高3.44个百分...
  • 注意力往往与encoder-decoder(seq2seq)框架搭在一起,假设我们编码前与解码后的序列如下:编码时...所以,注意力机制的任务就是突出重点,也就是说,我们的中间语义C对不同i应该有不同的侧重点,即上式变为:常见的...

    注意力往往与encoder-decoder(seq2seq)框架搭在一起,假设我们编码前与解码后的序列如下:

    编码时,我们将source通过非线性变换到中间语义:

    则我们解码时,第i个输出为:

    可以看到,不管i为多少,都是基于相同的中间语义C进行解码的,也就是说,我们的注意力对所有输出都是相同的。所以,注意力机制的任务就是突出重点,也就是说,我们的中间语义C对不同i应该有不同的侧重点,即上式变为:

    常见的有Bahdanau Attention

    e(h,s)代表一层全连接层。

    及Luong Attention

    代码的主要目标是通过一个描述时间的字符串,预测为数字形式的字符串。如“ten before ten o'clock a.m”预测为09:50

    在jupyter上运行,代码如下:

    1,导入模块,好像并没有全部使用到,如Permute,Multiply,Reshape,LearningRateScheduler等

    1 from keras.layers importBidirectional, Concatenate, Permute, Dot, Input, LSTM, Multiply, Reshape2 from keras.layers importRepeatVector, Dense, Activation, Lambda3 from keras.optimizers importAdam4 #from keras.utils import to_categorical

    5 from keras.models importload_model, Model6 #from keras.callbacks import LearningRateScheduler

    7 importkeras.backend as K8

    9 importmatplotlib.pyplot as plt10 %matplotlib inline11

    12 importrandom13 #import math

    14

    15 importjson16 import numpy as np

    2,加载数据集,以及翻译前和翻译后的词典

    1 with open('data/Time Dataset.json','r') as f:2 dataset =json.loads(f.read())3 with open('data/Time Vocabs.json','r') as f:4 human_vocab, machine_vocab =json.loads(f.read())5

    6 human_vocab_size =len(human_vocab)7 machine_vocab_size = len(machine_vocab)

    这里human_vocab词典是将每个字符映射到索引,machine_vocab是将翻译后的字符映射到索引,因为翻译后的时间只包含0-9以及冒号:

    3,定义数据处理方法

    1 defpreprocess_data(dataset, human_vocab, machine_vocab, Tx, Ty):2 """

    3 A method for tokenizing data.4

    5 Inputs:6 dataset - A list of sentence data pairs.7 human_vocab - A dictionary of tokens (char) to id's.8 machine_vocab - A dictionary of tokens (char) to id's.9 Tx - X data size10 Ty - Y data size11

    12 Outputs:13 X - Sparse tokens for X data14 Y - Sparse tokens for Y data15 Xoh - One hot tokens for X data16 Yoh - One hot tokens for Y data17 """

    18

    19 #Metadata

    20 m =len(dataset)21

    22 #Initialize

    23 X = np.zeros([m, Tx], dtype='int32')24 Y = np.zeros([m, Ty], dtype='int32')25

    26 #Process data

    27 for i inrange(m):28 data =dataset[i]29 X[i] =np.array(tokenize(data[0], human_vocab, Tx))30 Y[i] = np.array(tokenize(data[1], machine_vocab, Ty))31

    32 #Expand one hots

    33 Xoh =oh_2d(X, len(human_vocab))34 Yoh =oh_2d(Y, len(machine_vocab))35

    36 return(X, Y, Xoh, Yoh)37

    38 deftokenize(sentence, vocab, length):39 """

    40 Returns a series of id's for a given input token sequence.41

    42 It is advised that the vocab supports and .43

    44 Inputs:45 sentence - Series of tokens46 vocab - A dictionary from token to id47 length - Max number of tokens to consider48

    49 Outputs:50 tokens -51 """

    52 tokens = [0]*length53 for i inrange(length):54 char = sentence[i] if i < len(sentence) else ""

    55 char = char if (char in vocab) else ""

    56 tokens[i] =vocab[char]57

    58 returntokens59

    60 defids_to_keys(sentence, vocab):61 """

    62 Converts a series of id's into the keys of a dictionary.63 """

    64 reverse_vocab = {v: k for k, v invocab.items()}65

    66 return [reverse_vocab[id] for id insentence]67

    68 defoh_2d(dense, max_value):69 """

    70 Create a one hot array for the 2D input dense array.71 """

    72 #Initialize

    73 oh =np.zeros(np.append(dense.shape, [max_value]))74 #oh=np.zeros((dense.shape[0],dense.shape[1],max_value)) 这样写更为直观

    75

    76 #Set correct indices

    77 ids1, ids2 = np.meshgrid(np.arange(dense.shape[0]), np.arange(dense.shape[1]))78

    79 #'F'表示一列列的展开,默认按行展开。将id序列中每个数字再one-hot化。

    80 oh[ids1.flatten(), ids2.flatten(), dense.flatten('F').astype(int)] = 1

    81

    82 return oh

    4,输入中最长的字符串为41,输出长度都是5,训练测试数据使用one-hot编码后的,训练集占比80%

    1 Tx = 41 #Max x sequence length

    2 Ty = 5 #y sequence length

    3 X, Y, Xoh, Yoh =preprocess_data(dataset, human_vocab, machine_vocab, Tx, Ty)4

    5 #Split data 80-20 between training and test

    6 train_size = int(0.8*len(dataset))7 Xoh_train =Xoh[:train_size]8 Yoh_train =Yoh[:train_size]9 Xoh_test =Xoh[train_size:]10 Yoh_test = Yoh[train_size:]

    5,定义每次新预测时注意力的更新

    在预测输出yi-1后,预测yi时,我们需要不同的注意力分布,即重新生成这个分布

    1 #Define part of the attention layer gloablly so as to

    2 #share the same layers for each attention step.

    3 defsoftmax(x):4 return K.softmax(x, axis=1)5 #重复矢量,用于将一个矢量扩展成一个维度合适的tensor

    6 at_repeat =RepeatVector(Tx)7 #在最后一位进行维度合并

    8 at_concatenate = Concatenate(axis=-1)9 at_dense1 = Dense(8, activation="tanh")10 at_dense2 = Dense(1, activation="relu")11 at_softmax = Activation(softmax, name='attention_weights')12 #这里参数名为axes。。虽然和axis是一个意思

    13 at_dot = Dot(axes=1)14

    15 #每次新的预测的时候都需要更新attention

    16 defone_step_of_attention(h_prev, a):17 """18 Get the context.

    19

    20 Input:

    21 h_prev - Previous hidden state of a RNN layer (m, n_h)

    22 a - Input data, possibly processed (m, Tx, n_a)

    23

    24 Output:

    25 context - Current context (m, Tx, n_a)

    26"""

    27 #Repeat vector to match a's dimensions

    28 h_repeat =at_repeat(h_prev)29 #Calculate attention weights

    30 i = at_concatenate([a, h_repeat]) #对应公式中x和yt-1合并

    31 i = at_dense1(i)#对应公式中第一个Dense

    32 i = at_dense2(i)#第二个Dense

    33 attention = at_softmax(i)#Softmax,此时得到一个注意力分布

    34 #Calculate the context

    35 #这里使用新的attention与输入相乘,即注意力的核心原理:对于输入产生某种偏好分布

    36 context = at_dot([attention, a])#Dot,使用注意力偏好分布作用于输入,返回更新后的输入

    37

    38 return context

    以上,注意力的计算公式如下所示:

    6,定义注意力层

    1 defattention_layer(X, n_h, Ty):2 """

    3 Creates an attention layer.4

    5 Input:6 X - Layer input (m, Tx, x_vocab_size)7 n_h - Size of LSTM hidden layer8 Ty - Timesteps in output sequence9

    10 Output:11 output - The output of the attention layer (m, Tx, n_h)12 """

    13 #Define the default state for the LSTM layer

    14 #Lambda层不需要训练参数,这里初始化状态

    15 h = Lambda(lambda X: K.zeros(shape=(K.shape(X)[0], n_h)))(X)16 c = Lambda(lambda X: K.zeros(shape=(K.shape(X)[0], n_h)))(X)17 #Messy, but the alternative is using more Input()

    18

    19 at_LSTM = LSTM(n_h, return_state=True)20

    21 output =[]22

    23 #Run attention step and RNN for each output time step

    # 这里就是每次预测时,先更新context,用这个新的context通过LSTM获得各个输出h

    24 for _ inrange(Ty):25 #第一次使用初始化的注意力参数作用输入X,之后使用上一次的h作用输入X,保证每次预测的时候注意力都对输入产生偏好

    26 context =one_step_of_attention(h, X)27 #得到新的输出

    28 h, _, c = at_LSTM(context, initial_state=[h, c])29

    30 output.append(h)31 #返回全部输出

    32 return output

    7,定义模型

    1 layer3 = Dense(machine_vocab_size, activation=softmax)2 layer1_size=32

    3 layer2_size=64

    4 defget_model(Tx, Ty, layer1_size, layer2_size, x_vocab_size, y_vocab_size):5 """6 Creates a model.

    7

    8 input:

    9 Tx - Number of x timesteps

    10 Ty - Number of y timesteps

    11 size_layer1 - Number of neurons in BiLSTM

    12 size_layer2 - Number of neurons in attention LSTM hidden layer

    13 x_vocab_size - Number of possible token types for x

    14 y_vocab_size - Number of possible token types for y

    15

    16 Output:

    17 model - A Keras Model.

    18"""

    19

    20 #Create layers one by one

    21 X = Input(shape=(Tx, x_vocab_size))22 #使用双向LSTM

    23 a1 = Bidirectional(LSTM(layer1_size, return_sequences=True), merge_mode='concat')(X)24

    25 #注意力层

    26 a2 =attention_layer(a1, layer2_size, Ty)27 #对输出h应用一个Dense得到最后输出y

    28 a3 = [layer3(timestep) for timestep ina2]29

    30 #Create Keras model

    31 model = Model(inputs=[X], outputs=a3)32

    33 return model

    8,训练模型

    1 model =get_model(Tx, Ty, layer1_size, layer2_size, human_vocab_size, machine_vocab_size)2 #这里我们可以看下模型的构成,需要提前安装graphviz模块

    3 from keras.utils importplot_model4 #在当前路径下生成模型各层的结构图,自己去看看理解

    5 plot_model(model,show_shapes=True,show_layer_names=True)6 opt = Adam(lr=0.05, decay=0.04, clipnorm=1.0)7 model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])8 #(8000,5,11)->(5,8000,11),以时间序列而非样本序列去训练,因为多个样本间是没有“序”的关系的,这样RNN也学不到啥东西

    9 outputs_train = list(Yoh_train.swapaxes(0,1))10 model.fit([Xoh_train], outputs_train, epochs=30, batch_size=100,verbose=2

    如下为模型的结构图

    9,评估

    1 outputs_test = list(Yoh_test.swapaxes(0,1))2 score =model.evaluate(Xoh_test, outputs_test)3 print('Test loss:', score[0])

    10,预测

    这里就随机对数据集中的一个样本进行预测

    3 i =random.randint(0, len(dataset))4

    5 defget_prediction(model, x):6 prediction =model.predict(x)7 max_prediction = [y.argmax() for y inprediction]8 str_prediction = "".join(ids_to_keys(max_prediction, machine_vocab))9 return(max_prediction, str_prediction)10

    11 max_prediction, str_prediction = get_prediction(model, Xoh[i:i+1])12

    13 print("Input:" +str(dataset[i][0]))14 print("Tokenized:" +str(X[i]))15 print("Prediction:" +str(max_prediction))16 print("Prediction text:" + str(str_prediction))

    11,还可以查看一下注意力的图像

    1 i =random.randint(0, len(dataset))2

    3 def plot_attention_graph(model, x, Tx, Ty, human_vocab, layer=7):4 #Process input

    5 tokens =np.array([tokenize(x, human_vocab, Tx)])6 tokens_oh =oh_2d(tokens, len(human_vocab))7

    8 #Monitor model layer

    9 layer =model.layers[layer]10

    11 layer_over_time = K.function(model.inputs, [layer.get_output_at(t) for t inrange(Ty)])12 layer_output =layer_over_time([tokens_oh])13 layer_output = [row.flatten().tolist() for row inlayer_output]14

    15 #Get model output

    16 prediction = get_prediction(model, tokens_oh)[1]17

    18 #Graph the data

    19 fig =plt.figure()20 fig.set_figwidth(20)21 fig.set_figheight(1.8)22 ax = fig.add_subplot(111)23

    24 plt.title("Attention Values per Timestep")25

    26 plt.rc('figure')27 cax = plt.imshow(layer_output, vmin=0, vmax=1)28 fig.colorbar(cax)29

    30 plt.xlabel("Input")31 ax.set_xticks(range(Tx))32 ax.set_xticklabels(x)33

    34 plt.ylabel("Output")35 ax.set_yticks(range(Ty))36 ax.set_yticklabels(prediction)37

    38 plt.show()39 #这个图像如何看:先看纵坐标,从上到下,为15:48,生成1和5时注意力在four这个单词上,生成48分钟的时候注意力集中在before单词上,这个例子非常好

    40 plot_attention_graph(model, dataset[i][0], Tx, Ty, human_vocab)

    如图所示,在预测1和5时注意力在four单词上,预测4,8时注意力在before单词上,这比较符合逻辑。

    展开全文
  • (1)FPA: Feature Pyramid Attention作者认为像SENet和EncNet这样对通道加attention是不够的,我们需要对pixel加attention,同时采纳了PSPnet的global pooling的思想,将pooling的结果与加了attention的卷积的结果...
  • 基于通道注意力机制改进网络6.再次训练7.再次测试完整代码总结 前言 近年来,由于高光谱数据的独特性质以及所包含的海量信息,对于高光谱图像的分析与处理已经成为遥感影像研究领域的热点之一,而其中的高光谱图像...
  • 位置注意力和通道注意力机制

    千次阅读 2020-07-08 11:55:21
    需要注意的是,在计算两个通道的关系之前,我们没有使用卷积层来计算特征,因为它可以维持不同通道之间的映射关系。此外,与通过全局池化或者编码层来探索通道关系不同,我们利用所有相关位置的空间信息来建模通道...
  • 1. 前言注意力机制来源于人类最自然的选择性注意的习惯,例如当用户浏览网页或图片时,会选择性的注意页面上特定的区域。基于此现象,在建模的过程中考虑注意力机制,往往会取得不错的收益。注意力机制已经广泛的...
  • 本文首先盘点了传统的激活函数以及注意力机制,然后解读了一种注意力机制下的新型激活函数,也就是自适应参数化修正线性单元(Adaptively Parametric Rectifier Linear Unit,APReLU)。1. 激活函数激活函数是人工...
  • 本文在综述传统激活函数和注意力机制的基础上,解读了一种注意力机制下的激活函数,即自适应参数化修正线性单元(Adaptively Parametric Rectifier Linear Unit,APReLU),希望对大家有所帮助。 1. 激活函数激活...
  • 【导读】近几年,注意力机制(Attention)大量地出现在自动翻译、信息检索等模型中。可以把Attention看成模型中的一个特征选择组件,特征选择一方面可以增强模型的效果,另一方面,我们可以通过计算出的特征的权重来...
  • 让我们一起来了解下注意力机制吧。 什么是注意力机制所谓Attention机制,便是聚焦于局部信息的机制,比如,图像中的某一个图像区域。随着任务的变化,注意力区域往往会发生变化。面对上面这样的一张图,如果你只是从...
  • 点击上方“CVer”,选择加"星标"或“置顶”重磅干货,第一时间送达本文转载自:AI算法修炼营什么是视觉中的注意力机制?计算机视觉(computer vision)中的注意力机制(attention)的基本思想就是想让系统学会注意力——...
  • Dual Attention Network for Scene Segmentation 摘要在本文中,我们通过基于自注意力机制捕获丰富的上下文相关性来解决场景分割任务。与以前的通过多尺度特征融合捕获上下文的工作不同,我们提出了双重注意力网络...
  • 在本文中,作者解释了感兴趣区域池化(RoI 池化)的基本概念和一般用法,以及如何使用它来实现注意力机制。他一步步给出了在 Keras 和 TensorFlow 环境下使用 RoI 池化的实现。选自 Medium,作者:Jaime Sevilla,机器...
  • 加入极市专业CV交流群,与10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企视觉开发者互动交流!...计算机视觉(computer vision)中的注意力机制(attention)的基本思想就是想让...
  • #!/usr/bin/env python3#-*- coding: utf-8 -*-"""Created on Mon Dec 23 21:23:09 2019Implemented using TensorFlow 1.0 and TFLearn 0.3.2M. Zhao, S. Zhong, X. Fu, B. Tang, M. Pecht, Deep Residual Shrinkage...
  • 在机器翻译(Neural Machine Translation)中,Seq2Seq模型将源序列映射到目标序列,其中Encoder部分将源序列编码为...Encoder-decoder architecture在输入序列很长的情况,在预测目标序列的时候,Attention机制可以...
  • 在这项工作中,作者专注于通道关系,并提出了一个新的架构单元,称之为 “SE block”,通过模拟通道之间的相互依赖关系,自适应地重新校准通道方面的特征响应。通过将这些SE模块堆叠在一起,可以构建SENet架构,本...
  • 选自 Medium作者:Jaime Sevilla机器之心编译参与:Geek AI、Chita在本文中,作者解释了感兴趣区域池化(RoI 池化)的基本概念和一般用法,以及如何使用它来实现注意力机制。他一步步给出了在 Keras 和 TensorFlow ...
  • 介绍 该论文提出新型的场景分割网络DANet,利用自注意力机制进行丰富语义信息的捕获,在带有空洞卷积的FCN架构的尾部添加两个并行的注意力模块:位置注意力模块和通道注意力模块,论文在Cityscapes,PASCAL Context...
  • 注意力机制之SE模块 Squeeze-and-Excitation Networks 注意力————一种将可用计算资源的分配偏向信号中信息量最大的分量的手段。注意力模块一般有两种:一种是空间注意力模块,一种是通道注意力模块,SE模块属于...
  • 论文链接:https://arxiv.org/abs/1910.03151 代码地址:https://github.com/BangguWu/ECANet 注:阅读前建议先了解SENet作为基础。 【转载请注明出处】

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 264
精华内容 105
关键字:

通道注意力机制