引言
自2012年AlexNet以来,卷积神经网络(简称CNN)在图像分类、图像分割、目标检测等领域获得广泛应用。随着性能的要求越来越高,AlexNet 已经无法满足大家的需求,于是乎各路大牛纷纷提出性能更优越的 CNN 网络,如VGG、GoogLeNet、ResNet、DenseNet等。由于神经网络的性质,为了获取更好的性能,网络的层数不断增加,从7层 AlexNet 到16层 VGG,再从16层 VGG 到 GoogLeNet 的22层,再从22层 GoogLeNet到152层 ResNet 更有上千层的 ResNet 和 DenseNet。虽然网络的性能得到了提高,但随之而来的就是效率问题。
效率问题主要是 模型的存储问题 和 模型进行预测的速度问题(以下简称为速度问题)。第一,存储问题。数百层网络意味着有着大量的权值参数,保存大量权值参数对设备的内存要求很高;第二,速度问题。在实际应用中,往往是毫秒级别,为了达到实际应用标准,要么提高处理器性能(如优化英特尔处理器或其他处理器),要么就是减少计算量。
只有解决CNN的效率问题,才能使CNN走出实验室,更广泛的应用于移动端。对于效率问题,通常的方法是进行模型压缩(Model Compression),即在已经训练好的模型上进行压缩,使得网络携带更少的网络参数,从而解决内存问题,同时可以解决速度问题。
相比于在已经训练好的模型上进行处理,轻量化模型设计则是另辟蹊径。轻量化模型模型设计,主要思想在于设计更高效的“网络计算方式”(主要针对卷积方式),从而使网络参数减少的同时,不损失网络性能。
本文就近年提出的四个轻量化模型进行学习和对比,四个模型分别是:SqueezeNet、MobileNet、ShuffleNet、Xception。这四种网络模型都不是在训练好的模型上进行压缩,而是在网络结构中的卷积计算上进行优化和改造。
以下是四个模型的作者及发表时间:
网络 | 最早公开日期 |
发表情况 | 作者团队 | arXiv链接 |
---|---|---|---|---|
SqueezeNet | 2016.02 | ICLR-2017 | 伯克利&斯坦福 | https://arxiv.org/abs/1602.07360 |
MobileNet | 2016.04 | CVPR-2017 | https://arxiv.org/abs/1704.04861 | |
ShuffleNet | 2016.06 | N/A | Face++ | https://arxiv.org/abs/1707.01083 |
Xception | 2016.10 | CVPR-2017 | https://arxiv.org/abs/1610.02357 |
SqueezeNet
从命名 SqueezeNet 就知道本文的新意是 Squeeze,squeeze 在 SqueezeNet 中表示一个 squeeze 层,该层采用 1*1 卷积核对上一层 feature map 进行卷积,主要目的是减少 feature map 的维数(维数即通道数,就是将一个立方体的 feature map 切成一片一片的)。
创新点:采用不同于传统的卷积方式,提出 fire module。 fire module 包含两个部分: squeeze层 和 expand 层。首先是 squeeze 层,就是 1*1 卷积,其卷积核数要少于上一层的 feature map 数; expand 层分别用 1*1 和 3*3 卷积,然后concat(通道数相加)。SqueezeNet 的创新点在 inception 中都有,进行了一些列的改变。有需要的话可以参考 inception 的论文。
SqueezeNet 的核心在于 fire module,fire module 由两层构成,分别是 squeeze层 + expand层。如图示:squeeze层是一个 1*1 卷积核的卷积层,expand 层是 1*1 和 3*3 卷积核的卷积层,expand层中把1*1 和 3*3 得到的 feature map 进行 concat。
具体的操作示意图:
Fire module输入的feature map为H*W*M的,输出的feature map为H*M*(e1+e3),可以看到feature map的分辨率是不变的,变的仅是维数,也就是通道数,这一点和VGG的思想一致。
首先,H*W*M的feature map经过Squeeze层,得到S1个feature map