SE Net - Squeeze-and-Excitation Networks_默一鸣的博客-程序员ITS301

技术标签: ML  

论文:Squeeze-and-Excitation Networks 
论文链接:https://arxiv.org/abs/1709.01507 
代码地址:https://github.com/hujie-frank/SENet 
PyTorch代码地址:https://github.com/miraclewkf/SENet-PyTorch

Sequeeze-and-Excitation(SE) block并不是一个完整的网络结构,而是一个子结构,可以嵌到其他分类或检测模型中,作者采用SENet block和ResNeXt结合在ILSVRC 2017的分类项目中拿到第一,在ImageNet数据集上将top-5 error降低到2.251%,原先的最好成绩是2.991%。 
作者在文中将SENet block插入到现有的多种分类网络中,都取得了不错的效果。SENet的核心思想在于通过网络根据loss去学习特征权重,使得有效的feature map权重大,无效或效果小的feature map权重小的方式训练模型达到更好的结果。当然,SE block嵌在原有的一些分类网络中不可避免地增加了一些参数和计算量,但是在效果面前还是可以接受的。

也许通过给某一层特征配备权重的想法很多人都有,那为什么只有SENet成功了?个人认为主要原因在于权重具体怎么训练得到。就像有些是直接根据feature map的数值分布来判断;有些可能也利用了loss来指导权重的训练,不过全局信息该怎么获取和利用也是因人而异。

Figure1表示一个SE block。主要包含Squeeze和Excitation两部分,接下来结合公式来讲解Figure1。

这里写图片描述

首先Ftr这一步是转换操作(严格讲并不属于SENet,而是属于原网络,可以看后面SENet和Inception及ResNet网络的结合),在文中就是一个标准的卷积操作而已,输入输出的定义如下表示。

这里写图片描述

那么这个Ftr的公式就是下面的公式1(卷积操作,vc表示第c个卷积核,xs表示第s个输入)。

这里写图片描述

Ftr得到的U就是Figure1中的左边第二个三维矩阵,也叫tensor,或者叫C个大小为H*W的feature map。而uc表示U中第c个二维矩阵,下标c表示channel。

接下来就是Squeeze操作,公式非常简单,就是一个global average pooling:

这里写图片描述

因此公式2就将H*W*C的输入转换成1*1*C的输出,对应Figure1中的Fsq操作。为什么会有这一步呢?这一步的结果相当于表明该层C个feature map的数值分布情况,或者叫全局信息。

再接下来就是Excitation操作,如公式3。直接看最后一个等号,前面squeeze得到的结果是z,这里先用W1乘以z,就是一个全连接层操作,W1的维度是C/r * C,这个r是一个缩放参数,在文中取的是16,这个参数的目的是为了减少channel个数从而降低计算量。又因为z的维度是1*1*C,所以W1z的结果就是1*1*C/r;然后再经过一个ReLU层,输出的维度不变;然后再和W2相乘,和W2相乘也是一个全连接层的过程,W2的维度是C*C/r,因此输出的维度就是1*1*C;最后再经过sigmoid函数,得到s。

这里写图片描述

也就是说最后得到的这个s的维度是1*1*C,C表示channel数目。这个s其实是本文的核心,它是用来刻画tensor U中C个feature map的权重。而且这个权重是通过前面这些全连接层和非线性层学习得到的,因此可以end-to-end训练。这两个全连接层的作用就是融合各通道的feature map信息,因为前面的squeeze都是在某个channel的feature map里面操作。

在得到s之后,就可以对原来的tensor U操作了,就是下面的公式4。也很简单,就是channel-wise multiplication,什么意思呢?uc是一个二维矩阵,sc是一个数,也就是权重,因此相当于把uc矩阵中的每个值都乘以sc。对应Figure1中的Fscale。

这里写图片描述

了解完上面的公式,就可以看看在实际网络中怎么添加SE block。Figure2是在Inception中加入SE block的情况,这里的Inception部分就对应Figure1中的Ftr操作。

这里写图片描述

Figure3是在ResNet中添加SE block的情况。

这里写图片描述

