13_各种卷积方式串讲

问题

CNN 从 2012 年的 AlexNet 发展至今,各种网络结构层出不穷,尝试了几乎所有可能性的结构搭配以试图找到效果更好的那种,再通过结果去解释过程,这大概就是做深度学习的人的无奈之处吧,每天都有新论文发出,每天都会有新的网络结果,网络结构如此,卷积 (Convolution) 方式也不例外,各种可能性的卷积过程改变方式都出现了(以后大概还有出现新的卷积方式的),效果各异,特点不同,所以想通过这篇文章将各种卷积方式捋一捋,体会下大牛们的智慧!

符号规定

  • 输入: H i n ∗ W i n ∗ C i n H_{in}*W_{in}*C_{in} HinWinCin ,分别为为输入 feature map 的高, W i n W_{in} Win 为宽, C i n C_{in} Cin 为通道数

  • 输出: H o u t ∗ W o u t ∗ C o u t H_{out}*W_{out}*C_{out} HoutWoutCout ,分别为输出 feature map 的高, W o u t W_{out} Wout 为宽, C o u t C_{out} Cout 为通道数

  • 卷积核: N K K ∗ C k NKK*C_k NKKCk ,其中 N N N为该卷积层的卷积核个数, K K K 为卷积核宽与高(默认相等), C k C_k Ck 为卷积核通道数

这里我们先不考虑卷积步长 stride 和 padding 等,这些只影响输入 feature map 的大小。且假定你已熟悉普通意义下的卷积操作。

1.常规卷积

特点

  • 卷积核通道数与输入 feature map 的通道数相等
  • 输出 feature map 的通道数等于卷积核的个数

卷积过程:卷积核在输入 feature map 中移动,按位点乘后求和即可。
在这里插入图片描述

2. 1×1的卷积

特点

  • 顾名思义,卷积核大小为 1x1
  • 卷积核通道数与输入 feature map 的通道数相等
  • 输出 feature map 的通道数等于卷积核的个数
  • 不改变 feature map 的大小,目的是为了改变 channel 数,即 1x1 卷积的使用场景是:不想改变输入 feature map 的宽高,但想改变它的通道数。即可以用于升维或降维。
  • 计算量及参数量都更小
  • 加入非线性。1*1的卷积在不同 channels 上进行线性整合,在前一层的学习表示上添加了非线性激励( non-linear activation ),提升网络的表达能力;
    在这里插入图片描述
    1x1核的主要目的是应用非线性。在神经网络的每一层之后,我们都可以应用一个激活层。无论是ReLU、PReLU、Sigmoid还是其他,与卷积层不同,激活层是非线性的。非线性层扩展了模型的可能性,这也是通常使“深度”网络优于“宽”网络的原因。为了在不显著增加参数和计算量的情况下增加非线性层的数量,我们可以应用一个1x1内核并在它之后添加一个激活层。这有助于给网络增加一层深度。

3.分组卷积

Group convolution 分组卷积,最早在 AlexNet 中出现,由于当时的硬件资源有限,训练 AlexNet 时卷积操作不能全部放在同一个 GPU 处理,因此作者把 feature maps 分给多个GPU分别进行处理,最后把多个 GPU 的结果进行融合。
卷积过程:将输入 feature map 分成 g 组,一个卷积核也相对应地分成 g 组,在对应的组内做卷积。(我们可以理解成分组卷积中使用的 g 组卷积核整体对应于常规卷积中的一个卷积核,只不过是将常规卷积中的一个卷积核分成了 g 组而已)
在这里插入图片描述
特点

  • 输入的 feature map 尺寸: H i n W i n ∗ C g H_{in}W_{in} *\frac{C_{}}{g} HinWingC ,共有 g 组
  • 卷积核的规格: N K K ∗ C k g NKK*\frac{C_{k}}{g} NKKgCk,共有 N * g 组
  • 输出 feature map 规格: H o u t W o u t N g H_{out}W_{out}Ng HoutWoutNg ,共生成 Ng 个 feature map
  • 用常规卷积得到一个输出 feature map 的计算量和参数量便可以得到 g 个输出 feature map,所以分组卷积常用在轻量型高效网络中,因为它可以用少量的参数量和计算量生成大量的 feature map。

4.可分离卷积

可分离卷积又分成两种:空间可分离卷积深度可分离卷积

