【YOLOv8改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力

简介: YOLO目标检测专栏介绍了SimAM,一种无参数的CNN注意力模块,基于神经科学理论优化能量函数,提升模型表现。SimAM通过计算3D注意力权重增强特征表示,无需额外参数。文章提供论文链接、Pytorch实现代码及详细配置,展示了如何在目标检测任务中应用该模块。

YOLO目标检测创新改进与实战案例专栏

专栏目录: YOLO有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例

专栏链接: YOLO基础解析+创新改进+实战案例

摘要

在本文中,我们提出了一种概念上简单但非常有效的卷积神经网络(ConvNets)注意力模块。与现有的通道注意力和空间注意力模块不同,我们的模块为特征图推断3D注意力权重,而无需向原始网络添加参数。具体来说,我们基于一些知名的神经科学理论,提出通过优化能量函数来找出每个神经元的重要性。我们进一步推导出一个快速的闭式解,并展示该解可以在不到十行代码中实现。该模块的另一个优点是大多数操作符是基于能量函数的解选择的,避免了大量结构调整的工作。对各种视觉任务的定量评估表明,所提出的模块灵活且有效,可以提高许多卷积神经网络的表示能力。我们的代码可在 Pytorch-SimAM 获取。

文章链接

论文地址:论文地址

代码地址:代码地址

基本原理

SimAM(Simple Attention Module)是一种简单且无参数的注意力模块,用于卷积神经网络(Convolutional Neural Networks,ConvNets)。SimAM的设计灵感源自哺乳动物大脑中的神经科学理论,特别是基于已建立的空间抑制理论设计了一个能量函数来实现这一理论。SimAM通过推导出一个简单的解决方案来实现这个函数,进而将该函数作为特征图中每个神经元的注意力重要性。该注意力模块的实现受到这个能量函数的指导,避免了过多的启发式方法。SimAM通过推断特征图的3D注意力权重,优化能量函数以找到每个神经元的重要性,从而在各种视觉任务上提高性能。

  1. 基于空间抑制理论设计能量函数:SimAM利用空间抑制理论设计了一个能量函数,用于计算每个神经元的注意力重要性。
  2. 推导简单解决方案:为了实现这个能量函数,SimAM推导出了一个简单的解决方案,使得实现过程更加高效。
  3. 实现注意力权重:通过计算得到的注意力重要性,SimAM可以为每个神经元分配相应的注意力权重,从而提高特征图的表征能力。

    image-20240630164233027

SimAM 的计算公式如下:
$$ w_i = \frac{1}{k} \sum_{j \in N_i} s(f_i, f_j) $$


公式说明:

  • w_i 是第 i 个像素的注意力权重
  • k 是归一化常数
  • N_i 是第 i 个像素的相邻像素集合
  • s(f_i, f_j) 是第 i 个像素和第 j 个像素之间的相似性

核心代码

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"

    def forward(self, x):
        # 前向传播函数,接收输入张量x,返回处理后的张量

        b, c, h, w = x.size()  # 获取输入张量的batch大小、通道数、高度和宽度

        n = w * h - 1  # 计算像素数量减一,用于标准化

        # 计算每个像素与平均值的差的平方
        x_minus_mu_square = (x - x.mean(dim=[2, 3], keepdim=True)).pow(2)

        # 计算SimAM激活函数的输出
        # 分子部分:每个像素的平方差除以分母的加权平均
        # 加上0.5是为了映射输出到(0.5, 1)之间
        y = x_minus_mu_square / (4 * (x_minus_mu_square.sum(dim=[2, 3], keepdim=True) / n + self.e_lambda)) + 0.5

        # 返回经过SimAM激活函数处理后的特征图
        return x * self.activation(y)

task与yaml配置

详见:https://blog.csdn.net/shangyanaf/article/details/140083301

相关文章
|
6天前
|
机器学习/深度学习 数据采集 算法
Python基于OpenCV和卷积神经网络CNN进行车牌号码识别项目实战
Python基于OpenCV和卷积神经网络CNN进行车牌号码识别项目实战
41 19
|
6天前
|
机器学习/深度学习 编解码
深度之眼(二十八)——神经网络基础知识(三)-卷积神经网络
深度之眼(二十八)——神经网络基础知识(三)-卷积神经网络
28 14
|
1天前
|
机器学习/深度学习 PyTorch 算法框架/工具
图神经网络是一类用于处理图结构数据的神经网络。与传统的深度学习模型(如卷积神经网络CNN和循环神经网络RNN)不同,
图神经网络是一类用于处理图结构数据的神经网络。与传统的深度学习模型(如卷积神经网络CNN和循环神经网络RNN)不同,
15 9
|
6天前
|
机器学习/深度学习 数据采集 算法
Python基于卷积神经网络CNN模型和VGG16模型进行图片识别项目实战
Python基于卷积神经网络CNN模型和VGG16模型进行图片识别项目实战
|
2月前
|
机器学习/深度学习 算法 PyTorch
python手把手搭建图像多分类神经网络-代码教程(手动搭建残差网络、mobileNET)
python手把手搭建图像多分类神经网络-代码教程(手动搭建残差网络、mobileNET)
84 0
|
2月前
|
机器学习/深度学习 自然语言处理 数据可视化
数据代码分享|PYTHON用NLP自然语言处理LSTM神经网络TWITTER推特灾难文本数据、词云可视化
数据代码分享|PYTHON用NLP自然语言处理LSTM神经网络TWITTER推特灾难文本数据、词云可视化
|
1月前
|
机器学习/深度学习 PyTorch 算法框架/工具
【从零开始学习深度学习】26.卷积神经网络之AlexNet模型介绍及其Pytorch实现【含完整代码】
【从零开始学习深度学习】26.卷积神经网络之AlexNet模型介绍及其Pytorch实现【含完整代码】
|
1月前
|
机器学习/深度学习 PyTorch 算法框架/工具
【从零开始学习深度学习】28.卷积神经网络之NiN模型介绍及其Pytorch实现【含完整代码】
【从零开始学习深度学习】28.卷积神经网络之NiN模型介绍及其Pytorch实现【含完整代码】
|
13天前
|
机器学习/深度学习 编解码 数据可视化
图神经网络版本的Kolmogorov Arnold(KAN)代码实现和效果对比
目前我们看到有很多使用KAN替代MLP的实验,但是目前来说对于图神经网络来说还没有类似的实验,今天我们就来使用KAN创建一个图神经网络Graph Kolmogorov Arnold(GKAN),来测试下KAN是否可以在图神经网络方面有所作为。
35 0
|
1天前
|
机器学习/深度学习 TensorFlow API
Keras是一个高层神经网络API,由Python编写,并能够在TensorFlow、Theano或CNTK之上运行。Keras的设计初衷是支持快速实验,能够用最少的代码实现想法,并且能够方便地在CPU和GPU上运行。
Keras是一个高层神经网络API,由Python编写,并能够在TensorFlow、Theano或CNTK之上运行。Keras的设计初衷是支持快速实验,能够用最少的代码实现想法,并且能够方便地在CPU和GPU上运行。
9 0