看完结构,再来看添加了SE block后,模型的参数到底增加了多少。其实从前面的介绍可以看出增加的参数主要来自两个全连接层,两个全连接层的维度都是C/r * C,那么这两个全连接层的参数量就是2*C^2/r。以ResNet为例,假设ResNet一共包含S个stage,每个Stage包含N个重复的residual block,那么整个添加了SE block的ResNet增加的参数量就是下面的公式:

这里写图片描述

除了公式介绍,文中还举了更详细的例子来说明参数增加大概是多少百分比:In total, SE-ResNet-50 introduces 2.5 million additional parameters beyond the 25 million parameters required by ResNet-50, corresponding to a 10% increase in the total number of parameters。而且从公式5可以看出,增加的参数和C关系很大,而网络越到高层,其feature map的channel个数越多,也就是C越大,因此大部分增加的参数都是在高层。同时作者通过实验发现即便去掉最后一个stage的SE block,对模型的影响也非常小(<0.1% top-1 error),因此如果你对参数量的限制要求很高,倒是可以这么做,毕竟具体在哪些stage,哪些block中添加SE block都是自由定义的。

Table2是将SE block添加到ResNet,ResNeXt和Inception三个模型中的效果对比,数据集都是ImageNet,可以看出计算复杂度的增加并不明显(增加的主要是全连接层,全连接层其实主要还是增加参数量,对速度影响不会太大)。

这里写图片描述

既然是冠军算法,文中也介绍了当时取得冠军时的算法大致组成:Our winning entry comprised a small ensemble of SENets that employed a standard multi-scale and multi-crop fusion strategy to obtain a 2.251% top-5 error on the test set.This result represents a 25% relative improvement on the winning entry of 2016 (2.99% top-5 error). 也就是说其实是多模型做了融合。

而在融合的多个模型之中:One of our high-performing networks is constructed by integrating SE blocks with a modified ResNeXt,也就是Table3中最后一行的SENet!具体而言是在64*4d 的ResNeXt-152网络中引入了SE block。而这个ResNeXt-152是在ResNeXt-101的基础上根据ResNet-152的叠加方式改造出来的,因为原来的ResNeXt文章中并没有提到152层的ResNeXt,具体改造可以看文章的附录,附录的一些细节可以在以后应用中参考。从Table3可以看出即便是单模型,SENet的效果也比其他算法要好。

这里写图片描述

另外前面提到过在SE block中第一个全连接层的维度是C/r * C,这个r在文中取的是16,作用在于将原来输入是1*1*C的feature map缩减为1*1*C/r的feature map,这一就降低了后面的计算量。而下面的Table5则是关于这个参数r取不同值时对结果和模型大小的影响。

这里写图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yimingsilence/article/details/79233650

智能推荐

java自定义注解验证类的属性必填,最小、最大值、最小最大长度_麻花2013的博客-程序员ITS301_定义一个应用与字段的注解checkint,判断字段的最大值和最小值是否满足要求。

