YOLOv5/v7 添加注意力机制,30多种模块分析⑥,S2-MLPv2模块,NAM模块

news2024/11/15 15:31:24

目录

    • 一、注意力机制介绍
      • 1、什么是注意力机制?
      • 2、注意力机制的分类
      • 3、注意力机制的核心
    • 二、S2-MLPv2模块
      • 1、 S2-MLPv2模块的原理
      • 2、实验结果
      • 3、应用示例
    • 三、NAM模块
      • 1、NAM 的原理
      • 2、实验结果
      • 3、应用示例

大家好,我是哪吒。

🏆本文收录于,目标检测YOLO改进指南。

本专栏均为全网独家首发,内附代码,可直接使用,改进的方法均是2023年最近的模型、方法和注意力机制。每一篇都做了实验,并附有实验结果分析,模型对比。


在机器学习和自然语言处理领域,随着数据的不断增长和任务的复杂性提高,传统的模型在处理长序列或大型输入时面临一些困难。传统模型无法有效地区分每个输入的重要性,导致模型难以捕捉到与当前任务相关的关键信息。为了解决这个问题,注意力机制(Attention Mechanism)应运而生。

一、注意力机制介绍

1、什么是注意力机制?

注意力机制(Attention Mechanism)是一种在机器学习和自然语言处理领域中广泛应用的重要概念。它的出现解决了模型在处理长序列或大型输入时的困难,使得模型能够更加关注与当前任务相关的信息,从而提高模型的性能和效果。

本文将详细介绍注意力机制的原理、应用示例以及应用示例。

2、注意力机制的分类

类别描述
全局注意力机制(Global Attention)在计算注意力权重时,考虑输入序列中的所有位置或元素,适用于需要全局信息的任务。
局部注意力机制(Local Attention)在计算注意力权重时,只考虑输入序列中的局部区域或邻近元素,适用于需要关注局部信息的任务。
自注意力机制(Self Attention)在计算注意力权重时,根据输入序列内部的关系来决定每个位置的注意力权重,适用于序列中元素之间存在依赖关系的任务。
Bahdanau 注意力机制全局注意力机制的一种变体,通过引入可学习的对齐模型,对输入序列的每个位置计算注意力权重。
Luong 注意力机制全局注意力机制的另一种变体,通过引入不同的计算方式,对输入序列的每个位置计算注意力权重。
Transformer 注意力机制自注意力机制在Transformer模型中的具体实现,用于对输入序列中的元素进行关联建模和特征提取。

3、注意力机制的核心

注意力机制的核心思想是根据输入的上下文信息来动态地计算每个输入的权重。这个过程可以分为三个关键步骤:计算注意力权重、对输入进行加权和输出。首先,计算注意力权重是通过将输入与模型的当前状态进行比较,从而得到每个输入的注意力分数。这些注意力分数反映了每个输入对当前任务的重要性。对输入进行加权是将每个输入乘以其对应的注意力分数,从而根据其重要性对输入进行加权。最后,将加权后的输入进行求和或者拼接,得到最终的输出。注意力机制的关键之处在于它允许模型在不同的时间步或位置上关注不同的输入,从而捕捉到与任务相关的信息。

🏆YOLOv5/v7 添加注意力机制,30多种模块分析①,SE模块,SK模块

🏆YOLOv5/v7 添加注意力机制,30多种模块分析②,BAM模块,CBAM模块

🏆YOLOv5/v7 添加注意力机制,30多种模块分析③,GCN模块,DAN模块

🏆YOLOv5/v7 添加注意力机制,30多种模块分析④,CA模块,ECA模块

🏆YOLOv5/v7 添加注意力机制,30多种模块分析⑤,SOCA模块 ,SimAM模块

二、S2-MLPv2模块

1、 S2-MLPv2模块的原理

基于多层感知机(MLP)的视觉骨干网络开始出现。这些具有较少归纳偏见的MLP视觉架构在图像识别方面表现与CNN和Vision Transformers相当竞争力。其中,采用直接的空间位移操作的spatial-shift MLP(S2-MLP)比包括MLP-mixer和ResMLP在内的开创性作品表现更好。更近期,采用具有金字塔结构的小尺寸补丁的Vision Permutator(ViP)和Global Filter Network(GFNet)比S2-MLP表现更好。改进了S2-MLP视觉骨干网络。沿通道维度扩展特征图,并将扩展后的特征图分为几个部分。对分割部分进行不同的空间位移操作。并利用分割注意力操作来融合这些分割部分。采用小规模补丁并使用金字塔结构来提高图像识别精度。将改进的spatial-shift MLP视觉骨干网络称为S2-MLPv2。

在这里插入图片描述

