MobileNet v1:https://arxiv.org/abs/1704.04861
keras 代码:https://github.com/keras-team/keras-applications/blob/master/keras_applications/mobilenet.py
MobileNet v1
0. 前言
可分离卷积通常包含两种类型,一种是空间可分离卷积,另一种是深度可分离卷积。而这两种方式都能减小卷积操作的计算量, 空间可分离就是将一个大的卷积核变成两个小的卷积核,比如将一个3×3的核分成一个3×1和一个1×3的核,像Inception系列网络就采用的这种方式:
[ 1 2 3 0 0 0 2 4 6 ] = [ 1 0 2 ] × [ 1 2 3 ] \left[\begin{array}{lll}{1} & {2} & {3} \\ {0} & {0} & {0} \\ {2} & {4} & {6}\end{array}\right]=\left[\begin{array}{l}{1} \\ {0} \\ {2}\end{array}\right] \times\left[\begin{array}{lll}{1} & {2} & {3}\end{array}\right] ⎣⎡102204306⎦⎤=⎣⎡102⎦⎤×[123]
另一种深度可分离卷积则是本文所采用的方式,深度可分离卷积就是将普通卷积拆分成为一个深度卷积和一个逐点卷积。深度卷积对输入每一个通道进行卷积,然后利用逐点的卷积进行升维。
1. 深度可分离卷积
1.1 与普通卷积对比
普通卷积: 输入一个12×12×3的一个输入特征图,经过5×5×3的卷积核卷积得到一个8×8×1的输出特征图。如果此时我们有256个特征图,我们将会得到一个8×8×256的输出特征图。
深度卷积: 将卷积核拆分成为但单通道形式,在不改变输入特征图像的深度的情况下,对每一通道进行卷积操作,这样就得到了和输入特征图通道数一致的输出特征图。如上图:输入12×12×3的特征图,经过5×5×1×3的深度卷积之后,得到了8×8×3的输出特征图。输入个输出的维度是不变的3。
逐点卷积: 由于深度卷积的输出通道和输入通道一样,这样就造成了深度卷积后特征通道太少的问题,所以利用1×1的逐点卷积进行升维, 在深度卷积的过程中,我们得到了8×8×3的输出特征图,我们用256个1×1×3的卷积核对输入特征图进行卷积操作,输出的特征图和标准的卷积操作一样都是8×8×256了。
1.2 深度可分离卷积
标准卷积参数量: 卷积核的尺寸是Dk×Dk×M,一共有N个,所以标准卷积的参数量是:
D K × D K × M × N D_{K} \times D_{K} \times M \times N DK×DK×M×N</