SENet(2017)

article/2025/9/19 18:56:21

卷积核作为卷积神经网络的核心,通常被看作是在局部感受野上,将空间上(spatial)的信息和特征维度上(channel-wise)的信息进行聚合的信息聚合体。卷积神经网络由一系列卷积层、非线性层和下采样层构成,这样它们能够从全局感受野上去捕获图像的特征来进行图像的描述。
在这里插入图片描述
去学到一个性能非常强劲的网络是相当困难的,从空间维度层面来提升网络的性能,如Inception结构中嵌入了多尺度信息,聚合多种不同感受野上的特征来获得性能增益;在Inside-Outside网络中考虑了空间中的上下文信息;将Attention机制引入到空间维度上等。
在这里插入图片描述
Squeeze-and-Excitation Networks(简称 SENet)显示的建模特征通道之间的相互依赖关系。采用全新的特征重标定策略,即通过学习的方式来自动获取到每个特征通道的重要程度,然后依照这个重要程度去提升有用的特征并抑制对当前任务用处不大的特征。
在这里插入图片描述
Squeeze-and-Excitation(SE)block并不是一个完整的网络结构,而是一个子结构,可以嵌到其他分类或检测模型中,作者采用SENet block和ResNeXt结合在ILSVRC2017分类项目中拿到第一,在ImageNet数据集上将top-5 error降低到2.251%,原先的最好成绩是2.991%。

作者在文中将SENet block插入到现有的多种分类网络中,都取得了不错的效果。SENet的核心思想在于通过网络根据loss去学习特征权重,使得有效的feature map权重大,无效或效果小的feature map权重小的方式训练模型达到更好的结果。当然,SE block嵌在原有的一些分类网络中不可避免的增加了一些参数和计算量,但是在效果面前还是可以接受的。

下图是SE模块的示意图,给定一个输入 x x x,其特征通道数为 c 1 c_1 c1,通过一系列卷积等一般变换后得到一个特征通道数为 c 2 c_2 c2的特征。
在这里插入图片描述

Squeeze操作顺着空间维度来进行特征压缩,将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数像匹配。它表征着在特征通道上响应的全局分布,而且使得靠近输入的层也可以获得全局感受野,这在很多任务中都非常重要。
在这里插入图片描述

Excitation操作是一个类似于循环神经网络中门的机制。通过参数 w w w来为每个特征通道生成权重,其中参数 w w w被学习用来显示的建模特征通道间的相关性。
在这里插入图片描述

Reweight操作,将Excitation的输出的权重看作是进过特征选择后的每个特征通道的重要性,然后通过乘法逐通道加权到先前的特征上,完成在通道维度上的对原始特征的重标定。
在这里插入图片描述

在这里插入图片描述
下图是将SE模块嵌入到Inception结构的一个示例,方框旁边的维度信息代表该层的输出。这里使用global average pooling作为squeeze操作,紧接着两个Fully Connected层组成一个Bottleneck结构取构建通道间的相关性,并输出和输入特征同样数目的权重。

  • 首先将特征维度降低到输入的1/16。
  • 然后经过ReLU激活函数后再通过一个Fully Connected层升回到原来的维度。这样做比直接用一个Fully Connected层的好处在于:
    • 具有更多的非线性,可以更好的拟合通道间复杂的相关性;
    • 极大的减少了参数量和计算量。然后通过一个Sigmoid的门获得0~1之间归一化的权重。
  • 最后通过一个Scale的操作来将归一化后的权重加权到每个通道的特征上。

下图右图是将SE嵌入到ResNet模块中的一个例子,操作过程基本和SE-Inception一样,只不过是在Addition前对分支上Residual的特征进行了特征重标定。如果对Addition后主支上的特征进行重标定,由于在主干上存在0~1的scale操作,在网络较深BP优化时就会在靠近输入层容易出现梯度消散的情况,导致模型难以优化。
在这里插入图片描述

目前大多数的主流网络都是基于这两种类似的单元通过repeat方式叠加起来构造的。由此可见,SE模块可以嵌入到现在几乎所有的网络结构中。通过在原始网络结构的building block单元中嵌入SE模块,可以获得不同种类的SENet。
在这里插入图片描述
在这里插入图片描述
SE模块很容易嵌入到其它网络中,作者为了验证SE模块的作用,在其它流行网络如ResNet和VGG中引入SE模块,测试其在ImageNet上的效果,如下表所示:
在这里插入图片描述
可以看到所有网络在加入SE模块后分类准确度均有一定的提升。此外,作者还测试了SE模块在轻量级网络MobileNet和ShuffleNet上的效果,如下表所示,可以看到也是有效果提升的。
在这里插入图片描述
最终作者采用了一系列的SENet进行集成,在ImageNet测试集上的top-5 error为2.251%,赢得了2017年竞赛的冠军。其中最关键的模型是SENet-154,其建立在ResNeXt模型基础上,效果如下表所示:
在这里插入图片描述

