转:

SENet详解及Keras复现代码

论文地址:https://arxiv.org/pdf/1709.01507.pdf

代码地址:https://github.com/hujie-frank/SENet

1、通道间的特征关系

近些年来,卷积神经网络在很多领域上都取得了巨大的突破。而卷积核作为卷积神经网络的核心,通常被看做是在局部感受野上,将空间上(spatial)的信息和特征维度上(channel-wise)的信息进行聚合的信息聚合体。卷积神经网络由一系列卷积层、非线性层和下采样层构成,这样它们能够从全局感受野上去捕获图像的特征来进行图像的描述。

我们可以看到,已经有很多工作在空间维度上来提升网络的性能。那么很自然想到,网络是否可以从其他层面来考虑去提升性能,比如考虑特征通道之间的关系?论文的作者就是基于这一点并且提出了Squeeze-and-Excitation Networks(简称 SENet)。作者并不希望引入一个新的维度来进行特征通道间的融合,而是采用一种全新的特征重标定策略。简单来说,就是通过增加一条分支,自动获取到每个通道的重要程度,然后依照这个重要程度去提升有用的信息,同时抑制对当前任务用处不大的特征。

上图是SE模块的示意图。给定一个输入X,其通道数维C’,经过一系列卷积等变换后得到一个通道数维C的特征。接下来的结构有点类似ResNet,但又与ResNet有很大不同。

首先是Squeeze操作,我们顺着空间维度来进行特征压缩,将每个二维特征通道变换成一个实数,这个实数某种程度上具有全局感受野,并且输出和输入的通道数是一样的。它表征着在特征通道上响应的全局分布,而且使得靠近输入的层也可以获得全局的感受野,这一点在很多任务中都是非常有用的。

其次是Excitation操作,他是类似于RNN中门的机制,通过参数W来为每个特征通道生成权重,其中参数W将被用来控制U中每个通道的重要性。

最后一个是Reweight的操作,我们将Excitation的输出权重看做是特征选择后每个特征通道的重要性,然后通过乘法逐通道加权到原来的特征U上,完成在通道维度上的特征重标定。

2、具体的网络结构

由于SE模块并不像GoogLeNet和ResNet一样,提出了全新的网络结构,所以它是可以很灵活的嵌入到已有主流网络中去。

上图左边是将SE模块嵌入到Inception结构的一个示例。

这里的Global pooling对应着Squeeze操作,它将输入特征层的维度压缩至1 x 1 x C。紧接着两个全连接层组成一个Bottleneck结构去建模通道间的相关性,并且最终输出的维度信息保持不变,为1 x 1 x C。

我们可以看到第一个全连接层使用了ReLU作为激活函数,第二个层采用了Sigmoid的作为激活函数。而我们知道Sigmoid会变量映射到0,1之间,也就是说有用的特征通过SE模块让他更偏向于1了,同时无用的特征也更接近0了,那么通过最后Scale操作,将输出权重与原始特征的每个通道逐乘也就增益了原始通道有用的特征,抑制了无用特征。

为什么采用两个全连接层而不是一个的原因在于:

  1. 通过ReLU可以获得更多的非线性
  2. 引入r参数可以减少参数量和计算量

除此之外,SE模块也可以嵌入到含有跨层连接的网络中去,上图右边就是将SE嵌入到模块中的一个例子,原理、操作基本和SE-Inception一样,只不过是在最后的Addition前对分支上Residual的特征进行重标定。

目前大多数的主流网络都是基于这两种类似的单元通过 repeat 方式叠加来构造的。由此可见,SE 模块可以嵌入到现在几乎所有的网络结构中。通过在原始网络结构的 building block 单元中嵌入 SE 模块,我们可以获得不同种类的 SENet。如 SE-BN-Inception、SE-ResNet、SE-ReNeXt、SE-Inception-ResNet-v2 等等。

3、实验结果

论文中给出了ResNet、ResNeXt等在当时比较常见的网络对比结果。深度学习经过几年的发展,在数据增强上也有了新的突破,为了公平起见,作者将网络又重新实现了一遍并且采用了同样的数据增强方式。结果如下图所示:

