前言
继续来总结一下轻量级网络SqueezeNet,Xception。
SqueezeNet
论文:http://arxiv.org/abs/1602.07360
TensorFlow实现:https://github.com/Linchunhui/Classification-Set-with-Tensorflow/blob/master/net/SqueezeNet.py
首先从名字SqueezeNet 就知道,本文的新意是 squeeze,squeeze 在 SqueezeNet 中表示一个 squeeze 层,该层采用 1*1 卷积核对上一层 feature map 进行卷积,主要目的是减少 feature map 的维数(即通道数)。
- 创新点
采用不同于传统的卷积方式,提出 fire module;fire module 包含两部分:squeeze 层+expand 层。
创新点与 inception 系列的思想非常接近!首先 squeeze 层,就是 1x1 卷积,其卷积核数要少于上一层 feature map 数,这个操作从 inception 系列开始就有了,并美其名曰压缩,个人觉得「压缩」更为妥当。
Expand 层分别用 1x1 和 3x3 卷积,然后 concat,这个操作在 inception 系列里面也有。
SqueezeNet 的核心在于 Fire module,Fire module 由两层构成,分别是 squeeze 层+expand 层,如上图 所示,squeeze 层是一个 11 卷积核的卷积层,expand 层是 11 和 33 卷积核的卷积层,expand 层中,把 11 和 3*3 得到的 feature map 进行 concat。
用下图可以更清晰的了解
Fire module 输入的 feature map 为 HxWxM 的,输出的 feature map 为 HxMx(e1+e3),可以看到 feature map 的分辨率是不变的,变的仅是维数,也就是通道数,这一点和 VGG 的思想一致。
首先,HxWxM 的 feature map 经过 Squeeze 层,得到 S1 个 feature map,这里的 S1 均是小于 M 的,以达到压缩的目的,详细思想可参考 Google 的 Inception 系列。
其次,HxWxS1 的特征图输入到 Expand 层,分别经过 1*1 卷积层和 3x3 卷积层进行卷积,再将结果进行 concat,得到 Fire module 的输出,为 HxMx(e1+e3) 的 feature map。
fire 模块有三个可调参数:S1,e1,e3,分别代表卷积核的个数,同时也表示对应输出 feature map 的维数,在文中提出的 SqueezeNet 结构中,e1=e3=4s1。
- 网络结构
主要还好选取了VGG的特点,层层堆叠,当然Firework中也可见inception的思想。
Xception
论文:https://arxiv.org/abs/1610.02357
Tensorflow代码:https://github.com/Linchunhui/Classification-Set-with-Tensorflow/blob/master/net/Xception.py
Xception本身并不算轻量级网络,是根据inception演化而来的。
变化的过程如下
-
在 Inception 中,特征可以通过 1×1 1×11×1 卷积,3×3 3×33×3 卷积,5×5 5×55×5 卷积,pooling 等进行提取,Inception 结构将特征类型的选择留给网络自己训练,也就是将一个输入同时输给几种提取特征方式,然后做 concat 。Inception-v3的结构图如下:
-
对 Inception-v3 进行简化,去除 Inception-v3 中的 avg pool 后,输入的下一步操作就都是 1×1卷积:
-
提取 1×1卷积的公共部分
-
Xception(极致的 Inception):先进行普通卷积操作,再对 1×1 1×11×1 卷积后的每个channel分别进行 3×3 3×33×3 卷积操作,最后将结果 concat
和我们熟知的Depthwise Conv十分相似。 -
区别
- Xception
第一步:普通 1×1 卷积。
第二步:对 1×1卷积结果的每个 channel,分别进行 3×3 卷积操作,并将结果 concat。- Depthwise Conv
第一步:Depthwise 卷积,对输入的每个channel,分别进行 3×3卷积操作,并将结果 concat。
第二步:Pointwise 卷积,对 Depthwise 卷积中的 concat 结果,进行 1×1 卷积操作。
两种操作的循序不一致:Inception 先进行 1×1卷积,再进行 3×3 卷积;DepthwiseConvolution 先进行 3×3卷积,再进行 1×1卷积。(感觉并没有多少区别。)
- 网络结构
整体网络结构如下:
Xception 的结构基于 ResNet,但是将其中的卷积层换成了Separable Convolution(极致的 Inception模块)。如图所示。整个网络被分为了三个部分:Entry,Middle和Exit。