注意力机制——SENet原理详解及源码解析

news2024/11/19 11:18:43

🍊作者简介:秃头小苏,致力于用最通俗的语言描述问题

🍊专栏推荐:深度学习网络原理与实战

🍊近期目标:写好专栏的每一篇文章

🍊支持小苏:点赞👍🏼、收藏⭐、留言📩

 

SENet原理详解

​  先来简单说说我们为什么需要使用注意力机制,这是因为我们希望网络可以专注于一些更加重要的东西,这对物体的识别定位都大有益处。enmmm,是不是够简单呢。🍦🍦🍦如果你是第一次学习注意力机制,我觉得你会充满疑惑,怎么让网络注意到一些更加重要的东西呢?那么带着疑问,和我一起来看看SENet的原理,等我介绍完后看你能否理解喔。🌿🌿🌿

​  话不多说,我们直接来看SENet的关键结构,如下图所示:

image-20221204203939637

​  我们来介绍一下上图的网络,首先是输入X,其维度为 H ′ × W ′ × C ′ {\rm{H' \times W' \times C'}} H×W×C,经过一系列卷积等维度变化操作后得到特征图U,其维度 H × W × C H×W×C H×W×C【注:其实从特征图U开始向后才是真正的SENet的结构,这一步转换只是一些特征图维度变化】 当我们得到U后,会先将U经过全局平均池化的操作,即将U的维度由 H × W × C H×W×C H×W×C变成 1 × 1 × C 1×1×C 1×1×C,此步骤对应着上图中的 F s q ( ⋅ ) {F_{sq}}( \cdot ) Fsq()。接着会执行步骤 F e x ( ⋅ , W ) {F_{ex}}( \cdot ,W) Fex(,W),此步骤包含两个全连接层已经两个激活函数,为方便大家理解,做此过程的图如下:

image-20221204210751044

​  从上图我们可以看出,在第一次全连接层后我们使用Relu激活函数,此时得到的输出维度为 1 × 1 × C ′ ′ 1 \times 1 \times {\rm{C''}} 1×1×C′′,通常情况下 C ′ ′ {\rm{C''}} C′′设置为 C C C 1 4 \frac{1}{4} 41。第二个全连接层后使用Sigmoid函数,将每层数值归一化到0-1之间,以此表示每个通道的权重,第二个全连接的输出也为 1 × 1 × C 1×1×C 1×1×C。得到了最后 1 × 1 × C 1×1×C 1×1×C的输出后,我们将U和刚刚得到的 1 × 1 × C 1×1×C 1×1×C输出相乘,得到最终的特征图 X ~ {{\rm{\tilde X}}} X~,最终特征图 X ~ {{\rm{\tilde X}}} X~的维度和U一致,为 H × W × C H×W×C H×W×C

​  介绍到这里,大家是否明白了呢。如果你还没明白的话,再来看下图吧!!!首先下图左上角表示为两个通道的特征图,经平均池化后得到左下角的图;再次经过两次全连接层和激活函数后,转化成了右下角的图,最后用右下角的0.5、0.6分别乘原始的特质图,则得到最终的右上角的图。可以发现经过SENet特征图输入前后尺寸没有变化,其值发生变化。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XhC6a19q-1645335379587)(C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20220219210356512.png)]

SENet代码详解

​ 理解了上文所述的SENet原理,那么编写SENet的代码就非常简单了,如下:

def SENet(input):
    #全局平均池化
    x = nn.AdaptiveAvgPool2d((1,1))(input)
    x = x.view(1, -1)
    #第一个全连接层
    x = nn.Linear(2, 1)(x)
    x = nn.functional.relu(x)
    #第二个全连接层
    x = nn.Linear(1, 2)(x)
    x = nn.functional.sigmoid(x)

    return x