S2-MLP和S2-MLPv2中空间平移操作的比较:在S2-MLP中,通道被平均分成四个部分,每个部分沿不同方向进行平移。然后对这些平移后的通道进行MLP操作。相反,在S2-MLPv2中,c通道特征图被扩展为3c通道特征图。然后将扩展的地图沿通道维度平均分为三个部分。对于每个部分,我们进行不同的空间平移操作。然后通过分裂-注意力操作(Zhang等人,2020)合并平移的部分以生成c通道特征图。

2、实验结果

在这里插入图片描述

在没有额外数据的ImageNet-1K基准测试中,与类似MLP的骨干网络的比较。S2-MLPv2-Medium/7在中等规模的MLP模型中实现了最先进的性能,甚至超过了现有的大规模MLP模型。其中,M表示百万,B表示十亿。

3、应用示例

以下是S2-MLPv2模块的应用示例:

import torch
import torch.nn as nn

class S2Module(nn.Module):
    def __init__(self, channels):
        super(S2Module, self).__init__()
        self.fc1 = nn.Linear(channels, channels)
        self.act = nn.SiLU()
        self.fc2 = nn.Linear(channels, channels)

    def forward(self, x):
        identity = x
        x = self.fc1(x)
        x = self.act(x)
        x = self.fc2(x)
        x = torch.sigmoid(x)
        return identity * x + identity

class CSPBlock(nn.Module):
    def __init__(self, in_channels, out_channels, num_blocks, bottleneck_ratio=0.5):
        super(CSPBlock, self).__init__()
        hidden_channels = int(out_channels * bottleneck_ratio)
        self.conv1 = nn.Conv2d(in_channels, hidden_channels, 1, bias=False)
        self.bn1 = nn.BatchNorm2d(hidden_channels)
        self.conv2 = nn.Conv2d(in_channels, hidden_channels, 1, bias=False)
        self.bn2 = nn.BatchNorm2d(hidden_channels)
        self.conv3 = nn.Conv2d(hidden_channels, hidden_channels, 3, padding=1, bias=False)
        self.bn3 = nn.BatchNorm2d(hidden_channels)
        self.conv4 = nn.Conv2d(hidden_channels, hidden_channels, 3, padding=1, bias=False)
        self.bn4 = nn.BatchNorm2d(hidden_channels)
        self.conv5 = nn.Conv2d(hidden_channels, out_channels, 1, bias=False)
        self.bn5 = nn.BatchNorm2d(out_channels)
        self.s2module = S2Module(out_channels)

    def forward(self, x):
        y = self.conv1(x)
        y = self.bn1(y)
        y = nn.SiLU()(y)

        x = self.conv2(x)
        x = self.bn2(x)
        x = nn.SiLU()(x)

        x = torch.cat((x, y), dim=1)

        x = self.conv3(x)
        x = self.bn3(x)
        x = nn.SiLU()(x)

        x = self.conv4(x)
        x = self.bn4(x)
        x = nn.SiLU()(x)

        x = self.conv5(x)
        x = self.bn5(x)

        x = self.s2module(x)

        return x

在这段代码中,S2Module类定义了S2-MLPv2模块的具体实现,它包括两个全连接层和一个 sigmoid 激活函数。 CSPBlock 类是一个组合模块,它包含了两个分支(self.conv1self.conv2),这些分支通过 S2-MLPv2 模块进行融合(self.s2module),最终输出的是一个合并后的张量。

三、NAM模块

1、NAM 的原理

在这里插入图片描述

NAMAttention是一种新型的注意力模型,其原理基于神经网络中的自注意力机制。在传统的注意力机制中,输入序列中的每个位置只能关注固定数量的其他位置。而NAMAttention则解决了这一限制,允许任意位置对所有位置进行关注。

NAMAttention的计算过程可以分为以下几步:

  1. 输入经过线性变换,得到查询向量Q、键向量K和值向量V。
  2. 使用点积注意力计算权重,即将Q和K相乘并除以一个缩放因子,再进行softmax归一化。
  3. 将权重与值向量V相乘,得到加权后的表示。
  4. 最后将加权表示通过线性变换得到输出向量。

2、实验结果

在这里插入图片描述

3、应用示例

以下是在使用NAMAttention模块的应用示例:

import torch
import torch.nn as nn