结合试验结果和上面的介绍来看,我们可以发现SENet的构造非常简单,不需要引入新的函数或层。对比原来的网络,仅仅只需要增加2%-10%的参数,就能将误差降低0.4-1.1左右。

4、更多的尝试

参数r的调节

我们在第一个全连接中引入了参数r,使得第一个全连接层的通道数减少,整体呈现一个瓶颈状的结构。作者的试验结果发现r=8时会有一个比较好的效果。

Pooling的方式


对于空间维度的压缩方式,作者尝试了Global Max Pooling和Global Average Pooling两种方式,无论是top-1还是top-5,结果都表明,AvgPool效果会更好。

激活函数的选择


接下来是最后一个全连接层激活函数的选择,用tanh替换sigmoid会略微恶化性能,而使用ReLU会显著恶化,实际上会导致SE-ResNet-50的性能低于ResNet-50基线。这表明,为了使SE块有效,激活函数的选择是很重要的。

SE Block添加的位置


作者还对SE模块添加的位置做了对比,在top-5上在越靠后的Stage上填加SE模块比在越靠前的Stage上添加效果要好,当然如果在所有Stage都添加效果是最好的。

SE的四种结构


最后是对SE模块的结构进行了对比:

​ (a) 普通的残差
​ (b) 标准的SE模块
​ 先进行SE再进行残差
​ (d) 先完成残差计算再进行SE模块计算
​ (e) 在跨层连接上完成SE模块计算


从结果上看,是SE-PRE的结构略胜一筹,但个人觉得只是在ResNet-50上对比了一下还不具有说服力。但是无论是什么结构都会提高ResNet的准确率,说明SE模块是有起作用的。

5、总结

SENet作为ImageNet竞赛的最后一届图像识别冠军,作者是付出了很多的时间,在网络架构上做了大量的尝试和实验,论文中还有些细节没有在本文中展开解释,读者可以下载论文详细阅读。作者开源的代码是基于caffe的,笔者自己也尝试在keras和tf2上进行复现,比较直观的效果是分类的置信度比原本ResNet要高很多。可能是因为在SE-ResNet中进行了多次sigmoid函数激活。

  • Keras-SEResNet

转:

SENet详解及Keras复现代码

