神经网络的几种卷积方式
在《 详解卷积神经网络 》已经初步的讲解了一个卷积层应该包含的参数、隐含的层等等信息;由于神经网络的发展是由一个比较长久的历史,因此其卷积计算的算子也相对应的演变。下面简单的介绍几种常用的卷积方式:
0、标准卷积(Standard Convolution)
假设有一个3×3大小的卷积层,其输入通道为16、输出通道为32。则一般的操作就是用32个3×3的卷积核来分别同输入数据卷积,这样每个卷积核需要3×3×16个参数,得到的输出是只有一个通道的数据。之所以会得到一通道的数据,是因为刚开始3×3×16的卷积核的每个通道会在输入数据的每个对应通道上做卷积,然后叠加每一个通道对应位置的值,使之变成了单通道,那么32个卷积核一共需要(3×3×16)×32 =4068个参数。
1、深度可分离卷积(DepthWise Convolution)
深度可分离卷积(DepthWise Convolution)是在标准卷积的基础上,提出来的一种新的卷积思路。对于不同的channel采取不同的卷积核进行卷积运算,将标准卷积分为两个卷积过程:Depthwise Convolution 和 Pointwise Convolution。
1.1 深度可分离卷积的过程
假设有 N ∗ H ∗ W ∗ C N*H*W*C N∗H∗W∗C的输入,同时有 k k k个 3 ∗ 3 3*3 3∗3的卷积。若设 p a d = 1 , s t r i d e = 1 pad=1,stride=1 pad=1,stride=1,那么标准卷积的输出为 N ∗ H ∗ W ∗ k N*H*W*k N∗H∗W∗k。同样的深度可分离卷积的最终输出也是 N ∗ H ∗ W ∗ k N*H*W*k N∗H∗W∗k,但是它是经过两步完成的,如下所示:
- Depthwise Convolution:将输入数据分为 g r o u p = C group=C group=C组,然后每一株都用一个 3 ∗ 3 3*3 3∗3的kernel做卷积运算。这样就会得到每一个channel的空间特征,其输出为 N ∗ H ∗ W ∗ C N*H*W*C N∗H∗W∗C。
- Pointwise Convolution:将Depthwise Convolution的输出作为Pointwise Convolution的输入数据,然后做 k k k个标准的 1 ∗ 1 1*1 1∗1 卷积运算。这样就收集到了每个点的特征,其输出为 N ∗ H ∗ W ∗ k N*H*W*k N∗H∗W∗k。
1.2 深度可分离卷积的优点
-
参数量降低,假设输入通道为3,要求输出通道数为256,则:
- 标准卷积: 3 ∗ 3 ∗ 3 ∗ 256 = 6912 3*3*3*256=6912 3∗3∗3∗256=6912;
- 深度可分离卷积: 3 ∗ 3 ∗ 3 + 3 ∗ 1 ∗ 1 ∗ 256 = 795 3*3*3+3*1*1*256=795 3∗3∗3+3∗1∗1∗256=795; -
乘法运算次数降低;
- 标准卷积: H ∗ W ∗ C ∗ k ∗ 3 ∗ 3 H*W*C*k*3*3 H∗W∗C∗k∗3∗3;
- 标准卷积: H ∗ W ∗ C ∗ 3 ∗ 3 + H ∗ W ∗ C ∗ k H*W*C*3*3 + H*W*C*k H∗W∗C∗3∗3+H∗W∗C∗k;
它们的计算次数比 S C D w + P w = H ∗ W ∗ C ∗ k ∗ 3 ∗ 3 H ∗ W ∗ C ∗ 3 ∗ 3 + H ∗ W ∗ C ∗ k = k ∗ 3 ∗ 3 k + 3 ∗ 3 \frac {SC}{Dw+Pw}=\frac {H*W*C*k*3*3}{H*W*C*3*3 + H*W*C*k}=\frac{k*3*3}{k + 3*3} Dw+PwSC=H∗W∗C∗3∗3+H∗W∗C∗kH∗W∗C∗k∗3∗3=k+3∗3k∗3∗3 -
在参数量和计算次数降低的同时,在做深度可分离卷积计算的时耗上会有所降低;
-
深度可分离卷积是先考虑区域,再考虑通道的,实现了通道区域分离。
2、组卷积(Group convolution)
组卷积,是最早在AlexNet中出现,由于当时的硬件资源有限,训练AlexNet时卷积操作不能全部放在同一个GPU处理,因此作者把feature maps分给多个GPU分别进行处理,最后把多个GPU的结果进行融合。
2.1 分组卷积特性
上两幅图分别代表的是不同的卷积方式,第一张代表的是标准卷积,第二张代表的组卷积。假设两种卷积方式的输入均为 H ∗ W ∗ c i H*W*c_i H∗W∗ci;那么分析如下:
- 标准卷积:若卷积核为 h i ∗ w i ∗ c 1 h_i*w_i*c_1 hi∗wi∗c1,输出的特征图尺寸为 H ∗ W ∗ c 2 H*W*c_2 H∗W∗c2,那么标准卷积的参数量为 H ∗ W ∗ c 1 ∗ c 2 H*W*c_1*c_2 H∗W∗c1∗c2。
- 组卷积:假设将feature map按照通道分为g组,则每组输入feature map为
H
∗
W
∗
(
c
1
g
)
H * W * (\frac {c_1}{g})
H∗W∗(gc1),则对应的卷积核为
h
1
∗
w
1
∗
(
c
1
g
)
h_1 * w_1 * (\frac {c_1}{g})
h1∗w1∗(gc1),每组输出的尺寸为
H
∗
W
∗
(
c
2
g
)
H * W * (\frac {c_2}{g})
H∗W∗(gc2),然后将每组输出的feature map进行拼接,将得到最终输出
H
∗
W
∗
c
2
H*W*c_2
H∗W∗c2,它的参数量为:
h
1
∗
w
1
∗
(
c
1
g
)
∗
(
c
2
g
)
=
h
1
∗
w
1
∗
c
1
∗
c
2
∗
(
1
g
)
h_1 * w_1 * (\frac {c_1}{g})*(\frac {c_2}{g}) = h_1 * w_1 * c_1 * c_2 * (\frac{1}{g})
h1∗w1∗(gc1)∗(gc2)=h1∗w1∗c1∗c2∗(g1)。
总结:通过对比上文计算出标准卷积和组卷积的参数数量,可以得知,组卷积的参数数量是吧标准卷积的 1 g \frac{1}{g} g1。
2.2 组卷积具体的例子
从一个具体的例子来看,Group conv本身就极大地减少了参数。比如当输入通道为256,输出通道也为256,kernel size为3×3,标准卷积的参数为256×3×3×256。做组卷积时,若group为8,每个group的input channel和output channel均为32,参数为8×32×3×3×32,是原来的八分之一。而组卷积最后将每一组输出feature maps进行拼接,得到最终输出。
Alex认为组卷积能够增加 filter之间的对角相关性,而且能够减少训练参数,不容易过拟合,这类似于正则的效果。
3、扩展卷积(Dilated Convolution)
3.1 概念
扩展卷积(Dilated Convolution)又名又名空洞卷积(atrous convolutions,是在ICLR 2016提出的,且是针对图像语义分割问题中下采样会降低图像分辨率、丢失信息而提出的一种卷积思路。它的特点是在不增加参数和模型复杂度的条件下,可以指数倍的扩大视觉野(每一个输出是由视觉野大小的输入所决定的)。相比与原来的标准卷积,扩展卷积(Dilated Convolution)多了一个超参数(hyper-parameter),及扩展率(dilation rate),指的是kernel各点在之间的间隔数量(通常默认为1)。
从下图中可以看出这一效果。蓝色的矩形表示视觉野。红色的小点表示kernel。在图a中,kernel是33,视觉野是33,dilated=1;在图b中,kernel是33,但是视觉野是77,dilated=2;在图c中,kernel是33,但是视觉野是1515,dilated=4. 可以看出在dilated(扩展系数)扩大时,视觉野同样扩大。
3.2 动态过程
在二维图像上直观地感受一下扩张卷积的过程:
上图是一个扩张率为2的3×3卷积核,感受野与5×5的卷积核相同,而且仅需要9个参数。你可以把它想象成一个5×5的卷积核,每隔一行或一列删除一行或一列。
在相同的计算条件下,空洞卷积提供了更大的感受野。空洞卷积经常用在实时图像分割中。当网络层需要较大的感受野,但计算资源有限而无法提高卷积核数量或大小时,可以考虑空洞卷积。
4、反卷积(Deconvolution)
反卷积(Deconvolution)又名转置卷积(transposed Convolutions)或是分数步长卷积(fractially straced convolutions)。反卷积的概念第一次出现是Zeiler在2010年发表的论文Deconvolutional networks中。随着反卷积在神经网络可视化上的成功应用,其应用场景越来越多,例如:场景分割、生成模型等。
4.1 卷积和反卷积的关系
卷积的前向传播过程是反卷积的反向传播过程,卷积的反向传播过程是反卷积的前向传播过程。因为卷积的前向反向分别乘 C C C和 C T C^T CT,而反卷积的前向反向分别乘 C T C^T CT和 ( C T ) T (C^T)^T (CT)T;故卷积和反卷积的前向和反向传播正好交换过来。
4.2 转置卷积的动态图
△卷积核为3×3、步幅为2和无边界扩充的二维转置卷积
需要注意的是,转置前后padding,stride仍然是卷积过程指定的数值,不会改变。
例子:由于上面只是理论的说明了转置卷积的目的,而并没有说明如何由卷积之后的输出重建输入。下面我们通过一个例子来说明感受下。
比如有输入数据:3×3,Reshape之后,为A :1×9,B(可以理解为滤波器):9×4(Toeplitz matrix) 那么AB=C:1×4;Reshape C=2×2。所以,通过B 卷积,我们从输入数据由shape=3×3变成了shape=2×2。反过来。当我们把卷积的结果拿来做输入,此时A:2×2,reshape之后为1×4,B的转置为4×9,那么AB=C=1×9,注意此时求得的C,我们就认为它是卷积之前的输入了,虽然存在偏差。然后reshape为3×3。所以,通过B的转置 - “反卷积”,我们从卷积结果shape=2×2得到了shape=3×3,重建了分辨率。
也就是输入feature map A=[3,3]经过了卷积B=[2,2] 输出为 [2,2] ,其中padding=0,stride=1,反卷积(转置卷积)则是输入feature map A=[2,2],经过了反卷积滤波B=[2,2].输出为[3,3]。其中padding=0,stride=1不变。那么[2,2]的卷积核(滤波器)是怎么转化为[4,9]或者[9,4]的呢?通过Toeplitz matrix。