吐槽:为啥简书不支持[TOC]生成目录
深度学习中的各种卷积操作
1、深度学习中的卷积操作
在神经网络中,卷积是一种常见的操作,尤其是在计算机视觉任务当中。卷积操作的目的在于从输入中提取出有用的特征信息(比如在计算机视觉领域可以提取出像素之间的空间位置关系)。卷积核的参数是从网络训练中自动调整的。卷积操作在提取特征基础上,还拥有权重共享和平移不变的特点。
下面是卷积操作当中的一些术语:
kernel size(卷积核大小): 卷积核定义感受野的大小。即卷积操作后的特征图上一个像素与卷积操作之前的哪些像素区域相关。
stride(步长):步长定义了卷积核遍历原始图像时每一步的长度。通常使用的步长为1。
padding(填充): 填充定义了卷积操作之前元素图像边界扩充的大小
Input & output channels(输入或者输出的通道大小): 分别指卷积操作输入图像和输出图像的通道大小。输出的通道大小等于卷积核的数目。

假设输入的图像大小为,其中
为通道数,
为图片高度,
为图片宽度,卷积核大小为
,步长为
,填充为
,则输出的特征图的的大小为:

2、Dilated Convolutions(空洞卷积/扩张卷积)
Dilated Convolutions的好处是在不做pooling损失信息的情况下,加大感受野,比如一个 的卷积核加入1个空洞使其dilation rate为2时这个卷积核所产生的感受野相当于
的卷积核。具体的分析可以参考这个知乎问答。Dilated Convolutions引入了另外一个超参数,称为dilation rate。即在原先的特征图上加入一个个空洞。参考下图。

3、Transposed Convolution(转置卷积/反卷积)
在自编码器以及语义分割领域需要对某些中间特征图进行up-sampling,即一般卷积操作的逆操作。通过一般的卷积操作加上合适的padding就可以实现转置卷积。以下图为例,我们使用转置卷积通过的卷积核(
的padding),最终将一个
的输入转变为
的输出。

为什么这种卷积方式称为转置卷积,转置体现在什么地方。下面举一个例子来对此进行说明。假设输入为,卷积核大小为
,卷积之后得到的输出为
。我们采用另一种方式对卷积操作进行说明,将输入的矩阵展开为
的向量,通过普通的矩阵乘法完成卷积运算,具体情况可以参考下图。

将上图中的sparse matrix C记为(其为卷积核的另一种表现形式),将矩阵
进行转置,利用相同的矩阵乘法就可以实现转置卷积。

4、1
1卷积
卷积指卷积核的大小为
(
为输入图像的通道数),1x1的卷积可以用于改变feature map的通道数(通道数等于卷积核的数量)。

5、Separable Convolutions(可分离卷积)
Separable Convolution可以分为两种卷积类型,分别是spatially separable convolution(空间可分离卷积)和depthwise separable convolution(深度可分离卷积)。
5.1 spatially separable convolution(空间可分离卷积)
spatially separable convolution是一种在2D空间维度上的卷积操作,其将一个卷积操作分成可分离的两个操作来执行。以下图为例,将一个的Sobel kernel分离成
和
两个kernel。

在普通的卷积操作中,的卷积核直接应用在原始图像上。而在spatially separable convolution中先将
的卷积核应用在图像上,随后将
的卷积核应用在图像上。这样卷积核的参数从9个变成了6个,而输出的feature map的大小是相同的。同时这个过程中使用到的乘法操作从81降到了72。


虽然spatially separable convolution可以降低参数的数量,减少运算的次数。但是并不是所有的卷积核都能够分离成两个小卷积核。如果使用这个卷积将会限制整个网络的使用的卷积核参数量,所以在实际过程中很少使用。
5.2 Depthwise Separable Convolutions(深度可分离卷积)
Depthwise Separable Convolutions在深度学习领域更加实用(比如MobileNet和Xception)。深度可分离卷积可以分为两个步骤:depthwise convolutions 和 convolutions。
首先我们先对标准的卷积操作进行回顾。假设有一个输入为的图像,其中3为通道数。128个卷积核的大小为
,则得到输出为
。

深度可分离卷积分为两个步骤,我们先执行第一个步骤depthwise convolution。与标准卷积使用一个的卷积核不同,depthwise convolution使用3个
的卷积核。分别对输入的每个通道分别进行卷积。将会得到
的输出。其中输出的每个通道都对应与输入的每个相应通道。

随后使用128个的卷积核,将上步操作的输出扩充到通道数为128的feature map。

当使用depthwise separable convolution时,使用的参数量从原先的降为
。
6、Grouped Convolution(分组卷积)
Grouped Convolution最早在AlexNet的文章中被介绍。其使用分组卷积的原因是当时当时GPU显存的限制。

在Grouped Convolution中,卷积核被分为不同的组。每组卷积核对原图像中特定深度的通道进行卷积,下面是图例。在图中,存在2个卷积核的组。在每个卷积核的组内,卷积核的深度(通道)是标准卷积的一半,其中橙色的卷积核组对输入的前一半深度的feature map实行卷积,红色的卷积核组对输入的后一半深度的feature map实行卷积。最后将两次卷积产生的输出在通道维度进行堆叠。

7、3D Convolution
之前介绍的都是2D convolution,其中卷积核的深度与输入的通道数相同,执行卷积操作时核的移动分为两个方向分别是图片的height和width。3D 卷积中的卷积核的深度比输入的通道数小。其卷积核向三个方向移动,分别是输入图片的height,width和channel。因此不同与2D 卷积中每个卷积核卷积得到输出是一个2维的数据(1个channel),3D卷积每个卷积核卷积后得到的输出是一个3维的数据。