if __name__ == '__main__':
    input = torch.ones(1, 2 ,2 ,2)
    output = SENet(input)
    # 将SENet的输出维度进行变化,以便后面的乘机操作
    output = output.view(input.shape[0], input.shape[1],1, 1)
    SE_output = input*output
    
    print(input)
    print(input.shape)
    print(output)
    print(output.shape)
    print(SE_output)

我们可以来看一下上述代码的输出,如下:

input:

image-20221205113701020

output:

image-20221205113732249

SE_output:

image-20221205113755663

  你可以结合理论部分,再对照这些输出看看是否一致喔。【注意:大家需要注意在最后一步相乘操作前需要先View一下输出output的尺寸,不然乘的结果不一样哦,这涉及到一些pytorch乘法的操作,这部分我也调试了很久,大家可以动手试试看。】

 
 

如若文章对你有所帮助,那就🛴🛴🛴

         一键三连 (1).gif

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

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

相关文章

【ROS】话题通信--从理论介绍到模型实现(C++)

1.简单介绍 话题通信是ROS中使用频率最高的一种通信模式,话题通信是基于发布订阅模式的,也即:一个节点发布消息,另一个节点订阅该消息。像雷达、摄像头、GPS… 等等一些传感器数据的采集,也都是使用了话题通信,换言之…

windows 配置 Kerberos客户端访问CDH组件

0.背景 想在window机器上访问内网集群的CDH组件(如solr的webui),由于集群配置了Kerberos验证,所以需要配置相关,否则打开webui会有401未授权错误 1. 流程 1.1 windows安装Kerberos客户端 -下载 Windows系统客户端去下面网站按需下载 http://web.mit.edu/kerberos/dist/ 需要…

【力扣】496. 下一个更大元素 I <单调栈、模拟>

【力扣】496. 下一个更大元素 I nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。给你两个没有重复元素的数组 nums1 和 nums2 &#xff0c;下标从 0 开始计数&#xff0c;其中nums1 是 nums2 的子集。   对于每个 0 < i <…

喜报 | 擎创再度入围IDC中国FinTech 50榜单

8月16日&#xff0c;2023年度“IDC中国FinTech 50”榜单正式揭晓&#xff0c;擎创科技继2022年入选该榜单后&#xff0c;再次以创新者姿态成功入选&#xff0c;并以技术赋能业务创新&#xff0c;成为中国金融科技领域创新与活力的重要贡献者。 “IDC中国FinTech 50”旨在评选出…

RabbitMq交换机类型介绍

RabbitMq交换机类型介绍 在RabbitMq中&#xff0c;生产者的消息都是通过交换器来接收&#xff0c;然后再从交换器分发到不同的队列&#xff0c;再由消费者从队列获取消息。这种模式也被成为“发布/订阅”。 分发的过程中交换器类型会影响分发的逻辑。 直连交换机&#xff1a…

高校大学生社团管理系统的设计与实现(论文+源码)_kaic

目 录 一、绪论 &#xff08;一&#xff09;选题背景 1、社团管理系统的提出 &#xff08;二&#xff09;系统设计的原则与目标 1、系统设计原则 2、系统设计目标 二、系统关键技术的分析 &#xff08;一&#xff09;JSP技术 &#xff08;二&#xff09;Tomcat简介 1、SERVL…

虚拟机远程连接出现 Connection refused: connect问题(已解决)

如果你也跟我一样出现了这样的问题&#xff0c;并且网上的方法试了都不行&#xff0c;不妨试试我的简单粗暴的方法&#xff0c; 那就是拔网线&#xff0c;我的就是拔网线&#xff0c;重新连接就行了&#xff0c;佛了

Creating a document in Overleaf