空间可分离卷积简单地将卷积核划分为两个较小的卷积核。 最常见的情况是将3x3的卷积核划分为3x1和1x3的卷积核,如下所示:
在这里插入图片描述
在这里插入图片描述
特点

  • 局限性:并不是所有的卷积核都可以“分离”成两个较小的卷积核,能够“分离”的是那些卷积核参数大小的行和列有一定倍数关系的. 这在训练期间变得特别麻烦,因为网络可能采用所有可能的卷积核,它最终只能使用可以分成两个较小卷积核的一小部分。所以实际中用的不多。
  • 参数量和计算量更少:如上图所示,不是用9次乘法进行一次卷积,而是进行两次卷积,每次3次乘法(总共6次),以达到相同的效果。 乘法较少,计算复杂性下降,网络运行速度更快。

5.深度可分离卷积

之所以命名为深度可分离卷积,是因为第一步卷积的时候是通道独立的(后面会看到这种卷积方式分成两步),你可以将每个通道想象成对该图像特定的解释说明(interpret); 例如RGB图像中,“R”通道解释每个像素的“红色”,“B”通道解释每个像素的“蓝色”,“G”通道解释每个像素的“绿色”。 有多少个通道就有多少种解释。

卷积过程:深度可分离卷积的过程分为两部分:深度卷积(depthwise convolution) 和 逐点卷积(pointwise convolution)

  • 深度卷积:深度卷积意在保持输入 feature map 的通道数,即对 feature map 中的每个通道使用一个规格为 K K 1 KK1 KK1 的卷积核进行卷积,于是输入 feature map 有多少个通道就有多少个这样的卷积核,深度卷积结束后得到的输出的通道数与输入的相等。
    在这里插入图片描述

这一步其实就相当于常规卷积中的一个卷积核,只不过不同通道的卷积结果不相加而已,自己体会体会。

  • 逐点卷积:在上一步的基础上,运用 1x1 卷积进行逐点卷积。使用一个 1x1 卷积核就可以得到输出 feature map 一维的结果。

在这里插入图片描述
如果你要输出 feature map 有 256 维,那么就使用 256 个 1x1 卷积核即可。
在这里插入图片描述
特点::可以理解成常规的卷积分成了两步执行,但是分成两步后参数量和计算量大大减少,网络运行更快。

6.转置卷积

转置卷积常常用于 CNN 中对特征图进行上采样,比如语义分割和超分辨率任务中。首先举一个例子,将一个4x4的输入通过3x3的卷积核在进行普通卷积(无padding, stride=1),将得到一个2x2的输出。而转置卷积将一个2x2的输入通过同样3x3大小的卷积核将得到一个4x4的输出,看起来似乎是普通卷积的逆过程。就好像是加法的逆过程是减法,乘法的逆过程是除法一样,人们自然而然的认为这两个操作似乎是一个可逆的过程。但事实上两者并没有什么关系,操作的过程也不是可逆的。

空洞卷积

空洞卷积诞生在图像分割领域,在一般的卷积结构中因为存在 pooling 操作,目的是增大感受野也增加非线性等,但是 pooling 之后特征图的大小减半,而图像分割是 pixelwise 的,因此后续需要 upsamplng 将变小的特征图恢复到原始大小,这里的 upsampling 主要是通过转置卷积完成,但是经过这么多的操作之后会将很多细节丢失,那么空洞卷积就是来解决这个的,既扩大了感受野,又不用 pooling 。

Dilated/Atrous Convolution 或者是 Convolution with holes 从字面上就很好理解,是在标准的 convolution map 里注入空洞,以此来增加感受野。相比原来的正常卷积,空洞多了一个 超参数,称之为 dilation rate 指的是kernel的间隔数量(e.g. 正常的卷积是 dilatation rate 1)。

在VGG网络中就证明了使用小卷积核叠加来取代大卷积核可以起到减少参数同时达到大卷积核同样大小感受野的功效。但是通过叠加小卷积核来扩大感受野只能线性增长,公式为 ( k e r n e l S i z e − 1 ) ∗ l a y e r s + 1 (kernelSize - 1)*layers+1 (kernelSize1)layers+1,,也就是线性增长,而空洞卷积可以以指数级增长感受野。

先来感受下空洞卷积和常规卷积的不同之处:Dilated Convolution with a 3 x 3 kernel and dilation rate 2
在这里插入图片描述
要理解空洞概念和如何操作可以从两个角度去看:

  • 从原图角度,所谓空洞就是在原图上做采样。采样的频率是根据rate参数来设置的,当rate为1时候,就是原图不丢失任何信息采样,此时卷积操作就是标准的卷积操作,当rate>1,比如2的时候,就是在原图上每隔一(rate-1)个像素采样,如图b,可以把红色的点想象成在原图上的采样点,然后将采样后的图像与kernel做卷积,这样做其实变相增大了感受野。
  • 从kernel角度去看空洞的话就是扩大kernel的尺寸,在kernel中,相邻点之间插入rate-1个零,然后将扩大的kernel和原图做卷积 ,这样还是增大了感受野。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值