当前位置: 首页 > news >正文

一文读懂SEnet:如何让机器学习模型学会“重点观察”

深入探讨一个在图像识别、自然语言处理等众多领域大放异彩的注意力模块——Squeeze-and-Excitation Networks(SEnet)。本文不仅会理论剖析SEnet的核心原理,还会手把手带你完成在TensorFlow和Pytorch这两个主流框架上的代码实现。准备好了吗?一起步入注意力机制的精妙世界。

一、SEnet:深度网络的敏锐洞察力

SEnet首次提出于2017年,它革新了传统神经网络对特征处理的方式。不同于常规的前馈结构,SEnet通过在每个卷积块后添加一个轻量级的注意力模块,动态地为每个通道分配权重,强调重要特征而抑制不相关的信号。这项创新不仅提高了模型效率,还显著提升了在多个基准测试任务上的性能。

论文与代码资源

在深入探讨之前,这里附上SEnet的原始论文链接[1],以及官方提供的代码仓库[2],供各位进一步探索。

二、SE模块的奥秘

1. 输入与结构概述

SE模块处理的输入通常是具有形态为D×H×W×C的数据,其中D、H、W分别代表深度、高度和宽度,C则代表通道数。特别地,在二维图像处理场景中,深度D一般为1。

2. “挤压”(Squeeze)操作

通道压缩

SE模块首先通过全局平均池化将三维空间特征(H×W×C)压扁至一维(1×1×C),这个过程被称为“挤压”。此步骤有效地提取了全局上下文信息,为接下来的特征重标定奠定基础。

3. “激励”(Excitation)操作

特征再赋权
  • 双全连接层:压缩后的特征经过两个全连接层处理。第一个全连接层大幅度降低维度(使用降维比ratio,如默认的2^n),然后通过ReLU激活引入非线性;第二个全连接层将维度恢复到原始通道数C,为每个通道产生一个标量权重。
  • Sigmoid激活:最终,利用Sigmoid函数将得到的权重映射至(0,1)区间,实现对每个通道的重要性判断。

4. “Scale”操作

得到的通道权重被用于逐元素地缩放原始特征图的通道值,强化重要特征,抑制无关特征。

三、代码实现:从理论到实践

1. TensorFlow实现

定义squeeze_excite_block
def squeeze_excite_block(input, ratio=16):init = tf.keras.initializers.he_normal()filters = input.shape[-1]# Squeezese_shape = (1, 1, filters)se = tf.keras.layers.GlobalAveragePooling2D()(input)se = tf.keras.layers.Reshape(se_shape)(se)# Excitationse = tf.keras.layers.Dense(filters // ratio, activation='relu', kernel_initializer=init)(se)se = tf.keras.layers.Dense(filters, activation='sigmoid', kernel_initializer=init)(se)# Scalescaled = tf.keras.layers.multiply([input, se])return scaled

2. PyTorch实现

squeeze_excite_block
import torch.nn as nn
from torch import sigmoidclass SqueezeExcite(nn.Module):def __init__(self, in_channels, ratio=16):super(SqueezeExcite, self).__init__()reduced_dim = in_channels // ratioself.fc1 = nn.Linear(in_channels, reduced_dim)self.fc2 = nn.Linear(reduced_dim, in_channels)self.init_weights()def init_weights(self):nn.init.kaiming_uniform_(self.fc1.weight)nn.init.zeros_(self.fc1.bias)nn.init.uniform_(self.fc2.weight, a=-1e-3, b=1e-3)nn.init.zeros_(self.fc2.bias)def forward(self, x):batch_size, channels, height, width = x.size()se_tensor = F.avg_pool2d(x, (height, width)).view(batch_size, channels)se_tensor = self.fc1(se_tensor)se_tensor = F.relu(se_tensor)se_tensor = self.fc2(se_tensor)se_tensor = sigmoid(se_tensor)se_tensor = se_tensor.view(batch_size, channels, 1, 1)return x * se_tensor

四、结语

SEnet通过其巧妙的注意力机制,让模型更加专注于关键信息,有效促进了深度学习在诸多领域的应用。本文从理论层面剖析了SE模块的内部机制,并通过示例代码展示了在TensorFlow和Pytorch中的具体实现路径,希望对你理解并运用这一先进工具带来启发。

目前PlugLink发布了开源版和应用版,开源版下载地址:
Github地址:https://github.com/zhengqia/PlugLink
Gitcode地址:https://gitcode.com/zhengiqa8/PlugLink/overview
Gitee地址:https://gitee.com/xinyizq/PlugLink

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Hadoop-驯化】一文教你轻松搞懂hadoop的基本原理
  • 单个或两个及以上java安装与环境变量配置
  • Java码农人生使用手册——类和对象
  • Python教程(十一):单元测试与异常捕获
  • CTFHub XSS DOM 跳转
  • Python面试整理-第三方库
  • C++面向对象高级编程(I)侯捷 自我总结版
  • vim、sublime、notepad文本编辑器的使用
  • 爬虫中常见的加密算法Base64伪加密,MD5加密【DES/AES/RSA/SHA/HMAC】及其代码实现(二)
  • 设计模式介绍
  • 测试面试宝典(四十二)—— 接口测试什么时候介入
  • thinkphp 关联查询例子
  • 苹果手机录音删除了怎么恢复?快收藏,这3个方法超简单!
  • Learning vtkjs之Calculator
  • 我菜单为什么跟着滑动了?!!—— 固定定位为什么会失效?
  • [nginx文档翻译系列] 控制nginx
  • Angular2开发踩坑系列-生产环境编译
  • C# 免费离线人脸识别 2.0 Demo
  • Computed property XXX was assigned to but it has no setter
  • eclipse(luna)创建web工程
  • java2019面试题北京
  • JavaScript中的对象个人分享
  • MYSQL 的 IF 函数
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Spring框架之我见(三)——IOC、AOP
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Sublime Text 2/3 绑定Eclipse快捷键
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 区块链共识机制优缺点对比都是什么
  • 深度学习入门:10门免费线上课程推荐
  • 使用SAX解析XML
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 微服务框架lagom
  • 小程序 setData 学问多
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​你们这样子,耽误我的工作进度怎么办?
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (2)STL算法之元素计数
  • (2)空速传感器
  • (7)STL算法之交换赋值
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (力扣)循环队列的实现与详解(C语言)
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转载)PyTorch代码规范最佳实践和样式指南
  • *上位机的定义
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别