前言
卷积神经网络是计算机视觉领域常用的网络之一,今天归纳一下卷积神经网络中有各种类型的卷积层。
1D 卷积(时序卷积)
1D卷积主要用于只有一个维度的时序数据提取特征(图片是2个维度的)。假设现在1D 卷积的输入shape为
,
表示有
个连续的时序数据,每个时序数据有
个特征。1D 卷积的卷积核只需要指定一个维度,卷积核的深度自动根据输入层深度一致。1D 卷积的卷积核大小为
,表示卷积核覆盖
个连续的时序数据。假设卷积核数量为
,padding类型为"same" (padding只针对时序维度),步长为1,则每个卷积核对输入层1D卷积后可得到一个长度为
的向量,
个卷积核就可以得到
个长度为
的向量,所以最终输出层shape为
。1D卷积示意图,这里没有画出输入层和卷积核的深度信息
卷积的本质是乘加运算,假设卷积核每个位置权重为
,对应卷积区域每个位置值为
,每个卷积区域卷积后输出值为
,
为偏移量。则1D卷积的计算公式如下:
2D卷积
2D卷积是我们常用的卷积形式。2D卷积的卷积核需要指定两个维度,卷积核的深度自动与输入层的深度一致。假设2D卷积输入shape为
,2D卷积核大小为
,卷积核数量为
,padding类型为"same", 步长为1,则输出特征图shape为
。2D卷积示意图,这里没有画出输入层和卷积核的深度信息2D卷积示意图
假设卷积核每个位置权重为
,对应卷积区域每个位置值为
,每个卷积区域卷积后输出值为
,
为偏移量。则2D卷积的计算公式如下:
3D卷积
3D卷积常用于视频处理和立体图像处理。3D卷积的卷积核需要指定三个维度,卷积核的第四个维度(深度维度)自动与输入层深度一致。以视频输入为例,假设3D卷积输入shape为
,其中
为时间维度表示连续的
帧图像,
为深度维度(例如彩色图就是3通道,灰度图为1通道)。假设3D卷积核大小为
,
对应时间维度。假设卷积核数量为
,padding类型为"same", 步长为1,则输出特征图shape为
。
借用一位网友的示意图:3D卷积示意图
padding
常用的padding方式用两种:"valid"
"same"
"valid" 方式就是不padding,并且丢弃右侧(下侧)多余的列(行)。
"same"方式尽可能的均匀的左右(上下)padding,但是如果要添加的列的数量是奇数,"same"方式会将额外的列添加到右侧(下侧)。
假设输入特征图shape为
,卷积核shape为
,卷积步长为
,输出特征图shape为
。
则"valid"方式输出特征图shape为:(ceil是向上取整)
,
"same"方式输出特征图shape为:
下面举例说明这两种padding方式,假设输入数据shape是1维的,数据长度为13,卷积核大小为6,卷积步长为5。采用0-padding。
"valid"方式:
inputs: 1 2 3 4 5 6 7 8 9 10 11 (12 13)
|________________| dropped
|_________________|
"same"方式:
pad| |pad
inputs: 0 |1 2 3 4 5 6 7 8 9 10 11 12 13|0 0
|________________|
|_________________|
|________________|
深度可分离卷积(SeparableConv)
深度可分离卷积可以减少模型的参数,缩小模型的体积,减小模型计算量。
深度可分离卷积将传统的卷积分解为一个深度卷积(depthwise convolution)和 一个 1×1的卷积(pointwise convolution)。
假设网络的某一层的输入特征图大小为
,输出特征图大小为
固定卷积核大小为
。
若使用标准卷积实现,需要使用
个
的卷积核,该层的参数量为
,该层的计算量为
。
若使用深度可分离卷积,先对输入特征图每个通道使用单独的
的卷积核卷积,共使用了
个
的卷积核,然后将得到的
个
的特征图按通道堆叠在一起得到
的特征图。接着使用
个
的卷积核对上一步的结果卷积得到
的特征图。
深度可分离卷积的参数量为
,
深度可分离卷积的计算量为
。
参数量占比:
计算量占比:
一般神经网络中
较大,
取3就可以达到接近9倍的参数和计算量缩减。深度可分离卷积示意图
在使用SeparableConv过程中还可以使Depthwise步骤中每个单独通道卷积输出多个通道,相应的模型参数量和计算量也会增加。
DepthwiseConv
只进行SeparableConv(深度可分离卷积)中的DepthwiseConv步骤。
转置卷积(反卷积)
我们把从低分辨率特征图(小尺寸)到高分辨率特征图(大尺寸)称为上采样,上采样有两种方式:各种插值方法
转置卷积(反卷积)
差值的方法太过固定,我们希望让网络自动学习上采样的方式,所以我们使用转置卷积。
先讨论步长为1,不做padding的情况,即'valid'。
假设现在有一个
的输入矩阵,
的卷积核,不做padding,步长为1,则输出矩阵为
。卷积示意图
卷积运算实现的是多对一关系,在上图中输入矩阵的9个值对应输出矩阵的1个值,并且这种对应关系是一种位置对应关系(例如左上角对应左上角)。卷积可以通过通过矩阵乘法的方式实现的。我们的目标是从输入的16个值得到输出的4个值。首先将
的输入矩阵拉平成
的向量。
然后将
的卷积核用填充0的方式重排列成
的矩阵。
则有:
再将得到的
矩阵reshape成
矩阵就是我们输出矩阵结果。
那么如何使用矩阵乘法实现
的输入矩阵到
的输出矩阵变化呢。
我们从16个输入值得到4个输出值使用的是
的矩阵,1个输出值对应9个输入值决定。
那我们从4个输入值到16个输出值需要
的矩阵,1个输入值对应9个输出值。转置卷积示意图padding为'valid',strider为1的转置卷积(实际上外围是有填充0的)
这就是转置卷积的由来。我们将上面的
矩阵转置后与拉平的输入
矩阵相乘就可以得到输出的
矩阵。如下所示:转置卷积的矩阵乘法
大家注意看转置卷积示意图和转置卷积的矩阵乘法中对应关系,转置卷积示意图灰色区域表示0-padding。比如在转置卷积示意图中
只与
相关(去掉0项),在矩阵乘法中
也只与
相关(去掉0项)。同理类推其他项也符合,虽然转置卷积示意图中每个输出由9个乘加得到,转置卷积的矩阵乘法每个输出由4个乘加得到。
然后我们将得到的
矩阵reshape成
矩阵。这里值得注意的是转置矩阵中的权值是由网络学习得到的,而不是直接使用的原来未转置矩阵中的权值。
值得注意的是,在一些深度学习网络的开源框架中并不是通过这种这个转换方法来计算卷积的,因为这个转换会存在很多无用的0乘操作,Caffe中具体实现卷积计算的方法可参考Implementing convolution as a matrix multiplication。
上面讨论的是没有padding(尽管上面的转置卷积有补0,但这种情况称为'valid'),卷积步长等于1的情况。那么有padding,卷积步长大于1又怎么计算呢?例如下图的两种输入尺寸的正常卷积后输出尺寸都为
,那么
的输入特征图,padding为1,以步长为2的转置卷积后输出尺寸到底是
还是
呢。输入特征图为5,步长为2的卷积输入特征图为6,步长为2的卷积
首先看看步长大于1的情况怎么做,转置卷积时候也被叫做小数步长的卷积。对于步长 s>1的卷积,其对应的转置卷积步长 s′<1。步长大于1卷积对应的转置卷积在计算时,在其输入特征单元之间插入strider-1个0,插入0后把其看出是新的特征输入,然后此时步长 s′ 不再是小数而是为1,后面转置卷积按步长为1处理即可。padding为&#39;valid&#39;,步长为2的转置卷积padding为&#39;same&#39;,步长为2的转置卷积,没有output_paddingpadding为&#39;same&#39;,步长为1的转置卷积
对于转置卷积输出尺寸不确定问题,我们用output_padding参数来控制。
padding就是对输入特征图常规意义的padding,例如'same'模式常取
,output_padding是转置卷积完成后在输出特征图上增加的padding,已达到控制输出特征图形状的目的。一般情况下output_padding=strider-1。
转置卷积输入特征图和输出特征图尺寸大小关系为:
在上例中,对于输入特征图为
,步长为2,卷积核为
,padding为'same'方式,即
。若output_padding取strider-1=1,则输出特征图尺寸为
,刚好是输入特征图的strider倍。若output_padding取0,则输出特征图尺寸为
。padding为&#39;same&#39;,步长为2的转置卷积,output_padding=1
空洞卷积(膨胀卷积)
空洞卷积在不改变参数数量的情况下增大了卷积核的感受野。可以用来捕获多尺度信息。
空洞卷积有两种实现方式,第一,卷积核填充0,第二,输入等间隔采样。
空洞卷积的卷积核的间隔数量称为膨胀率(dilation rate)。空洞卷积示意图
可形变卷积
可形变卷积是在标准卷积的基础上增加一个分支学习卷积核的位置偏移权重,从而得到不规则形状的卷积核。可形变卷积在提取不规则形状目标的特征很管用。
总结
卷积层的特点是局部感知,参数共享,多层卷积,多核卷积。