从LeNet到SENet——卷积神经网络回顾

从 1998 年经典的 LeNet,到 2012 年历史性的 AlexNet,之后深度学习进入了蓬勃发展阶段,百花齐放,大放异彩,出现了各式各样的不同网络,包括 LeNet、AlexNet、ZFNet、VGG、NiN、Inception v1 到 v4、Inception-ResNet、ResNet、WRN、FractalNet、Stochastic Depth、DenseNet、ResNeXt、Xception、SENet、SqueezeNet、NASNet、MobileNet v1和v2、ShuffleNet 等等。

它们各有特点,也互相借鉴,在很多任务上不断取得突破。本文从最基本的分类任务的角度,从无人问津到 ImageNet 上超越人类,回顾了卷积神经网络的发展历史。

经典网络

经典网络包括 LeNet、AlexNet 以及 VGG 等。

LeNet:1998,Gradient based learning applied to document recognition

用于手写数字识别,可以看到,卷积神经网络的基本框架已经有了,卷积、激活、池化和全连接,这几个基本组件都完备了。

但是,在 1998 年以后,深度学习并没有太多的突破。一直沉寂到 2012 年,AlexNet 横空出世,将深度学习重新带入大家视线,并开启了深度学习的黄金时代。

为什么是 2012 年?一是数据,之前并没有大规模的数据进行充分的训练,应用于更广泛的任务,现在有 ImageNet;二是计算,之前的硬件条件限制了,无法进行大规模的训练,而现在有了性能强大的 GPU 的加成;三就是 AlexNet 本身很优秀,给后来的网络奠定了一个很好的基础,让大家突然发现,原来还可以这样玩!

AlexNet:2012,ImageNet Classification with Deep Convolutional Neural Networks

ImageNet Top5 错误率:16.4%,而两年前非深度学习的方法的最好错误率是28.2%

AlexNet 总体结构和 LeNet 相似,但是有极大改进:

由五层卷积和三层全连接组成,输入图像为三通道 224x224 大小,网络规模远大于 LeNet使用了 ReLU 激活函数使用了 Dropout,可以作为正则项防止过拟合,提升模型鲁棒性一些很好的训练技巧,包括数据增广、学习率策略、weight decay 等

AlexNet 使用 3GB 显存的 GTX 580 显卡(好古老),一块显卡不够用,所以如上图所示将模型分为两部分放到了两块显卡上并行运算。虽然这仅仅是单块显卡资源有限时的做法,但是后面的许多网络都进一步发扬了这种对卷积进行分组的思想(虽然动机不同)。

VGG:2014,Very deep convolutional networks for large-scale image recognition

在 AlexNet 之后,另一个提升很大的网络是 VGG,ImageNet 上 Top5 错误率减小到 7.3%。

主要改进就是:深,更深!网络层数由 AlexNet 的 8 层增至 16 和 19 层,更深的网络意味着更强大的网络能力,也意味着需要更强大的计算力,还好,硬件发展也很快,显卡运算力也在快速增长,助推深度学习的快速发展。

同时只使用 3x3 的卷积核,因为两个 3x3 的感受野相当于一个 5x5,同时参数量更少,之后的网络都基本遵循这个范式。

GoogLeNet 和 ResNet

一层一层卷积堆叠,VGG 是集大成者,但是之后很难再进一步,继续简单增加网络层数会遇到问题,更深的网络更难训练同时参数量也在不断增长。

Inception v1(GoogLeNet):2015,Going deeper with convolutions

ImageNet Top5 错误率 6.7%

GoogLeNet 则从另一个维度来增加网络能力,每单元有许多层并行计算,让网络更宽了,基本单元如下:

网络总体结构如下所示,包含多个上面的 Inception 模块,并添加了两个辅助分类分支补充梯度更好训练:

通过网络的水平排布,可以用较浅的网络得到很好的模型能力,并进行多特征融合,同时更容易训练,另外,为了减少计算量,使用了 1x1 卷积来先对特征通道进行降维。堆叠 Inception 模块而来就叫 Inception 网络,而 GoogLeNet 就是一个精心设计的性能良好的 Inception 网络(Inception v1)的实例,即GoogLeNet 是 Inception v1 网络的一种。

但是,网络太深无法很好训练的问题还是没有解决,直到 ResNet 提出了 residual connection。

ResNet:2016,Deep residual learning for image recognition

ImageNet Top5 错误率 3.57%

ResNet 通过引入 shortcut 直连来解决这个问题:

通过引入直连,原来需要学习完全的重构映射,从头创建输出,并不容易,而引入直连之后,只需要学习输出和原来输入的差值即可,绝对量变相对量,容易很多,所以叫残差网络。并且,通过引入残差,identity 恒等映射,相当于一个梯度高速通道,可以容易地训练避免梯度消失的问题,所以可以得到很深的网络,网络层数由 GoogLeNet 的 22 层到了ResNet的 152 层。

ResNet-34 的网络结构如下所示:

如果说 LeNet、AlexNet、VGG 奠定了经典神经网络的基础,Inception 和ResNet 则展示了神经网络的新范式,在这两个范式的基础上,发展创新并相互借鉴,有了 Inception 流派的 Inception v2 到 v4、Inception-ResNet v1 和 v2,以及 ResNet 流派的 ResNeXt、DenseNet 和 Xception等。

Inception 流派

Inception 流派,核心就是 Inception 模块,出现了各种变种,包括 Inception v2 到 v4 以及 Inception-ResNet v1 和 v2 等。

Inception v2(BN-Inception):2015,Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

ImageNet Top5 错误率:4.8%

(PS:按照 Inception 系列四篇论文中的第三篇论文的划分,类似于 Inception v3 的一个网络称之为 v2,但是按照第四篇论文的划分,BN-Inception 称之为v2,这里采用第四篇论文的划分,Inception v2 指 BN-Inception)

主要是增加了 Batch Normalization,之前神经网络很依赖于良好的初始化,并且网络太深会梯度弥散,这两个问题都是因为网络中间的激活的分布不理想,那既然我们想要一个理想的分布,就手动把它转换为理想的分布好了。所以在每一层输出后面加上了归一化变换,减去每个训练 batch 的每个特征的均值再除以标准差,得到 0 均值 1 标准差的输出分布,这样,就可以很好地训练了,梯度也不容易弥散。

Inception v3:2015,Rethinking the Inception Architecture for Computer Vision

ImageNet Top5 错误率:3.5%

卷积进一步分解,5x5 用两个 3x3 卷积替换,7x7 用三个 3x3 卷积替换,一个 3x3 卷积核可以进一步用 1x3 的卷积核和 3x1 的卷积核组合来替换,进一步减少计算量:

总体地网络结构如下所示:

Inception v4、Inception-ResNet v1 和 v2:2016,Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning

ImageNet Top5 错误率:3.08%

Inception v1 到 v3,可以看到很明显的人工设计的痕迹,不同卷积核的和网络结构的安排,很特殊,并不知道为什么要这样安排,实验确定的。作者称由于以前受硬件软件的限制,有太多的历史包袱,而现在有了 TensorFlow(论文里怒打一波广告),网络可以按照理想的设计来实现了,于是很规范地设计了一个 Inception v4 网络,类似于 Inception v3,但是没有很多特殊的不一致的设计。

同时,ResNet 的成功,也说明了 residual connection 的有效性,所以为Inception 模块引入了 residual connection,得到 Inception-ResNet v1 和Inception-ResNet-v2,前者规模较小,和 Inception v3 相当,后者规模较大,和 Inception v4 规模相当。residual 结构地 Inception 模块如下所示:

ResNet 流派

ResNet 流派是另一个主流分支,包括 WRN、DenseNet、ResNeXt 以及 Xception 等。

DenseNet:2016,Densely Connected Convolutional Networks

DenseNet 将 residual connection 发挥到极致,每一层输出都直连到后面的所有层,可以更好地复用特征,每一层都比较浅,融合了来自前面所有层的所有特征,并且很容易训练。缺点是显存占用更大并且反向传播计算更复杂一点。网络结构如下所示:

ResNeXt:2017,Aggregated Residual Transformations for Deep Neural Networks

ImageNet Top5 错误率:3.03%

Inception 借鉴 ResNet 得到 Inception-ResNet,而 ResNet 借鉴 Inception 得到了 ResNeXt,对于每一个 ResNet 的每一个基本单元,横向扩展,将输入分为几组,使用相同的变换,进行卷积:

上面左边是 ResNet,右边是 ResNeXt,通过在通道上对输入进行拆分,进行分组卷积,每个卷积核不用扩展到所有通道,可以得到更多更轻量的卷积核,并且,卷积核之间减少了耦合,用相同的计算量,可以得到更高的精度。

Xception:2016,Xception: Deep Learning with Depthwise Separable Convolutions

Xception 则把分组卷积的思想发挥到了极致,每一个通道单独分为一组。利用了 depthwise separable convolution,如下图所示,J 个输入通道,每个通道用一个单独的空间卷积核卷积(比如 3x3),J 个卷积核得到 J 个输出通道,然后再用 K 个卷积核对上一步得到的 J 个输出通道进行 1x1 的普通卷积,得到 K 个最终的输出:

Xception 基于一个假设,水平和竖直方向的空间卷积(比如第一步的 3x3 卷积)和深度方向的通道卷积(比如第二步的 1x1 卷积)可以完全独立进行,这样减少了不同操作间的耦合,可以有效利用计算力。实验证明,相同的计算量,精度有明显的提升。(不过现在对于分组卷积的底层支持还不够好,实际速度并没有理论计算的那么好,需要底层库进行更好的支持)

移动端

除了主流的 ResNet 流派和 Inception 流派不断追求更高的准确率,移动端的应用也是一大方向,比如 SqueezeNet、MobileNet v1 和 v2、ShuffleNet 等。

MobileNet v1:2017,MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

和 Xception 类似,通过 depthwise separable convolution 来减少计算量,设计了一个适用于移动端的,取得性能和效率间很好平衡的一个网络。

MobileNet v2:2018,Inverted Residuals and Linear Bottlenecks: Mobile Networks for Classification, Detection and Segmentation

使用了 ReLU6(即对 ReLU 输出的结果进行 Clip,使得输出的最大值为 6)适配移动设备更好量化,然后提出了一种新的 Inverted Residuals and Linear Bottleneck,即 ResNet 基本结构中间使用了 depthwise 卷积,一个通道一个卷积核,减少计算量,中间的通道数比两头还多(ResNet 像漏斗,MobileNet v2 像柳叶),并且全去掉了最后输出的 ReLU。具体的基本结构如下图右侧所示:

ShuffleNet:2017,ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices

Xception 已经做得很好了,但是 1x1 那里太耗时间了成了计算的瓶颈,那就分组啦较少计算量,但是分组了,组和组之间信息隔离了,那就重排 shuffle 一下,强行让信息流动。具体的网络结构如上图左侧所示。channel shuffle 就是对通道进行重排,将每组卷积的输出分配到下一次卷积的不同的组去:

上图的 a 是没有 shuffle,效果很差,b 和 c 则是等价的有 shuffle 的。ShuffleNet 可以达到和 AlexNet 相同的精度,并且实际速度快 13 倍(理论上快 18 倍)。

SENet

除了上面介绍的久经考验的网络以外,还有各种各样的新的网络,比如 NASNet、SENet、MSDNet 等等。其中,SENet 的 Squeeze-Excitation 模块在普通的卷积(单层卷积或复合卷积)由输入 X 得到输出 U 以后,对 U 的每个通道进行全局平均池化得到通道描述子(Squeeze),再利用两层 FC 得到每个通道的权重值,对 U 按通道进行重新加权得到最终输出(Excitation),这个过程称之为 feature recalibration,通过引入 attention 重新加权,可以得到抑制无效特征,提升有效特征的权重,并很容易地和现有网络结合,提升现有网络性能,而计算量不会增加太多。

SE module 是一个很通用的模块,可以很好地和现有网络集成,提升现有效果。

总结

最后,一个 ImageNet 上的 Top5 准确率总结表如下图,可以看到,ImageNet 上的分类错误率逐年降低,并且已经低于人类的错误率(5.1%)。

有这么多网络,具体的使用中到底选哪个呢?个人的使用参考建议是:

普通网络:推荐 ResNet-50 或 Xception 或 Inception v3

大网络高精度:推荐 ResNeXt-101(64x4d)或 Inception-ResNet v2

移动端小网络:推荐 ShuffleNet 或 MobileNet v2

还可以额外添加 SENet 模块到现有网络,基本都能进一步提高精度,计算量略有增加。另外也可以尝试一下 NASNet。

