MobileNet v1中 深度可分离卷积(Depthwise Separable Convolution) 是怎么回事

MobileNet v1中 深度可分离卷积(Depthwise Separable Convolution) 是怎么回事

flyfish

深度可分卷积,深度可分离卷积,depthwise separable convolution
相同的意思,不同的名字

卷积是人工神经网络(ANN)中一种非常重要的数学运算。卷积神经网络(CNN)可以用来学习特征。
CNN有很多种类型,其中一类是深度可分离的卷积神经网络。

这些类型的CNN之所以被广泛使用,是因为以下两个原因:
与标准CNN相比,它们需要调整的参数数量更少,这减少了过度拟合。
它们的计算成本更低,因为它们的计算量更少,这使得它们适合于移动端视觉应用。
这些类型的CNN就像MobileNet、Xception(都是由Google提出的)

我们通过普通卷积和深度可分离卷积的计算过程对比,理解深度可分离卷积是如何减少计算量的。

正常卷积运算过程

假设有大小为Df x Df x M的输入数据,其中Df x Df是图像大小,M是通道数(对于RGB图像为3)。
假设有大小为Dk x Dk x M的N个卷积核,如果执行正常的卷积运算,则输出大小将为Dp x Dp x N。
在这里插入图片描述

1次卷积运算中的乘法次数=卷积核大小= D k ∗ D k ∗ M Dk * Dk * M DkDkM
由于有N个卷积核并且每个卷积核垂直和水平滑动 D p Dp Dp次,
乘法总数变为 N ∗ D p ∗ D p ∗ ( 每 次 卷 积 的 乘 法 ) N * Dp * Dp * (每次卷积的乘法) NDpDp()
所以对于正常的卷积运算的乘法总数= N ∗ D p 2 ∗ D k 2 ∗ M N * Dp^2 * Dk^2 * M NDp2Dk2M

深度可分离卷积的计算过程

深度可分离卷积分为深度卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)

1、深度卷积(Depthwise Convolution)

在深度操作中,卷积一次应用于单个通道,而不像标准CNN那样对所有M个通道进行卷积。因此,这里的卷积核的大小为 D k ∗ D k ∗ 1 Dk * Dk *1 DkDk1
假设输入数据中有M个通道,则需要M个这样的过滤器。输出的大小为 D p ∗ D p ∗ M Dp * Dp * M DpDpM
在这里插入图片描述

卷积核在所有M个通道上滑动 D p ∗ D p Dp* Dp DpDp次,
单个卷积运算的计算量是 D k ∗ D k Dk * Dk DkDk
由于卷积核在所有M个通道上滑动 D p ∗ D p Dp*Dp DpDp次,
乘法总数等于 M ∗ D p ∗ D p ∗ D k ∗ D k M * Dp * Dp *Dk * Dk MDpDpDkDk

因此,对于 深度卷积的运算乘法总数= M ∗ D k 2 ∗ D p 2 M*Dk^2 * Dp^2 MDk2Dp2

2、逐点卷积(Pointwise Convolution)

在逐点卷积运算中,在M个通道上应用1×1卷积运算。因此,此操作的卷积核大小将为 1 ∗ 1 ∗ M 1 * 1 * M 11M
假设我们使用N个这样的卷积核,则输出大小为 D p ∗ D p ∗ N Dp * Dp* N DpDpN
在这里插入图片描述

单次卷积运算需要 1 ∗ M 1*M 1M次乘法。
由于卷积核滑动 D p ∗ D p Dp*Dp DpDp次,
乘法总数等于 M ∗ D p ∗ D p ∗ ( 卷 积 核 的 数 量 ) M * Dp * Dp *(卷积核的数量) MDpDp()
因此,对于逐点卷积的运算乘法总数 = M ∗ D p 2 ∗ N =M *Dp^2 * N =MDp2N
深 度 可 分 离 卷 积 总 计 算 量 = M ∗ D k 2 ∗ D p 2 + M ∗ D p 2 ∗ N = M ∗ D p 2 ∗ ( D k 2 + N ) 深度可分离卷积总计算量 = M * Dk^2 * Dp^2 + M * Dp^2 * N = M * Dp^2 * (Dk^2 + N) =MDk2Dp2+MDp2N=MDp2(Dk2+N)

对比

[ d e p t h w i s e ] [ s e p a r a b l e ] [ c o n v o l u t i o n ] [ s t a n d a r d ] [ c o n v o l u t i o n ] = M ∗ D p 2 ∗ ( D k 2 + N ) N ∗ D p 2 ∗ D k 2 ∗ M = 1 / N + 1 / D k 2 \frac{[depthwise][ separable][ convolution]}{[standard ][convolution ]}=\frac{M * Dp^2 * (Dk^2 + N)}{N * Dp^2 * Dk^2 * M} = 1/N + 1/Dk^2 [standard][convolution][depthwise][separable][convolution]=NDp2Dk2MMDp2(Dk2+N)=1/N+1/Dk2

再看两个易于理解的图
普通卷积
在这里插入图片描述
深度可分离卷积
在这里插入图片描述
深度分离就是通道分离各自计算,然后堆叠起来,最后用1×1得到你想输出的通道数

参考

假设
输入是 7 * 7 * 3
输出是 5 * 5 * 128

标准卷积步骤一步就完成
因为 7 * 7 * 3 -》3 * 3 * 3 = 5 * 5 * 1

所以 7 * 7 * 3 -》3 * 3 * 3(128个) = 5 * 5 * 128

深度可分卷积需要经过两步

7 * 7 * 3 -》3 * 3 * 1(3个)= 5 * 5 * 3
5 * 5 * 3 -》1 * 1 * 3(128个)= 5 * 5 * 128

标准卷积计算次数
128个 3 * 3 * 3 移动了 5 * 5 次
128 * (( 3 * 3 * 3 )* ( 5 * 5 ))=128 * 675 =86400

深度可分卷积计算次数
第一步:3 * 3 * 1(3个)移动了 5 * 5 次

第二步:1 * 1 * 3(128个)移动了 5 * 5 次

3 * (( 3 * 3 * 1 ) * ( 5 * 5 )) + 128 * (( 1 * 1 * 3 ) * ( 5 * 5 ))

=675 + 9600 = 10275

此处的计算结果是
标准卷积的计算量 是 深度可分卷积计算量的8.4倍(当前实例)

在《MobileNetV2: Inverted Residuals and Linear Bottlenecks》

论文中已经给他们起了名字
depthwise convolution,pointwise convolution
Depthwise(DW)卷积,Pointwise(PW)卷积

The first layer is called a depthwise convolution, it performs lightweight filtering by applying a single convolutional filter per input channel.

The second layer is a 1 × 1 convolution, called a pointwise convolution, which is responsible for building new features through computing linear combinations of the input channels

在《Xception: Deep Learning with Depthwise Separable Convolutions》这篇论文中也有描述
a depthwise convolution followed by a pointwise convolution

  • 18
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西笑生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值