MobileNets V1 用于移动视觉的高效卷积网络,2017年。
文章目录
Abstract
- 移动端和嵌入式实践意义
- depthwise seperable convolutions 深度可分离卷积,旨在构建轻量级网络
- 2 hyper-parameters allow the model builder to choose the right sized model 两个超参数用于控制模型大小
Introduction
在 AlexNet 横空出世之后,卷积神经网络朝着更大更深的网络结构发展,旨在获取更高的准确度,但此举并不能解决模型大小和运行速度的问题。很多移动端/嵌入式如机器人、自动驾驶和增强现实等识别任务,对实时性要求很高。MobileNets 提供一个高效的卷积神经网络和两个控制模型大小的超参数,旨在构建能与移动端/嵌入式设备很好匹配的轻量、低延迟模型。
Prior Work
此前已有这方面的工作,策略基本是压缩预训练的模型或者直接训练一个较小的模型。MobileNets 提供一系列的网络结构,供开发者根据他们的限定条件来选择特定的适合的网络模型。MobileNets 兼顾模型大小和运行速度。
- depthwise separable convolutions
- flattened networks factorized
- network Xception network
- shrinking、factorizing 或 compressing 预训练模型。Compression 基于量化、哈希、剪枝、向量量化还有霍夫曼编码。
- 蒸馏 distillation 也可以,它使用一个大网络来“教”一个小网络。
- low bit network
MobileNet Architecture
首先介绍深度可分离卷积,然后介绍 MobileNets 的网络结构,包括两个模型 shrinking 超参数:宽度 width 系数和分辨率 resolution 系数。
Depthwise Seperable Convolution
关于这部分,我浏览到的博客等基本都是遵从原论文复述了过程贴了公式。深度级可分离卷积其实是一种可分解卷积操作(factorized convolutions),其可以分解为两个更小的操作:depthwise convolution 和 pointwise convolution。
那如果想更好地理解 深度可分离卷积的操作到底和传统卷积操作有什么区别,怎么就实现了保留功能、减少参数、可以移动端/嵌入式使用呢?我自己的理解如下,表述很随意/(ㄒoㄒ)/~~
如果不考虑 batch 维度,就图像任务而言,有三个维度就是 h, w, c,其中 h 和 w 两个维度相当于图像的高和宽。也就是说再把通道 c 维度去掉的话,那就单独变成 h 和 w 两个维度这个面上的操作。卷积操作在这个图像面用二维卷积提取了特征(其实就是滤波器),相对全连接网络来说具有局部连接、权值共享等优点,参数也少,计算复杂度也低。
但是实际并不是只有这两个维度,还是先不说 batch 维度的话,通道维度是没办法避免的。比如日常生活中见到的,对于很多常见彩色图,都是 rgb 三个通道,深度模型中更是有很多通道。如果分开看每个通道的话,应该都不太一样,但是不同通道同一位置却有着“天生”的关联。
实际传统卷积操作中,如果输入通道是 M(按照本论文的命名),输出通道是 N,那么就应该有 N 个卷积核在 M 个通道的 feature map 上做操作,每个卷积核的大小不再是 ks × ks(咱们就先按照两个方向一样来讲),而是 ks × ks × M。也就是一个卷积核要完成的计算是和 M 个通道的某个局部位置来做卷积。一个卷积核会得到输出通道中的其中一个通道,N 个卷积核就能输出 N 个通道。
这个过程中都有什么呢?第一,在 h × w 那个面上,肯定还是刚刚说的局部连接、权值共享。第二,在通道 M 那个维度上呢?其实是想拿到不同通道同一位置的线性组合,也就是把你照片中 bgr 三个通道中都是鼻子那个位置的一共 3 个特征组合在一起作为“鼻子”的特征。
上面说的这两点东西都是很重要合理的,但是仔细辨别一下,之前一直说的经典/传统卷积,它在 h × w 面上还很高效、参数少,但是在深度/通道那个维度上,是全连接的,也就是在这个深度/通道维度上,是“不高效的”。
其实深度上全连接本身并没有问题,但是因为卷积核四个维度是绑定的,第一部分提取特征的时候得连带着深度上,就扩了 N 倍;第二部分线性组合的时候,本来重点在深度上,却得带着卷积核宽高维度,直接被放大 ks ×ks 倍。MobileNet 就是从打断卷积核维度绑定,把乘法绑定变成加法求和,这个点上出发来给传统卷积瘦身。
上面这些说完以后,再回到论文。论文这部分的论述也都是没考虑 batch 维度的,而且也是为了讨论方便吧,按照 padding=‘same’ 的情况来说的,也就是输入输出在 h w 维度尺寸不变;输入图的宽高相等,卷积核的宽高相等。
- 输入 feature map F,大小 D F × D F × M D_F × D_F × M DF×DF×M,M 个通道
- 输出 feature map G,大小 D F × D F × N D_F × D_F × N DF×DF×N,N 个通道
- (传统卷积)卷积核 K,大小 D K × D K × M × N D_K × D_K × M × N DK×DK×M×N,N 个卷积核,每个的大小是 D K × D K × M D_K × D_K × M DK×DK×M,前面说了, M 通道维度上就是全连接,没有任何参数节省。
那么输出的 feature map G怎么计算来的?
G k , l , n = Σ i , j , m K i , j , m , n ⋅ F k + i − 1 , l + j − 1 , m G_{k, l, n} = \Sigma_{i, j, m}K_{i, j, m, n} \cdot F_{k + i - 1, l + j - 1, m} Gk,l,n=Σi,j,mKi,j,m,n<