ICML 2021 | SimAM 无参注意力机制!(keras实现)

SimAM: A Simple, Parameter-Free Attention Module for Convolutional Neural Networks 

中山大学

paper:http://proceedings.mlr.press/v139/yang21o/yang21o.pdf

code: https://github.com/ZjjConan/SimAM

摘要

提出了一个概念上简单但非常有效的卷积神经网络(ConvNets)的注意机制模块。与现有的通道和空间注意模块相比,为特征层中的特征映射推断三维注意权值(即考虑空间和通道维度),而不在原始网络中添加参数。具体地说,基于一些神经科学理论优化一个能量函数,以找到每个神经元的重要性。进一步推导了能量函数的一个快速闭环形式的解,并证明了该解可以在小于十行的代码中实现。该模块的另一个优点是,大多数操作运算都是基于所定义的能量函数的解来选择的,从而避免了过多的结构调整。对各种视觉任务的定量评估表明,该模块能够灵活、有效地提高许多ConvNets的表示能力。

论文主要思想

作者认为影像注意力机制模块的一个重要因素是,权值生成方式,现有注意力往往通过子网络生成注意力权重,例如:SE通过GAP+FC+Relu+FC+Sigmoid。然后,在视觉神经科学中,信息最丰富的神经元通常是显示出周围神经元独特放电模式的神经元。并且,激活的神经元通常会抑制周围神经元,即空域抑制。因此,作者通过定义一个简单的能量函数,度量神经元之间的线性可分性。

上述公式表明,能量越低,神经元与周围神经元区别越大,对视觉处理更重要。因此,每个神经元的重要性可以通过\frac{1}{^{e^{_{t}^{*}}}}来获得。

keras实现

 以下是根据论文和pytorch源码实现的keras版本(支持Tensorflow1.x)

def _SiamAM(inputs, lambd=1e-4):
    channel_axis = 1 if K.image_data_format() == 'channels_first' else -1
    in_dim = K.int_shape(inputs)
    if channel_axis == -1:
        n = in_dim[1]*in_dim[2]-1
        d = Lambda(lambda x: K.pow(x - K.mean(x, axis=[1, 2], keepdims=True), 2))(inputs)
        v = Lambda(lambda d: K.sum(d, axis=[1, 2], keepdims=True) / n)(d)
        E_inv = Lambda(lambda x: x[0] / (4*(x[1]+lambd)) + 0.5)([d, v])
    else:
        n = in_dim[2] * in_dim[3] - 1
        d = Lambda(lambda x: K.pow(x - K.mean(x, axis=[2, 3], keepdims=True), 2))(inputs)
        v = Lambda(lambda d: K.sum(d, axis=[2, 3], keepdims=True) / n)(d)
        E_inv = Lambda(lambda x: x[0] / (4 * (x[1] + lambd)) + 0.5)([d, v])
    return Multiply()([inputs, Activation('sigmoid')(E_inv)])

声明:本内容来源网络,版权属于原作者,图片来源原论文。如有侵权,联系删除。

创作不易,欢迎大家点赞评论收藏关注!(想看更多最新的注意力机制文献欢迎关注浏览我的博客)

  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值