概述
之前也写博客介绍过轻量化神经网络架构:《集异璧-神经网络结构 5:轻量化神经网络–MobileNet V1、MobileNet V2、ShuffleNet V1、ShuffleNet V2》。
但是那篇文章没有包含SqueezeNet和Xception。这次把这两个网络补上。
SqueezeNet (2017)
SqueezeNet 由伯克利&斯坦福的研究人员合作发表于 ICLR-2017,论文标题:《SqueezeNet:AlexNet-level accuracy with 50x fewer parameters and <0.5MB》
除了网络结构上,作者还对网络进行了压缩。压缩就是另外的话题了,本博客只关注网络结构。
SqueezeNet在论文里对标的是AlexNet,主要是因为准确率也只能跟AlexNet比了,要知道作者写论文的时候inceptionV3已经出来了。作者的主要思路还是减少参数,所以准确率就不苛求了。这篇文章是比较早的一篇精简网络,后来陆续有MobileNet及ShuffleNet出来,SqueezeNet用的人不多了,但是历史参考意义仍在。
queezeNet 的核心在于 Fire module,Fire module 由两层构成,分别是 squeeze 层+expand 层,如下图所示,squeeze 层是一个 1x1 卷积核的卷积层,expand 层是 1x1 和 3x3 卷积核的卷积层,expand 层中,把 1x1 和 3x3 得到的 feature map 进行 concat。
fire 模块有三个可调参数:S1,e1,e3,分别代表卷积核的个数,同时也表示对应输出 feature map 的维数,在文中提出的 SqueezeNet 结构中,e1=e3=4s1。
整体架构就是Fire module的堆叠:
SqueezeNet的标准模型参数为1.25M. 根据论文里的结果,SqueezeNet以AlexNet大约1/50的参数实现了类似的性能。
小结
个人感觉SqueezeNet就是一个精简的inception,1x1压缩和多分支这两点都有体现。然后就是基础模块按照VGG的方式进行‘提拉米苏’式堆叠。
Xception
扯扯Xception的蛋
Xception 的最早版本于2016年10月上传arxiv。文章的核心是Depth-wise Separable Convolution = depthwise convolution + pointwise convolution。
严格来说Xception不是一个轻量化神经网络,只是一种利用深度可分离卷积降低计算量的思路。Xception标准网络的参数比inception v3少一些,效果还更好。所以不应该把Xception和MobileNet放一起比较。
我个人对Xception的第一印象是‘这不就是ReNeXt嘛’,但是翻了下arxiv.org, Xception比ReNeXt还早一个月提交。
所以可以认为Xception是MobileNet和inception v3的综合体吧。MobileNet主要贡献了深度可分离卷积(当然这不是MobileNet原创,之前就有),Xception论文也有引用MobileNet论文。
思路
Inception模块背后的基本假设是卷积神经网络 特征映射中空间相关性和通道相关性是正交(解耦)的,分开的表现会比较好。
inception V3各个分支相当于只在部分通道上进行信息融合,下个inception模块的1x1会在所有通道间进行信息融合。
现在只保留1x1和3x3操作,让每个分支操作一样,得到一个简化的inception模块:
把前面的1x1合并,每个3x3对不同的通道进行操作(变成了组卷积,figure 2):
最后增加3x3分支的个数,使之和输入通道数相等(变成了深度卷积),就有成了一个‘极端’版本的inception,论文称为‘extreme inception’,也就是论文题目Xception的由来。
注意这里实现的卷积核标准的深度可分离卷积还有两点不一样:
- 操作顺序。tensorflow等sdk里实现的深度可分离卷积是先进行空间融合再进行通道融合(1x1),本网络顺序刚好相反,先进行通道融合再进行空间融合。
- 第一层操作后是否存在非线性。标准的深度可分离操作只在最后有一个非线性操作(relu类的激活函数),本网络在1x1和3x3之后都有自己的非线性激活函数。
作者在论文里也说,因为是多个基础单元堆叠的,第一个不同点应该没啥影响。第二个不同点应该是有影响的。
网络结构
不知道是不是不好意思,作者借鉴了restnet的残差通路,只在论文里说了一句。
注意下图中间的模块重复了8次。共36个卷积层。所有的卷积层和可分离卷积层后面都有BN。
简而言之,Xception体系结构是带残差通路的可分离卷积层连接而成的。最后做全局平均加多分类回归层(中间可选全连接层)。
作者的这个子模块我没看太明白,感觉RELU放前面不合理:
我理解为这是一个标准的深度可分离卷积加一个额外的RELU(参考前面和标准深度可分离卷积的第二点不同)。RELU应该是放在深度可分离的两个卷积之间的。RELU画在上面不代表顺序在前面。这是我个人的理解。
测试效果
由于和inception V3类似的参数量,这俩比较可以看出架构的优点来。可以看到,无论是训练速度还是最终效果,Xception都更胜一筹。
还记得前面说的两个和标准深度可分离卷积的不同点吧,关于第二点,作者打了自己的脸,加上一层非线性激活反而更差:
作者在论文里猜测可能是特征空间的深度对非线性的有用性至关重要:对深度很深的特征空间非线性是有用的,对于很浅的那些(比如深度为1的深度可分离卷积)非线性反而是有害的。
展望
作者说深度不同的组卷积可能有更好的效果,但是没有去试。刚好ReNeXt测试了深度为4的组卷积。ReNeXt101在imagenet上的top5错误率是5.3, Xception是5.5, 而Xception在论文里是和ResNet152比较的,暂且认为Xception参数量和ResNet152类似。所以可以认为ReNeXt101以更少的参数实现了比Xception更好的效果。
参考资料
论文: SqueezeNet: AlexNet-level accuracy with 50x fewer parameters
and <0.5MB model size
集异璧-神经网络结构 5:轻量化神经网络–MobileNet V1、MobileNet V2、ShuffleNet V1、ShuffleNet V2
纵览轻量化卷积神经网络:SqueezeNet、MobileNet、ShuffleNet、Xception
论文: Xception: Deep Learning with Depthwise Separable Convolutions