草庐IT

SE注意力机制

renxingshen2022 2023-04-17 原文

SENet-通道注意力笔记

简介

SENet是2017年ImageNet比赛的冠军,2018年CVPR引用量第一。论文链接:SENet

意义

较早的将attention引入到CNN中,模块化化设计。

目的:

SE模块的目的是想通过一个权重矩阵,从通道域的角度赋予图像不同位置不同的权重,得到更重要的特征信息。

主要操作

SE模块的主要操作:挤压(Squeeze)、激励(Excitation)

算法流程图


通过一系列操作得到一个 1 ∗ 1 ∗ C 1*1*C 11C的权重矩阵,对原特征进行重构(不同颜色表示不同的数值,用来衡量通道的重要性)

过程

第一步、

Transformation ( F t r ) (F{_t}{_r}) (Ftr):给定一个input特征图 X X X,让其经过 F t r F{_t}{_r} Ftr操作生成特征图 U U U
注意:在常用的卷积神经网络中Transformation操作一般为一个卷积操作。我们通常在聊SE注意力时通常不包含这一步。

第二步、

Squeeze ( F s q ( ⋅ ) ) (F{_s}{_q}(·)) (Fsq())::这一步将特征图进行全局平均池化,生成一个 1 ∗ 1 ∗ C 1*1*C 11C的向量,这样每个通道让一个数值表示。
注释:对 U U U实现全局低维嵌入,相当于一个数值拥有该通道的全局感受野。
公式:

此外:论文中给出了使用平均池化与最大池化的实验对比。

第三步、

Excitation ( F e x ) (F{_e}{_x}) (Fex):这一步通过两层全连接层完成,通过权重W生成我们我所要的权重信息,其中W是通过学习得到的,用来显示的建模我们我需要的特征相关性。

通过两个全连接层 W 1 W{_1} W1 , W 2 W{_2} W2对上一步得到的向量 z z z进行处理,得到我们想要的通道权重值 s s s,经过两层全连接层后,s中不同的数值表示不同通道的权重信息,赋予通道不同的权重。
注意:两层全连接层之间存在一个超参数 R R R, 向量 z z z ( 1 ∗ 1 ∗ C ) (1*1*C) (11C)经过第一层全连接层后维度由
( 1 ∗ 1 ∗ C ) (1*1*C) (11C)变为 ( 1 ∗ 1 ∗ C / R ) (1*1*C/R) (11C/R),再经过第二层全连接层为度由 ( 1 ∗ 1 ∗ C / R ) (1*1*C/R) (11C/R)变为 ( 1 ∗ 1 ∗ C ) (1*1*C) (11C)。第一层全连接层的激活函数为ReLU,第二层全连接层的激活函数为Sigmoid。

第四步、

Scale ( F s c a l e ) (F{_{scale}}) (Fscale):由算法流程图可以看出,第四步的操作是将第三步生成权重向量 s s s对特征图 U U U进行权重赋值,得到我们想要的特征图 X ~ \tilde X X~,其尺寸大小与特征图 U U U完全一样,SE模块不改变特征图的小大。

通过生成的特征向量 s s s 1 ∗ 1 ∗ C 1*1*C 11C)与特征图 U U U( H ∗ W ∗ C H*W*C HWC),对应通道相乘,即特征图 U U U中每个通道的 H ∗ W H*W HW个数值都乘 s s s中对应通道的权值。

SE模块的结构图


SE模块是一个即插即用的模块,在上图中左边是在一个卷积模块之后直接插入SE模块,右边是在ResNet结构中添加了SE模块。

实现代码

import torch.nn as nn