另外,由于在现有的GPU实现中,都没有对global pooling和较小计算量的Fully Connected进行优化,这导致在GPU上的运行时间SE-ResNet-50相对于ResNet-50有着约10%的增长。尽管如此,其理论增长的额外计算量仅仅不到1%,这与其在CPU运行时间上的增长相匹配(~2%)。可以看出,在现有网络架构中嵌入SE模块而导致额外的参数和计算量的增长微乎其微。
在这里插入图片描述

class SELayer(nn.Module):def __init__(self, channel, recution=16):super(SELayer, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.fc = nn.Sequential(nn.Linear(channel, channel // reduction, bias=False),nn.ReLU(inplace=True),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)
class SEBottleneck(nn.Module):expansion = 4def __init__(self, inplanes, planes, stride=1, downsample=None, reduction=16):super(SEBottleneck, self).__init__()self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False)self.bn1 = nn.BatchNorm2d(planes)self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, padding=1, bias=False)self.bn2 = nn.BatchNorm2d(planes)self.conv3 = nn.Conv2d(planes, planes * 4, kernel_size=1, bias=False)self.bn3 = nn.BatchNorm2d(planes * 4)self.relu = nn.ReLU(inplace=True)self.se = SELayer(planes * 4, reduction)self.downsample = downsampleself.stride = stridedef foward(self, x):residual = xout = self.conv1(x)out = self.bn1(out)out = self.relu(out)out = self.conv2(out)out = self.bn2(out)out = self.relu(out)out = self.conv3(out)out = self.bn3(out)out = self.se(out)if self.downsample is not None:residual = self.downsample(x)out += residualout = self.relu(out)return out

参考资料
深度学习——分类之SENet
Momenta详解ImageNet 2017夺冠架构SENet
最后一届ImageNet冠军模型:SENet
SENet(Squeeze-and-Excitation Networks)算法笔记—通过学习的方式来自动获取到每个特征通道的重要程度,然后依照这个重要程度去提升有用的特征并抑制对当前任务用处不大…
Momenta详解ImageNet 2017夺冠架构SENet


http://chatgpt.dhexx.cn/article/UNgVjqOM.shtml

相关文章

SENet

这篇文章出自《Squeeze-and-Excitation Networks》,在ILSVRC-2017分类挑战赛上获得了冠军。 1. 研究问题 大多数CNN都研究如何捕获特征的空间相关性来提高网络的表示能力,这篇文章研究的是捕获特征通道之间的相关性来提高网络性能。 2. 研究方法 提出…

SENET和GateNet(推荐系统(embedding))

SENET介绍 SENET是在论文《Squeeze-and-Excitation Networks》中提出来的,应用在图像处理上的。主要思想:通过建模channel之间的关系来矫正channel的特征,以此提升神经网络的表征能力。(原文:adaptively recalibrates…

SENet解析

1 前言 在深度学习领域,CNN分类网络的发展对其它计算机视觉任务如目标检测和语义分割都起到至关重要的作用,因为检测和分割模型通常是构建在CNN分类网络(称为backbone)之上。提到CNN分类网络,我们所熟知的是VGG&#…

SENet详解

SENet是ImageNet 2017(ImageNet收官赛)的冠军模型,和ResNet的出现类似,都在很大程度上减小了之前模型的错误率(具体见附录),并且复杂度低,新增参数和计算量小。下面就来具体介绍一些…

SENet概览

一、背景 在深度学习领域,已经有很多成果通过在空间维度上对网络的性能进行了提升。但是,SENet反其道而行之,通过对通道关系进行建模来提升网络的性能。Squeeze和Excitation是两个非常关键的操作,所以SENet以此来命名。SENet的动机…

深度学习理论篇之 ( 十八) -- 注意力机制之SENet

科普知识 ILSVRC(ImageNet Large Scale Visual Recognition Challenge)是机器视觉领域最受追捧也是最具权威的学术竞赛之一,代表了图像领域的最高水平。 ImageNet数据集是ILSVRC竞赛使用的是数据集,由斯坦福大学李飞飞教授主导&am…

【深度学习】(8) CNN中的通道注意力机制(SEnet、ECAnet),附Tensorflow完整代码

各位同学好,今天和大家分享一下attention注意力机制在CNN卷积神经网络中的应用,重点介绍三种注意力机制,及其代码复现。 在我之前的神经网络专栏的文章中也使用到过注意力机制,比如在MobileNetV3、EfficientNet网络中都是用了SE注…

[ 注意力机制 ] 经典网络模型1——SENet 详解与复现

🤵 Author :Horizon Max ✨ 编程技巧篇:各种操作小结 🎇 机器视觉篇:会变魔术 OpenCV 💥 深度学习篇:简单入门 PyTorch 🏆 神经网络篇:经典网络模型 💻 …

算法 雪花算法 Python

Twitter 于 2010 年开源了内部团队在用的一款全局唯一 ID 生成算法 Snowflake,翻译过来叫做雪花算法。Snowflake 不借助数据库,可直接由编程语言生成,它通过巧妙的位设计使得 ID 能够满足递增属性,且生成的 ID 并不是依次连续的。…

聊聊雪花算法?

随便聊聊 哈喽,大家好,最近换了份工作,虽然后端技术栈是老了点,但是呢,这边的前端技术确是现在市面上最新的那一套技术:Vue3ViteTSXPinaElement-PlusNativeUI。我本人主要是学后端的,确被拉去做…

雪花算法生成实例

雪花算法生成实例 一、集群高并发情况下如何保证分布式唯一全局id生成?1.1 为什么需要分布式全局唯一ID以及分布式ID的业务需求1.2 ID生成规则部分硬性要求1.3 ID号生成系统的可用性要求 二、一般通用方案2.1 UUID2.2 数据库自增主键2.3 基于Redis生成全局id策略2.4…

算法 —— 雪花算法

文章目录 算法 —— 雪花算法简介实现原理结构图 算法 —— 雪花算法 简介 雪花算法是由 Twitter 公布的分布式主键生成算法,它能够保证不同进程主键的不重复性,以及相同进程主键的有序性。 实现原理 在同一个进程中,它首先是通过时间位保…

java雪花算法实现

基于雪花算法(Snowflake)模式雪花算法(Snowflake)是twitter公司内部分布式项目采用的ID生成算法,开源后广受国内大厂的好评,在该算法影响下各大公司相继开发出各具特色的分布式生成器。 Snowflake生成的是L…

雪花算法的实现原理

一位工作4年的小伙伴,去某东面试时被问到这样一道题,说请你简述一下雪花算法的实现原理。屏幕前的小伙伴,如果你遇到这个问题,你会怎么回答? 今天,我给大家分享一下我的理解。 1、什么是雪花算法 雪花算…

Python 实现雪花算法

Python 实现雪花算法 雪花算法:雪花算法是一种分布式全局唯一ID,一般不需要过多的深入了解,一般个人项目用不到分布式之类的大型架构,另一方面,则是因为,就算用到市面上很多 ID 生成器帮我们完成了这项工作…

雪花算法简介以及代码实现

文章目录 雪花算法分布式ID分布式ID需要满足的要求全局唯一:高性能:高可用:方便易用:安全:有序递增:要求具体的业务含义:独立部署: 组成代码实现Java代码实现Go语言实现 雪花算法 简介: 雪花算法是Twitter开源的分布式ID生成算法 Github仓库地址 雪花算法主要用于分布式系统中…

雪花算法(id生成算法)

SnowFlake 雪花算法 SnowFlake 中文意思为雪花,故称为雪花算法。最早是 Twitter 公司在其内部用于分布式环境下生成唯一 ID。在2014年开源 scala 语言版本。 实现原理 雪花算法原理就是生成一个的64位比特位的 long 类型的唯一 id。 最高1位固定值0&#xff0c…

什么是雪花算法?啥原理?

1、SnowFlake核心思想 SnowFlake 算法,是 Twitter 开源的分布式 ID 生成算法。 其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 ID。在分布式系统中的应用十分广泛,且 ID 引入了时间戳,基本上保持自增的&#xf…

雪花算法-java

前言: 👏作者简介:我是笑霸final,一名热爱技术的在校学生。 📝个人主页:个人主页1 || 笑霸final的主页2 📕系列专栏:计算机基础专栏 📧如果文章知识点有错误的地方&#…

数据库中雪花算法是什么?

一、为何要用雪花算法 1、问题产生的背景 现如今越来越多的公司都在用分布式、微服务,那么对应的就会针对不同的服务进行数据库拆分,然后当数据量上来的时候也会进行分表,那么随之而来的就是分表以后id的问题。 例如之前单体项目中一个表中…