从LeNet到SENet——卷积神经网络回顾的更多相关文章

  1. LeNet - Python中的卷积神经网络

    本教程将  主要面向代码,  旨在帮助您 深入学习和卷积神经网络.由于这个意图,我  不会花很多时间讨论激活功能,池层或密集/完全连接的层 - 将来会有  很多教程在PyImageSearch博客上将 ...

  2. SIGAI深度学习第八集 卷积神经网络2

    讲授Lenet.Alexnet.VGGNet.GoogLeNet等经典的卷积神经网络.Inception模块.小尺度卷积核.1x1卷积核.使用反卷积实现卷积层可视化等. 大纲: LeNet网络 Ale ...

  3. 经典卷积神经网络(LeNet、AlexNet、VGG、GoogleNet、ResNet)的实现(MXNet版本)

    卷积神经网络(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现. 其中 文章 详解卷 ...

  4. 卷积神经网络的一些经典网络(Lenet,AlexNet,VGG16,ResNet)

    LeNet – 5网络 网络结构为: 输入图像是:32x32x1的灰度图像 卷积核:5x5,stride=1 得到Conv1:28x28x6 池化层:2x2,stride=2 (池化之后再经过激活函数 ...

  5. 卷积神经网络之LeNet

    开局一张图,内容全靠编. 上图引用自 [卷积神经网络-进化史]从LeNet到AlexNet. 目前常用的卷积神经网络 深度学习现在是百花齐放,各种网络结构层出不穷,计划梳理下各个常用的卷积神经网络结构 ...

  6. 深度学习方法(五):卷积神经网络CNN经典模型整理Lenet,Alexnet,Googlenet,VGG,Deep Residual Learning

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术感兴趣的同学加入. 关于卷积神经网络CNN,网络和文献中 ...

  7. 卷积神经网络-进化史】从LeNet到AlexNet

    目录视图 摘要视图 订阅 [置顶] [卷积神经网络-进化史]从LeNet到AlexNet 标签: cnn 卷积神经网络 深度学习 2016年05月17日 23:20:3046038人阅读 评论(4)  ...

  8. TensorFlow+实战Google深度学习框架学习笔记(12)------Mnist识别和卷积神经网络LeNet

    一.卷积神经网络的简述 卷积神经网络将一个图像变窄变长.原本[长和宽较大,高较小]变成[长和宽较小,高增加] 卷积过程需要用到卷积核[二维的滑动窗口][过滤器],每个卷积核由n*m(长*宽)个小格组成 ...

  9. 使用mxnet实现卷积神经网络LeNet

    1.LeNet模型 LeNet是一个早期用来识别手写数字的卷积神经网络,这个名字来源于LeNet论文的第一作者Yann LeCun.LeNet展示了通过梯度下降训练卷积神经网络可以达到手写数字识别在当 ...

随机推荐

  1. Requests: 让 HTTP 服务人类

    requests 2.18.1文档 requests流式post文件 Calling SOAP Web service using requests module of

  2. Mac OS安装git

    mac系统在AppStore里下载最新的Xcode,目前最新版本是Version 8.3.1 (8E1000a), 由于最新版的Xcode里已集成了git,所以下载后可直接在终端使用git了.

  3. 定期批量修改远程服务器root密码

    一.背景 很多时候运维或安全工作人员需要维护大量的服务器,其中就包括判断是否存在root弱口令, 如果服务器数量很多一一修改的话的确是要好花费不少时间精力的.如果通过脚本来实现密码更改, 再做一个定期 ...

  4. Python fabric实践操作

    前面学习了理论,下面该练练手了.两台机器:10.1.6.186.10.1.6.159.fabric部署在10.1.6.186上面. 1  执行一个简单的task任务,显示两台机器的/home/guol ...

  5. cxf 相关问题

    cxf不能将String的参数序列化的问题解决 问题: java.lang.NoSuchMethodError: org.codehaus.jettison.AbstractXMLStreamWrit ...

  6. Mac在Finder中显示/usr、/tmp、/var等隐藏目录

    Finder中默认是不显示/usr./tmp./var等隐藏目录的,通过在终端中输入一下命令来另其显示: #开启 defaults write com.apple.Finder AppleShowAl ...

  7. 【密码学】RSA公钥密码体制

    RSA公钥密码体制是美国麻省理工学院(MIT)的三位科学家Rivest.Shamir.Adleman于1978年提出的,简称RSA公钥秘密系统.实际上,RSA稍后于MH背包公钥密码实用系统,但它的影响 ...

  8. ctrl+z的ascii码是多少?

    今天在使用中移动的模组的时候,发现: 突然把我难住了,ctrl+z要在我的数据包中通过TCP/IP发送,而结束字符肯定是需要我自己加在数据包的末尾的. 故,做如下测试: #include <st ...

  9. linux磁盘 分区 物理卷 卷组 逻辑卷 文件系统加载点操作案例

    转自:truemylife.linux磁盘 分区 物理卷 卷组 逻辑卷 文件系统加载点操作案例 基本概念: 磁盘.分区.物理卷[物理部分] 卷组[中间部分] 逻辑卷.文件系统[虚拟化后可控制部分] 磁 ...

  10. Python开源机器学习框架:Scikit-learn六大功能,安装和运行Scikit-learn

    Python开源机器学习框架:Scikit-learn入门指南. Scikit-learn的六大功能 Scikit-learn的基本功能主要被分为六大部分:分类,回归,聚类,数据降维,模型选择和数据预 ...