class SEModel(nn.Module):
    def __init__(self, channel, reduction=16):
        super(SEModel, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.fc = nn.Sequential(
            nn.Linear(channel, channel // reduction, bias=False),
            nn.ReLU(),
            nn.Linear(channel // reduction, channel, bias=False),
            nn.Sigmoid()
        )

    def forward(self, x):
        b, c, _, _ = x.size()
        y = self.avg_pool(x).view(b, c)
        y = self.fc(y).view(b, c, 1, 1)
        return x * y.expand_as(x)

网上有较多的公开代码,都可以进行参考。

最后

SE模块在使用时如何选择添加的位置是值得考虑的问题,如何实现最大化的提升。
MobileNetV3中使用了SE模块,通过神经网络架构搜索进行了最优位置选择,值得思考与学习。

如有错误,望大家指正。B站上有很多大佬的讲解视频,喜欢视频讲解的可以看一下。

有关SE注意力机制的更多相关文章

  1. 阿里云国际版免费试用:如何注册以及注意事项 - 2

    作为新的阿里云用户,您可以50免费试用多种优惠,价值高达1,700美元(或8,500美元)。这将让您了解和体验阿里云平台上提供的一系列产品和服务。如果您以个人身份注册免费试用,您将获得价值1,700美元的优惠。但是,如果您是注册公司,您可以选择企业免费试用,提交基本信息通过企业实名注册验证,即可开始价值$8,500的免费试用!本教程介绍了如何设置您的帐户并使用您的免费试用版。​关于免费试用在我们开始此试用之前,您还必须遵守以下条款和条件才能访问您的免费试用:只有在一年内创建的账户才有资格获得阿里云免费试用。通过此免费试用优惠,用户可以免费试用免费试用活动页面上列出的每种产品一次。如果您有多个帐

  2. ruby - Ruby 是否提供响应 OS X 上的 Apple 事件的机制? - 2

    我正在使用Ruby-Tk为OSX开发一个桌面应用程序,我想为该应用程序提供一个AppleEvents接口(interface)。这意味着应用程序将定义它将响应的AppleScript命令的字典(对应于发送到应用程序的Apple事件),并且用户/其他应用程序可以使用AppleScript命令编写Ruby-Tk应用程序的脚本。其他脚本语言支持此类功能——Python通过位于http://appscript.svn.sourceforge.net/viewvc/appscript/py-aemreceive/的py-aemreceive库和Tcl通过位于http://tclae.source

  3. ruby - Ruby 的方法解除绑定(bind)机制有什么意义? - 2

    Method#unbind返回对该方法的UnboundMethod引用,稍后可以使用UnboundMethod#bind将其绑定(bind)到另一个对象.classFooattr_reader:bazdefinitialize(baz)@baz=bazendendclassBardefinitialize(baz)@baz=bazendendf=Foo.new(:test1)g=Foo.new(:test2)h=Bar.new(:test3)f.method(:baz).unbind.bind(g).call#=>:test2f.method(:baz).unbind.bind(h).

  4. SE5_基于YOLO3D的目标检测算法移植与测试 - 2

    本文档适用于SOPHGO(算能)BM1684-SE5及对应通用云开发空间,主要内容:注意:由于SOPHGOSE5微服务器的CPU是基于ARM架构,部分步骤将在基于x86架构CPU的开发环境中完成初始化开发环境(基于x86架构CPU的开发环境中完成)YOLO3D目标检测算法模型转换(基于x86架构CPU的开发环境中完成)YOLO3D模型推理测试(处理后的YOLO3D项目文件将被拷贝至SOPHGOSE5微服务器上推理测试)1.初始化开发环境(基于x86架构CPU的开发环境中完成)1.1初始化开发环境(若wget后的地址不可用,请前往算能官网下载Docker镜像及SDK)#切换成root权限sudo

  5. Selenium等待机制之显示等待 - 2

    显示等待需要用到两个类:WebDriverWait和expected_conditions两个类WebDriverWait:指定轮询间隔、超时时间等expected_conditions:指定了很多条件函数(也可以自定义条件函数)具体可以参考官网:selenium.webdriver.support.expected_conditions—Selenium4.5documentationfromseleniumimportwebdriverfromselenium.webdriver.common.byimportByfromselenium.webdriver.support.uiimpor

  6. ruby - 新手应注意的 Ruby Gotchas 是什么? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。社区在12个月前审查了是否重新打开此问题,并将其关闭:原始关闭原因未解决最近学习了Ruby编程语言,总的来说是一门很好的语言。但是我很惊讶地发现它并不像我预期的那么简单。更准确地说,“最小惊喜规则”在我看来并不是很受尊重(当然这是相当主观的)。例如:x=trueandfalseputsx#displaystrue!和著名的:puts"zeroistrue

  7. ruby - 不支持您提供的授权机制。请使用 AWS4-HMAC-SHA256 - 2

    我收到错误AWS::S3::Errors::InvalidRequest不支持您提供的授权机制。请使用AWS4-HMAC-SHA256.当我尝试将文件上传到新法兰克福地区的S3存储桶时。所有适用于USStandard区域。脚本:backup_file='/media/db-backup_for_dev/2014-10-23_02-00-07/slave_dump.sql.gz's3=AWS::S3.new(access_key_id:AMAZONS3['access_key_id'],secret_access_key:AMAZONS3['secret_access_key'])s3_

  8. 基于3D卷积的图像序列特征提取与自注意力的车牌识别方法 - 2

    【摘 要】近年来,基于自注意力机制的神经网络在计算机视觉任务中得到广泛的应用。随着智能交通系统的广泛应用,面对复杂多变的交通场景,车牌识别任务的难度不断提高,准确识别的需求更加迫切。因此提出一个基于自注意力的免矫正的车牌识别方法T-LPR。首先对图像进行切片和序列化,并使用3D卷积对切片序列进行特征提取,从而得到图像的嵌入向量序列。然后将嵌入向量序列输入基于TransformerEncoder的编码器中,学习各个嵌入向量之间的关系并输出最终的编码结果。最后使用分类器进行分类。在多个公共数据集上的实验结果表明,所提方法对各类困难场景下的车牌识别都非常有效。【关键词】车牌识别 ; 图像嵌入向量 ;

  9. javascript - Node js/Angular js - 注意 : Provisional headers are shown - 2

    这个问题在这里已经有了答案:"CAUTION:provisionalheadersareshown"inChromedebugger(36个答案)关闭8年前。这是我的Angularjs片段代码:$http({method:'POST',withCredential:true,url:$scope.config.app_ws+'auth/signup',data:{user:$scope.auth}}).success(function(status,response){console.log(response);}).error(function(status,response){al

  10. Qt 中的信息输出机制:QDebug、QInfo、QWarning、QCritical 的简单介绍和用法 - 2

    Qt中的信息输出机制介绍QDebug在Qt中使用qDebug输出不同类型的信息浮点数:使用%!f(MISSING)格式化符号输出浮点数布尔值:使用%!(MISSING)和%!(MISSING)格式化符号输出布尔值对象:使用qPrintable()函数输出对象的信息qInfoqWarningqCritical自定义信息输出格式不同输出方式的区别和底层逻辑总结介绍在Qt中,信息输出机制用于在程序运行时输出各种信息,包括调试信息、提示信息、警告信息和错误信息等。Qt提供了多种信息输出机制,主要包括以下几种:qDebug:最常用的信息输出机制,用于输出各种调试信息,例如变量的值、函数的返回值和对象的状

随机推荐