SimAM:轻量级、无参数的卷积神经网络注意力机制
一、摘要
注意力机制在卷积神经网络 (CNN) 中扮演着越来越重要的角色,它能够帮助模型聚焦于图像的关键区域,提升模型性能。然而,现有的注意力机制通常需要引入额外的参数,增加模型复杂度和计算成本。
SimAM 是一种轻量级、无参数的卷积神经网络注意力机制,它通过计算特征图的局部自相似性来生成注意力权重。SimAM 不需要引入任何额外参数,并且可以有效地提升 CNN 的性能。
表 1:多种注意力机制的比较
二、原理介绍
SimAM 的核心思想是基于图像的局部自相似性。在图像中,相邻像素之间通常具有较强的相似性,而远距离像素之间的相似性则较弱。SimAM 利用这一特性,通过计算特征图中每个像素与其相邻像素之间的相似性来生成注意力权重。
图 1:SimAM——每个神经元被分配一个唯一的权重
SimAM 的计算公式如下:
w_i = \frac{1}{k} \sum_{j \in N_i} s(f_i, f_j)
其中:
- w i w_i wi 是第 i i i 个像素的注意力权重
- k k k 是归一化常数
- N i N_i Ni 是第 i i i 个像素的相邻像素集合
- s ( f i , f j ) s(f_i, f_j) s(fi,fj) 是第 i i i 个像素和第 j j j 个像素之间的相似性
SimAM 使用了一种简单而有效的相似性度量方法,即欧几里得距离:
s(f_i, f_j) = -\left\| f_i - f_j \right\|_2^2
三、代码示例
SimAM 可以很容易地嵌入到现有的 CNN 模型中。以下是一个简单的示例:
import torch
import torch.nn as nn
class simam_module(torch.nn.Module):
def __init__(self, channels = None, e_lambda = 1e-4):
super(simam_module, self).__init__()
self.activaton = nn.Sigmoid()
self.e_lambda = e_lambda
def __repr__(self):
s = self.__class__.__name__ + '('
s += ('lambda=%f)' % self.e_lambda)
return s
@staticmethod
def get_module_name():
return "simam"
def forward(self, x):
b, c, h, w = x.size()
n = w * h - 1
x_minus_mu_square = (x - x.mean(dim=[2,3], keepdim=True)).pow(2)
y = x_minus_mu_square / (4 * (x_minus_mu_square.sum(dim=[2,3], keepdim=True) / n + self.e_lambda)) + 0.5
return x * self.activaton(y)
四、实验结果
SimAM 在多个图像分类数据集上进行了验证,实验结果表明 SimAM 能够有效地提升 CNN 的性能。
表 2:SimAM 在 ImageNet 分类数据集上的实验结果
从表 2 可以看出,SimAM 可以提高准确率,同时不增加任何参数量和计算量。
图 2:SimAM 可视化效果
五、总结
SimAM 是一种轻量级、无参数的卷积神经网络注意力机制,它具有以下优势:
- 无需引入额外参数,降低模型复杂度和计算成本
- 能够有效地提升 CNN 的性能
- 易于实现和嵌入到现有的 CNN 模型中
SimAM 是一种很有潜力的注意力机制,可以广泛应用于图像分类、目标检测、图像分割等视觉任务。
参考资料
- SimAM: A Simple, Parameter-Free Attention Module for Convolutional Neural Networks: https://proceedings.mlr.press/v139/yang21o/yang21o.pdf
- GitHub仓库链接
版权声明
本博客内容仅供学习交流,转载请注明出处。