从LeNet到SENet——卷积神经网络回顾
从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——卷积神经网络回顾的更多相关文章
- LeNet - Python中的卷积神经网络
本教程将 主要面向代码, 旨在帮助您 深入学习和卷积神经网络.由于这个意图,我 不会花很多时间讨论激活功能,池层或密集/完全连接的层 - 将来会有 很多教程在PyImageSearch博客上将 ...
- SIGAI深度学习第八集 卷积神经网络2
讲授Lenet.Alexnet.VGGNet.GoogLeNet等经典的卷积神经网络.Inception模块.小尺度卷积核.1x1卷积核.使用反卷积实现卷积层可视化等. 大纲: LeNet网络 Ale ...
- 经典卷积神经网络(LeNet、AlexNet、VGG、GoogleNet、ResNet)的实现(MXNet版本)
卷积神经网络(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现. 其中 文章 详解卷 ...
- 卷积神经网络的一些经典网络(Lenet,AlexNet,VGG16,ResNet)
LeNet – 5网络 网络结构为: 输入图像是:32x32x1的灰度图像 卷积核:5x5,stride=1 得到Conv1:28x28x6 池化层:2x2,stride=2 (池化之后再经过激活函数 ...
- 卷积神经网络之LeNet
开局一张图,内容全靠编. 上图引用自 [卷积神经网络-进化史]从LeNet到AlexNet. 目前常用的卷积神经网络 深度学习现在是百花齐放,各种网络结构层出不穷,计划梳理下各个常用的卷积神经网络结构 ...
- 深度学习方法(五):卷积神经网络CNN经典模型整理Lenet,Alexnet,Googlenet,VGG,Deep Residual Learning
欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术感兴趣的同学加入. 关于卷积神经网络CNN,网络和文献中 ...
- 卷积神经网络-进化史】从LeNet到AlexNet
目录视图 摘要视图 订阅 [置顶] [卷积神经网络-进化史]从LeNet到AlexNet 标签: cnn 卷积神经网络 深度学习 2016年05月17日 23:20:3046038人阅读 评论(4) ...
- TensorFlow+实战Google深度学习框架学习笔记(12)------Mnist识别和卷积神经网络LeNet
一.卷积神经网络的简述 卷积神经网络将一个图像变窄变长.原本[长和宽较大,高较小]变成[长和宽较小,高增加] 卷积过程需要用到卷积核[二维的滑动窗口][过滤器],每个卷积核由n*m(长*宽)个小格组成 ...
- 使用mxnet实现卷积神经网络LeNet
1.LeNet模型 LeNet是一个早期用来识别手写数字的卷积神经网络,这个名字来源于LeNet论文的第一作者Yann LeCun.LeNet展示了通过梯度下降训练卷积神经网络可以达到手写数字识别在当 ...
随机推荐
- 【Unity】6.1 Unity中的C#脚本基础知识
分类:Unity.C#.VS2015 创建日期:2016-04-16 一.简介 1.常用的C#数据类型 这里简单介绍用Unity开发游戏时,最常用的一些数据类型. (1)基本类型 int.float. ...
- 微信公众号与APP微信第三方登录账号打通
一个项目同时开发了APP和微信服务号,需要做到APP和微信服务号的账号互通同步,也就是说一个账号在2个地方都可以用,当然这个前提是保证你公司自己的服务器的数据库用的是同一套. 为保证用户数据的唯一性, ...
- gf框架之grpool - 高性能的goroutine池
Go语言中的goroutine虽然相对于系统线程来说比较轻量级,但是在高并发量下的goroutine频繁创建和销毁对于性能损耗以及GC来说压力也不小.充分将goroutine复用,减少goroutin ...
- JDBC 事务和 JTA 事务
Java事务的类型有三种:JDBC事务.JTA(Java Transaction API)事务.容器事务. 常见的容器事务如Spring事务,容器事务主要是J2EE应用服务器提供的,容器事务大多是基于 ...
- 转:Android文件存储路径getFilesDir()与getExternalFilesDir的区别
作为一个开发者,我们经常需要通过缓存一些文件到SD卡中,常见的方式就是,通过: File sdCard = Environment.getExternalStorageDirectory(); 获取S ...
- 每日英语:4G in China: A bigger deal than the iPhone
Forget the breathless coverage of China Mobile offering the iPhone for a moment. Yes, it's huge news ...
- 【C/C++】一道试题,深入理解数组和指针
在x86平台下分析下面的代码输出结果 int main(void) { ] = {, , , }; ); ); printf(], *ptr2); ; } &a+1 首先明确,a是一个具有4个 ...
- 使用ViewPager和Fragment实现滑动导航
ViewPage是android-support-v4.jar包提供的用于页面滑动的库,android-support-v4.jar是google推荐使用的一个类库,在项目中使用之前,你必须其添加到项 ...
- 【TensorFlow】CNN
tf.nn.conv2d 这个函数的功能是:给定4维的input和filter,计算出一个2维的卷积结果.函数的定义为: def conv2d(input, filter, strides, padd ...
- Java操作memcache
[本文出自天外归云的博客园] 准备工作 Java操作memcache需要spymemcache类库的支持,在Eclipse中修改maven项目的pom.xml文件—— 添加仓库: <reposi ...