1、Uploading a project上传项目 This artcle provides a step-by-step guide showing how to create an Overleaf project by uploading a .zip file containing LaTeX files stored on your local computer 1、Create a .zip file containing your local files (images, bib…

如何优雅的进行接口设计?接口设计的六大原则是什么?

如何优雅的进行接口设计&#xff1f;接口设计的六大原则是什么&#xff1f; 本文关于如何优雅的进行接口设计&#xff1f;接口设计的六大原则是什么&#xff1f; 作为后端开发&#xff0c;不管是什么语言&#xff0c;Java、Go还是C&#xff0c;其背后的后端思想都是类似的。后…

JAVA免杀学习与实验

1 认识Webshell 创建一个JSP文件&#xff1a; <% page import"java.io.InputStream" %> <% page import"java.io.BufferedReader" %> <% page import"java.io.InputStreamReader" %> <% page language"java" p…

【linux基础(四)】对Linux权限的理解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到开通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux权限 1. 前言2. shell命…

Linux 进程间通信——共享内存

一、共享内存原理 共享内存为多个进程之间共享和传递数据提供了一种有效的方式。共享内存是先在物理内存上申请一块空间&#xff0c;多个进程可以将其映射到自己的虚拟地址空间中。所有进程都可以访问共享内存中的地址&#xff0c;就好像它们是由malloc分配的一样。如果某个进…

实现一个自动保存高CPU占用现场的简易工具

CPU 使用率在系统监控中是一个非常重要的指标。对于大多数 Web 应用来说&#xff0c;它们往往是 IO 密集型的&#xff0c;因此只会在某些时刻可能会出现 CPU 突然飙升的情况&#xff0c;随后很快就恢复正常。然而&#xff0c;当收到报警并想要排查问题时&#xff0c;CPU 飙升的…

Windows10上VS2022单步调试FFmpeg 4.2源码

之前在 https://blog.csdn.net/fengbingchun/article/details/103735560 介绍过通过VS2017单步调试FFmpeg源码的方法&#xff0c;这里在Windows10上通过VS2022单步调试FFmpeg 4.2的方法&#xff1a;基于GitHub上ShiftMediaProject/FFmpeg项目&#xff0c;下面对编译过程进行说明…

VS2022远程Linux使用cmake开发c++工程配置方法

文章目录 远程连接CMakePresets.json的配置Task.vs.json配置launch.vs.json配置最近使用别人在VS2015上使用visualgdb搭建的linux开发环境,各种不顺手,一会代码不能调转了,一会行号没了,调试的时候断不到正确的位置,取消的断点仍然会进。因此重新摸索了一套使用vs的远程开…

合并多个文本文件

使用 wxPython 模块合并多个文本文件的博客。以下是一篇示例博客&#xff1a; C:\pythoncode\blog\txtmerge.py 在 Python 编程中&#xff0c;我们经常需要处理文本文件。有时候&#xff0c;我们可能需要将多个文本文件合并成一个文件&#xff0c;以便进行进一步的处理或分析。…

MySQL的配置文件my.cnf与my.ini

一、my.cnf与my.ini win系统&#xff0c;MySQL配置文件为my.ini 其他系统&#xff08;Ubuntu、CentOS、macOS)MySQL配置文件为my.cnf 二、my.cnf与my.ini的路径 2.1 默认路径 MySQL 的配置文件 my.cnf 可能位于多个位置&#xff0c;具体取决于安装方式和操作系统。以下是一…

《HeadFirst设计模式(第二版)》第十章代码——状态模式

如下图所示&#xff0c;这是一个糖果机的状态机图&#xff0c;要求使用代码实现&#xff1a; 初始版本&#xff1a; package Chapter10_StatePattern.Origin;/*** Author 竹心* Date 2023/8/19**/public class GumballMachine {final static int SOLD_OUT 0;final static int…

【编织时空四:探究顺序表与链表的数据之旅】

本章重点 链表的分类 带头双向循环链表接口实现 顺序表和链表的区别 缓存利用率参考存储体系结构 以及 局部原理性。 一、链表的分类 实际中链表的结构非常多样&#xff0c;以下情况组合起来就有8种链表结构&#xff1a; 1. 单向或者双向 2. 带头或者不带头 3. 循环或者非…