SENet详解及Keras复现代码的更多相关文章

  1. 训练技巧详解【含有部分代码】Bag of Tricks for Image Classification with Convolutional Neural Networks

    训练技巧详解[含有部分代码]Bag of Tricks for Image Classification with Convolutional Neural Networks 置顶 2018-12-1 ...

  2. 详解计算miou的代码以及混淆矩阵的意义

    详解计算miou的代码以及混淆矩阵的意义 miou的定义 ''' Mean Intersection over Union(MIoU,均交并比):为语义分割的标准度量.其计算两个集合的交集和并集之比. ...

  3. Console命令详解,让调试js代码变得更简单

    Firebug是网页开发的利器,能够极大地提升工作效率. 但是,它不太容易上手.我曾经翻译过一篇<Firebug入门指南>,介绍了一些基本用法.今天,继续介绍它的高级用法. ======= ...

  4. [转] Console命令详解,让调试js代码变得更简单

    http://www.cnblogs.com/see7di/archive/2011/11/21/2257442.html Firebug是网页开发的利器,能够极大地提升工作效率. 但是,它不太容易上 ...

  5. rabbitmq五种模式详解(含实现代码)

    一.五种模式详解 1.简单模式(Queue模式) 当生产端发送消息到交换机,交换机根据消息属性发送到队列,消费者监听绑定队列实现消息的接收和消费逻辑编写.简单模式下,强调的一个队列queue只被一个消 ...

  6. 【小白学PyTorch】12 SENet详解及PyTorch实现

    文章来自微信公众号[机器学习炼丹术].我是炼丹兄,有什么问题都可以来找我交流,近期建立了微信交流群,也在朋友圈抽奖赠书十多本了.我的微信是cyx645016617,欢迎各位朋友. 参考目录: @ 目录 ...

  7. jquery轮播图详解,40行代码即可简单解决。

    我在两个月以前没有接触过html,css,jquery,javascript.今天我却在这里分享一篇技术贴,可能在技术大牛面前我的文章漏洞百出,也请斧正. 可以看出来,无论是div+css布局还是jq ...

  8. Bullet核心类介绍(Bullet 2.82 HelloWorld程序及其详解,附程序代码)

    实验平台:win7,VS2010 先上结果截图: 文章最后附有生成该图的程序. 1. 刚体模拟原理 Bullet作为一个物理引擎,其任务就是刚体模拟(还有可变形体模拟).刚体模拟,就是要计算预测物体的 ...

  9. 通俗易懂详解Java代理及代码实战

    一.概述 代理模式是Java常用的设计模式之一,实现代理模式要求代理类和委托类(被代理的类)具有相同的方法(提供相同的服务),代理类对象自身并不实现真正的核心逻辑,而是通过调用委托类对象的相关方法来处 ...

随机推荐

  1. 「SCOI2005」互不侵犯 (状压DP)

    题目链接 在\(N\times N\) 的棋盘里面放 \(K\)个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共\(8\) 个格子 ...

  2. Codeforces Global Round 11 C. The Hard Work of Paparazzi(dp/最长上升子序列)

    题目链接:https://codeforces.com/contest/1427/problem/C 题意 \(r\) 行与 \(r\) 列相交形成了 \(r \times r\) 个点,初始时刻记者 ...

  3. 【noi 2.6_9281】技能树(DP)

    题意:要求二叉树中每个节点的子节点数为0或2,求有N个节点高度为M的不同的二叉树有多少个(输出 mod 9901 后的结果). 解法:f[i][j]表示高度为i的有j个节点的二叉树个数.同上题一样,把 ...

  4. 【Azure Redis 缓存】使用Python代码获取Azure Redis的监控指标值 (含Powershell脚本方式)

    问题描述 通过Metrics监控页面,我们能得知当前资源(如Redis)的运行情况与各种指标.如果我们需要把指标下载到本地或者生成JSON数据导入到第三方的监控平台呢?Azure是否可以通过Pytho ...

  5. Yocto项目介绍及入门 -- 嵌入师工程师必备利器

    目录 写在前面 1. Yocto项目是什么 2. Yocto项目有什么用 3. 如何快速上手Yocto项目 4. 带你通过Yocto项目编译一个自定义镜像文件 写在前面 博主目前从事BMC工作,由于公 ...

  6. PAT L2-004. 这是二叉搜索树吗?【前序遍历转化为后序遍历】

    一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点, 其左子树中所有结点的键值小于该结点的键值: 其右子树中所有结点的键值大于等于该结点的键值: 其左右子树都是二叉搜索树. 所谓二叉搜索 ...

  7. Leetcode(38)-报数

    报数序列是指一个整数序列,按照其中的整数的顺序进行报数,得到下一个数.其前五项如下: 1. 1 2. 11 3. 21 4. 1211 5. 111221 1 被读作  "one 1&quo ...

  8. 杭电多校HDU 6601 Keen On Everything But Triangle(主席树)题解

    题意: 有\(n\)根长度不一的棍子,q次询问,求\([L,R]\)区间的棍子所能组成的周长最长的三角形.棍长\(\in [1, 1e9]\),n\(\in [1, 1e5]\). 思路: 由于不构成 ...

  9. POJ 2288 Islands and Bridges(状压DP)题解

    题意:n个点,m有向边,w[i]表示i的价值,求价值最大的哈密顿图(只经过所有点一次).价值为:所有点的w之和,加上,每条边的价值 = w[i] * w[j],加上,如果连续的三个点相互连接的价值 = ...

  10. 知乎 bug

    知乎 bug shit zhihu https://zhuanlan.zhihu.com/p/111809590 无法展开评论 https://unpkg.zhimg.com/@cfe/sentry- ...