介绍
摘要
在本文中,我们提出了一种概念上简单但非常有效的卷积神经网络(ConvNets)注意力模块。与现有的通道注意力和空间注意力模块不同,我们的模块为特征图推断3D注意力权重,而无需向原始网络添加参数。具体来说,我们基于一些知名的神经科学理论,提出通过优化能量函数来找出每个神经元的重要性。我们进一步推导出一个快速的闭式解,并展示该解可以在不到十行代码中实现。该模块的另一个优点是大多数操作符是基于能量函数的解选择的,避免了大量结构调整的工作。对各种视觉任务的定量评估表明,所提出的模块灵活且有效,可以提高许多卷积神经网络的表示能力。我们的代码可在 Pytorch-SimAM 获取。
YOLOv11目标检测创新改进与实战案例专栏
点击查看文章目录: YOLOv11创新改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例
点击查看专栏链接: YOLOv11目标检测创新改进与实战案例
文章链接
论文地址:论文地址
代码地址:代码地址
基本原理
SimAM(Simple Attention Module)是一种简单且无参数的注意力模块,用于卷积神经网络(Convolutional Neural Networks,ConvNets)。SimAM的设计灵感源自哺乳动物大脑中的神经科学理论,特别是基于已建立的空间抑制理论设计了一个能量函数来实现这一理论。SimAM通过推导出一个简单的解决方案来实现这个函数,进而将该函数作为特征图中每个神经元的注意力重要性。该注意力模块的实现受到这个能量函数的指导,避免了过多的启发式方法。SimAM通过推断特征图的3D注意力权重,优化能量函数以找到每个神经元的重要性,从而在各种视觉任务上提高性能。
- 基于空间抑制理论设计能量函数:SimAM利用空间抑制理论设计了一个能量函数,用于计算每个神经元的注意力重要性。
- 推导简单解决方案:为了实现这个能量函数,SimAM推导出了一个简单的解决方案,使得实现过程更加高效。
- 实现注意力权重:通过计算得到的注意力重要性,SimAM可以为每个神经元分配相应的注意力权重,从而提高特征图的表征能力。
核心代码
import torch
import torch.nn as nn
class SimAM(torch.nn.Module):
def __init__(self, channels=None, e_lambda=1e-4):
super(SimAM, self).__init__()
# 初始化Sigmoid激活函数和e_lambda参数
self.activation = nn.Sigmoid() # Sigmoid激活函数用于映射输出到(0, 1)之间
self.e_lambda = e_lambda # 控制分母的平滑参数
def __repr__(self):
# 返回模型的字符串表示,包括e_lambda参数的值
s = self.__class__.__name__ + '('
s += ('lambda=%f)' % self.e_lambda)
return s
@staticmethod
def get_module_name():
# 静态方法,返回模型的名称
return "simam"
YoloV11引入代码
在根目录下的ultralytics/nn/
目录,新建一个attention
目录,然后新建一个以 SimAM
为文件名的py文件, 把代码拷贝进去。
task与yaml配置
详见:https://blog.csdn.net/shangyanaf/article/details/143107915