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。然后,在视觉神经科学中,信息最丰富的神经元通常是显示出周围神经元独特放电模式的神经元。并且,激活的神经元通常会抑制周围神经元,即空域抑制。因此,作者通过定义一个简单的能量函数,度量神经元之间的线性可分性。
上述公式表明,能量越低,神经元与周围神经元区别越大,对视觉处理更重要。因此,每个神经元的重要性可以通过来获得。
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)])
声明:本内容来源网络,版权属于原作者,图片来源原论文。如有侵权,联系删除。
创作不易,欢迎大家点赞评论收藏关注!(想看更多最新的注意力机制文献欢迎关注浏览我的博客)