class NAMAttention(nn.Module):
    def __init__(self, channels, reduction=4):
        super(NAMAttention, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)

        self.fc1 = nn.Conv2d(channels, channels // reduction, 1, bias=False)
        self.relu = nn.ReLU(inplace=True)
        self.fc2 = nn.Conv2d(channels // reduction, channels, 1, bias=False)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = self.fc2(self.relu(self.fc1(self.avg_pool(x))))
        max_out = self.fc2(self.relu(self.fc1(self.max_pool(x))))
        out = avg_out + max_out
        return x * self.sigmoid(out)

class CSPBlock(nn.Module):
    def __init__(self, in_channels, out_channels, num_blocks, bottleneck_ratio=0.5):
        super(CSPBlock, self).__init__()
        hidden_channels = int(out_channels * bottleneck_ratio)
        self.conv1 = nn.Conv2d(in_channels, hidden_channels, 1, bias=False)
        self.bn1 = nn.BatchNorm2d(hidden_channels)
        self.conv2 = nn.Conv2d(in_channels, hidden_channels, 1, bias=False)
        self.bn2 = nn.BatchNorm2d(hidden_channels)
        self.conv3 = nn.Conv2d(hidden_channels, hidden_channels, 3, padding=1, bias=False)
        self.bn3 = nn.BatchNorm2d(hidden_channels)
        self.conv4 = nn.Conv2d(hidden_channels, hidden_channels, 3, padding=1, bias=False)
        self.bn4 = nn.BatchNorm2d(hidden_channels)
        self.conv5 = nn.Conv2d(hidden_channels, out_channels, 1, bias=False)
        self.bn5 = nn.BatchNorm2d(out_channels)
        self.namodule = NAMAttention(out_channels)

    def forward(self, x):
        y = self.conv1(x)
        y = self.bn1(y)
        y = nn.SiLU()(y)

        x = self.conv2(x)
        x = self.bn2(x)
        x = nn.SiLU()(x)

        x = torch.cat((x, y), dim=1)

        x = self.conv3(x)
        x = self.bn3(x)
        x = nn.SiLU()(x)

        x = self.conv4(x)
        x = self.bn4(x)
        x = nn.SiLU()(x)

        x = self.conv5(x)
        x = self.bn5(x)

        x = self.namodule(x)

        return x

在这段代码中,NAMAttention类定义了NAMAttention模块的具体实现,它包括两个全局池化层和两个卷积层。 CSPBlock 类是一个组合模块,它包含了两个分支(self.conv1self.conv2),这些分支通过 NAMAttention 模块进行融合(self.namodule),最终输出的是一个合并后的张量。

参考论文:

  1. https://arxiv.org/pdf/2108.01072.pdf
  2. https://arxiv.org/pdf/2111.12419.pdf

在这里插入图片描述

🏆本文收录于,目标检测YOLO改进指南。

本专栏均为全网独家首发,🚀内附代码,可直接使用,改进的方法均是2023年最近的模型、方法和注意力机制。每一篇都做了实验,并附有实验结果分析,模型对比。

🏆华为OD机试(JAVA)真题(A卷+B卷)

每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师。

🏆往期回顾:

YOLOv5/v7 添加注意力机制,30多种模块分析①,SE模块,SK模块

YOLOv5/v7 添加注意力机制,30多种模块分析②,BAM模块,CBAM模块

YOLOv5/v7 添加注意力机制,30多种模块分析③,GCN模块,DAN模块

YOLOv5/v7 添加注意力机制,30多种模块分析④,CA模块,ECA模块

YOLOv5/v7 添加注意力机制,30多种模块分析⑤,SOCA模块 ,SimAM模块

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/671386.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Duilib】资源打包入EXE

环境 VS版本:VS2013 概述 资源打包成ZIP,ZIP文件放置EXE内部。 步骤 1、按上一篇建好工程。 2、RC文件添加ZIP资源。 这一步比较复杂,工程 添加资源,弹窗如下右侧对话框后,按①②③④步骤,找到theme.z…

Springboot项目使用原生Websocket

目录 1.启用Websocket功能2.封装操作websocket session的工具3.保存websocket session的接口4.保存websocket session的类5.定义websocket 端点6.创建定时任务 ping websocket 客户端 1.启用Websocket功能 package com.xxx.robot.config;import org.springframework.context.a…

机器学习实践(1.2)XGBoost回归任务

前言 XGBoost属于Boosting集成学习模型,由华盛顿大学陈天齐博士提出,因在机器学习挑战赛中大放异彩而被业界所熟知。相比越来越流行的深度神经网络,XGBoost能更好的处理表格数据,并具有更强的可解释性,还具有易于调参…

Axure教程—树

本文将教大家如何用AXURE中的动态面板制作树 一、效果 预览地址:https://1rmtjd.axshare.com 二、功能 1、点击“”,展开子节点 2、点击“-”子节点折叠 三、制作 1、父节点制作 拖入一个动态面板,进入,如图: 拖入一…

【LeetCode】HOT 100(18)

题单介绍: 精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…

【玩转Docker小鲸鱼叭】Docker容器常用命令大全

在 Docker 核心概念理解 一文中,我们知道 Docker容器 其实就是一个轻量级的沙盒,应用运行在不同的容器中从而实现隔离效果。容器的创建和运行是以镜像为基础的,容器可以被创建、销毁、启动和停止等。本文将介绍下容器的这些常用操作命令。 1、…

max^2 - min^2

2001^2- 2000^2 ???? max^2 - min^2min * (max - min) min * (max - min) (max - min)* (max - min) min * (max - min) * 2 (max - min)* (max - min) (max min)(max - min)

管理类联考——逻辑——技巧篇——形式逻辑——秒杀思路

第一章:说明 形式逻辑出现频次 8-10 道 形式逻辑细分思路 直言命题三段论与文氏图AEIO 与模态命题形式逻辑复合命题固定秒杀思路 说明1: AEIO 全称肯定命题:所有 S 都是 P,记作 SAP。 简称为“A” 全称否定命题:所…

TCL、海信、小米密集推新,Mini LED电视熬出头了

作者 | 辰纹 来源 | 洞见新研社 OLED和Mini LED之间的对决来到了赛点。 进入2023年,一线电视厂商发布的新品中,Mini LED成为主流。 3月2日,索尼全球发布了其2023年BRAVIA XR 电视新品阵容。其中,索尼Mini LED电视X95L采用Mini …

MFC学习之修改设置控件字体显示和颜色参数

前言 最近一直配合研发部门写一些调试类的小软件,记得之前电脑显示器和显卡配置都不高,显示分辨率比较低,软件界面上的文字还能看到清楚(不显小)。 现在公司新配置的电脑都比较好了,界面字体,尤…

【高性能计算】监督学习之支持向量机分类实验

【高性能计算】监督学习之支持向量机分类实验 实验目的实验内容实验步骤1、支持向量机算法1.1 支持向量机算法的基本思想1.2 支持向量机算法的分类过程1.3 支持向量机算法的模型构建过程 2、使用Python语言编写支持向量机的源程序代码并分析其分类原理2.1 支持向量机SVM模型代码…

四、卷积神经网络整体基础结构

一、计算机发展应用 神经网络主要用于特征提取 卷积神经网络主要应用在图像领域,解决传统神经网络出现的过拟合、权重太多等风险 1,CV领域的发展 Computer vision计算机视觉的发展在2012年出现的AlexNet开始之后得到了挽救 之前都是一些传统的机器学习…

SQL高级语句2

SQL高级语句2 SQL高级语句17.---- 连接查询 ----18.自我连接,算排名:19.---- CREATE VIEW ----视图,可以被当作是虚拟表或存储查询。20.---- UNION ----联集,将两个SQL语句的结果合并起来,两个SQL语句所产生的字段需要…

重新定义DevOps:容器化的变革力量

在快速发展的数字时代,DevOps 已成为重塑软件开发格局的重要范例。DevOps 是一个源自“开发”和“运营”的术语,它将这两个历史上孤立的功能集成到一个统一的方法中,专注于缩短软件开发生命周期。因此,DevOps 实践促进了更快、更可…

【产品应用】一体化电机在拉伸吹瓶机的应用

随着塑料瓶的广泛应用,拉伸吹瓶机作为生产塑料瓶的关键设备之一,受到了越来越多企业的关注。而在拉伸吹瓶机中,一体化电机的应用正逐渐成为行业的新趋势。 01.设备简介 吹瓶机是一种用于制造塑料瓶的机械设备。它通过将预先加热的塑料颗粒或…

当 MQTT 遇上 ChatGPT:探索可自然交互的物联网智能应用

前言 随着物联网技术的迅猛发展,人与设备、设备与设备之间的互动已变得不再困难,而如何更加自然、高效、智能地实现交互则成为物联网领域新的挑战。 近期,由 OpenAI 发布的 ChatGPT、GPT-3.5 和 GPT-4 等先进大语言模型(LLM&…

python 基础知识:使用jieba库对文本进行分词

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 一、jieba库是什么? Python的jieba库是一个中文分词工具,它可以将一段中文文本分割成一个一个的词语,方便后续的自然语言处理任务,如文本分类、情感分析等。 jieba库使用…

Riddztecia 作品集 |Beast Wear 出品

Beast & Wear:一个以彩色部落和可训练野兽庆祝多样性的收藏品。通过 NFT 野兽和装备提升你的 Riddzee 人物化身,增强视觉效果,提升你在迷人的 Riddztecia 世界中的游戏体验。去游戏、去成长、去探索。 Riddztecia NFT 空投包括训练怪兽和…

leetcode216. 组合总和 III(回溯算法-java)

组合总和 III leetcode216. 组合总和 III题目描述解题思路代码演示 回溯算法专题 leetcode216. 组合总和 III 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/combination-sum-iii 题目描述 找出所有相加之和为 n 的 k 个…

JMeter 批量接口测试

一、背景 最近在进行某中台的接口测试准备,发现接口数量非常多,有6、70个,而且每个接口都有大量的参数并且需要进行各种参数验证来测试接口是否能够正确返回响应值。想了几种方案后,决定尝试使用JMeter的csv读取来实现批量的接口…