编写不易,给个赞 自定义注解,设置范围和注解方法import java.lang.annotation.*;@Target({ ElementType.FIELD, ElementType.TYPE })@[email protected]@Retention(RetentionPolicy.RUNTIME)public @interface DataLengh{ int min() default 0; int max() default 21474836.

配置负载均衡_tjg888888的博客-程序员ITS301

前端项目域名配置文件upstream backendapi { #ip_hash; server stg_api2.vfinemusic.com:8081; server bro_api2.vfinemusic.com:8080;}server { listen 80; client_max_body_size 10240M; server_name stg_broadmin.vfinemusic.com; ...

GDCM:读取和打印DICOM的属性的测试程序_全栈技术博客的博客-程序员ITS301

GDCM:阅读和打印DICOM的属性GDCM:阅读和打印DICOM的属性GDCM:阅读和打印DICOM的属性#include "gdcmReader.h"#include "gdcmGlobal.h"#include "gdcmDicts.h"#include "gdcmDict.h"#include "gdcmAttribute.h"#include "gdcmStringFilter.h"#include &lt;iostream&gt;int main(int argc, char

VisualFreeBASIC基础——单选和复选框的使用_rainheart311的博客-程序员ITS301

单选和复选框的属性基本类似,所以就一起介绍吧。一、属性1、Name(名称) 和窗口一样,Name属性是类的实例化,我们可以用【名称.属性/方法】来使用控件。2、Caption(标题) 单选和复选框显示的标题。3、Value(值) 单选和复选框显示的值,选中为True,未选中为False。4、Enabled(可用)、Visible(显示)...

金山WPS:我们当年上了微软的当,现在终于扳回一局了_云表平台的博客-程序员ITS301

估摸算来,微软Office进入中国,也有差不多30年了吧。这是金山WPS,风雨兼程,苦尽甘来的30年。1993年,微软公司的Word火急火燎进入中国。那个时候,求伯君开发的文字处理软件WPS,可谓盛极一时。求伯君仅1994年,一年之间,WPS就卖出3万多套,创造了6600多万元的销售神话。作为外来户,微软非常清楚,要想打开中国市场,第一步必然是与本土办公软件WPS竞争,或者展开合作,想办法抢到金山WPS的用户。于是乎,微软行动了起来,绞尽脑汁地寻找与金山公司的接触机会。起初,微软找到金山公司最早的投资人张旋

uva 10718 Bit Mask (位运算)_SPZn_up的博客-程序员ITS301

uva 10718 Bit MaskIn bit-wise expression, mask is a common term. You can get a certain bit-pattern using mask. For example, if you want to make first 4 bits of a 32-bit number zero, you can us

随便推点

swoole通用类库,不管你用的什么框架,一个类库全部搞定!!!_yí無所冇的博客-程序员ITS301_swoole 类

       研究swoole一段时间了,但是swoole对于新手来说还是有一定的难度的,所以今天研究了下,写了一个通用的类库,这样可以直接在框架中引入调用就可以了,不多说,看代码吧. 先看一个代码的结构图:                                      也许熟悉TP5.1的小伙伴们看出来了,没错,这里面演示的就是在Tp5.0中的调用 先是关键核心的...

Kafka自定义zookeeper的根目录抛出“java.lang.IllegalArgumentException: Path length must be > 0”异常_weixin_46246967的博客-程序员ITS301

Kafka自定义zookeeper的根目录抛出“java.lang.IllegalArgumentException: Path length must be > 0”异常

centos 计算器_CENTOS上安装Torque4.0.3找不到计算节点_xander Sun的博客-程序员ITS301

给老板五台服务器弄成一个集群,打算用网上说的Torque+maui弄一个。安装就是按照《曙光机群配置笔记》里说的配置,除了NFS、QUOTOA和NIS没弄以外,SSH和MPI都配置好了。我在两台笔记本hp6531s 和hp4436s上测试,6531是服务节点,4436是计算节点。版本是torque4.0.3和maui3.3.1配置过程如下:####################5.Torque ...

gradle插件与gradle版本对应表_Calvin880828的博客-程序员ITS301_gradle对应版本

Android Gradle 插件与Gradle版本对应关系下表列出了各个 Android Gradle 插件版本所需的 Gradle 版本。为了获得最佳性能,您应使用 Gradle 和插件这两者的最新版本。插件版本 所需的 Gradle 版本 Kotlin版本 AS版本 1.0.0 - 1.1.3 2.2.1 - 2.3 1.2.0 - 1.3.1 2.2.1 - 2.9 1.5.0 2.2...

互联网产品怎么做数据埋点_weixin_30550271的博客-程序员ITS301

在互联网产品上线之后,产品和运营人员需要即时了解产品的使用情况,有多少用户,用户使用了哪些功能,停留时长,使用路径。。。等。要回答这些问题,需要有数据,不能拍脑袋想当然。数据怎么得到呢?埋点就是采集数据的重要途径。数据埋点不是新名词,在电脑网站出来之后就有统计工具,站长们很熟悉的谷歌、百度统计等工具,通过在HTML页面中嵌入它们提供的js代码实现数据采集。多说几句,无论谷歌、百度...

【NVCaffe源码分析】AnnotatedDataLayer(1)_昌山小屋的博客-程序员ITS301

对NVCaffe数据读取与处理部分的解读并不像直接解读某个 layer 一样结构清晰,需要拨开几层迷雾才能见到真相。我对数据部分的了解直接从解读 AnnotatedDataLayer这一 层的源代码开始,并以下面这份参数配置作为参考进行推理。layer { name: "data" type: "AnnotatedData" top: "data" top: "lab...

推荐文章

热门文章

相关标签