主要介绍一下我经常遇见的一些卷积网络和它的一些变种。
基础的卷积网络
我觉得这个经典的动态图片可以很好的理解卷积的过程。图中绿色的大矩阵是我们的输入,黄色的小矩阵是卷积核(kernel,filter),旁边的小矩阵是卷积后的输入,通常称为feature map。
从动态图中,我们可以很明白的看出卷积实际上就是加权叠加。同时,从这个动态图可以很明显的看出,输出的维度小于输入的维度。如果我们需要输出的维度和输入的维度相等,这就需要填充(padding)。
深度卷积
可以看到每一个通道用一个filter卷积之后得到对应一个通道的输出,然后再进行信息的融合。而以往标准的卷积过程如上图所示。
1.1 深度可分离卷积的过程
而应用深度可分离卷积的过程是
- 用16个3×3大小的卷积核(1通道)分别与输入的16通道的数据做卷积(这里使用了16个1通道的卷积核,输入数据的每个通道用1个3×3的卷积核卷积),得到了16个通道的特征图,我们说该步操作是depthwise(逐层)的,在叠加16个特征图之前,
- 接着用32个1×1大小的卷积核(16通道)在这16个特征图进行卷积运算,将16个通道的信息进行融合(用1×1的卷积进行不同通道间的信息融合),我们说该步操作是pointwise(逐像素)的。这样我们可以算出整个过程使用了3×3×16+(1×1×16)×32 =656个参数。
1.2 深度可分离卷积的优点
可以看出运用深度可分离卷积比普通卷积减少了所需要的参数。重要的是深度可分离卷积将以往普通卷积操作同时考虑通道和区域改变成,卷积先只考虑区域,然后再考虑通道。实现了通道和区域的分离。
组卷积
Group convolution 分组卷积,最早在AlexNet中出现,由于当时的硬件资源有限,训练AlexNet时卷积操作不能全部放在同一个GPU处理,因此作者把feature maps分给多个GPU分别进行处理,最后把多个GPU的结果进行融合。
1.1 什么是分组卷积
在说明分组卷积之前我们用一张图来体会一下一般的卷积操作。
从上图可以看出,一般的卷积会对输入数据的整体一起做卷积操作,即输入数据:
;而卷积核大小为
,一共有
个,然后卷积得到的输出数据就是
。这里我们假设输出和输出的分辨率是不变的。主要看这个过程是一气呵成的,这对于存储器的容量提出了更高的要求。
但是分组卷积明显就没有那么多的参数。先用图片直观地感受一下分组卷积的过程。对于上面所说的同样的一个问题,分组卷积就如下图所示。
可以看到,图中将输入数据分成了2组(组数为g),需要注意的是,这种分组只是在深度上进行划分,即某几个通道编为一组,这个具体的数量由
决定。因为输出数据的改变,相应的,卷积核也需要做出同样的改变。即每组中卷积核的深度也就变成了
,而卷积核的大小是不需要改变的,此时每组的卷积核的个数就变成了
个,而不是原来的C2了。然后用每组的卷积核同它们对应组内的输入数据卷积,得到了输出数据以后,再用concatenate的方式组合起来,最终的输出数据的通道仍旧是
。也就是说,分组数
决定以后,那么我们将并行的运算g个相同的卷积过程,每个过程里(每组),输入数据为
,卷积核大小为
,一共有
个,输出数据为
。\
1.2 分组卷积具体的例子
从一个具体的例子来看,Group conv本身就极大地减少了参数。比如当输入通道为256,输出通道也为256,kernel size为3×3,不做Group conv参数为256×3×3×256。实施分组卷积时,若group为8,每个group的input channel和output channel均为32,参数为8×32×3×3×32,是原来的八分之一。而Group conv最后每一组输出的feature maps应该是以concatenate的方式组合。
Alex认为group conv的方式能够增加 filter之间的对角相关性,而且能够减少训练参数,不容易过拟合,这类似于正则的效果。
扩展卷积
空洞卷积(dilated convolution)是针对图像语义分割问题中下采样会降低图像分辨率、丢失信息而提出的一种卷积思路。利用添加空洞扩大感受野,让原本3x3的卷积核,在相同参数量和计算量下拥有5x5(dilated rate =2)或者更大的感受野,从而无需下采样。扩张卷积(dilated convolutions)又名空洞卷积(atrous convolutions),向卷积层引入了一个称为 “扩张率(dilation rate)”的新参数,该参数定义了卷积核处理数据时各值的间距。换句话说,相比原来的标准卷积,扩张卷积(dilated convolution) 多了一个hyper-parameter(超参数)称之为dilation rate(扩张率),指的是kernel各点之前的间隔数量,(正常的convolution 的 dilatation rate为 1)。
1.1图说空洞卷积的概念
( a ) 图对应3x3的1-dilated conv,和普通的卷积操作一样。
( b ) 图对应3x3的2-dilated conv,实际的卷积kernel size还是3x3,但是空洞为1,需要注意的是空洞的位置全填进去0,填入0之后再卷积即可。
( c ) 图是4-dilated conv操作。
在上图中扩张卷积的感受野可以由以下公式计算得到;
其中
表示dilated rate。
比如上图中(a),dilated=1,F(dilated) = 3×3;
图(b)中,dilated=2,F(dilated)=7×7;
图(c)中,dilated=4, F(dilated)=15×15。
dilated=2时具体的操作,即按照下图在空洞位置填入0之后,然后直接卷积就可以了。
上图是一个扩张率为2的3×3卷积核,感受野与5×5的卷积核相同,而且仅需要9个参数。你可以把它想象成一个5×5的卷积核,每隔一行或一列删除一行或一列。
在相同的计算条件下,空洞卷积提供了更大的感受野。空洞卷积经常用在实时图像分割中。当网络层需要较大的感受野,但计算资源有限而无法提高卷积核数量或大小时,可以考虑空洞卷积。
1.2 感受野指数级增长
对于标准卷积核情况,比如用3×3卷积核连续卷积2次,在第3层中得到1个Feature点,那么第3层这个Feature点换算回第1层覆盖了5个Feature点,如图所示。
第一层的一个5×5大小的区域经过2次3×3的标准卷积之后,变成了一个点。也就是说从size上来讲,2层33卷积转换相当于1层55卷积。题外话,从以上图的演化也可以看出,一个5×5的卷积核是可以由2次连续的3×3的卷积代替。
第三层:
第二层:
第一层:
但对于dilated=2,3*3的扩张卷积核来说,感受野增大的速度更加快
第三层:
第二层:
第一层:
可以看到第一层13×13的区域,经过2次3×3的扩张卷积之后,变成了一个点。即从size上来讲,连续2层的3×3空洞卷积转换相当于1层13×13卷积。
反卷积(转置卷积)
转置卷积(transposed Convolutions)又名反卷积(deconvolution)或是分数步长卷积(fractially straced convolutions)。反卷积(Transposed Convolution, Fractionally Strided Convolution or Deconvolution)的概念第一次出现是Zeiler在2010年发表的论文Deconvolutional networks中。
1.1 转置卷积和反卷积的区别
反卷积从字面上理解就是卷积的逆过程,值得注意的反卷积虽然存在,但是在深度学习中并不常用。而转置卷积虽然又名反卷积,却不是真正意义上的反卷积。因为根据反卷积的数学含义,通过反卷积可以将通过卷积的输出信号,完全还原输入信号。而事实是,转置卷积只能还原shape大小,而不能还原value。你可以理解成,至少在数值方面上,转置卷积不能实现卷积操作的逆过程。所以说转置卷积与真正的反卷积有点相似,因为两者产生了相同的空间分辨率。但是又名反卷积(deconvolutions)的这种叫法是不合适的,因为它不符合反卷积的概念。
转置卷积的动态图
卷积核为3×3、步幅为2和无边界扩充的二维转置卷积
需要注意的是,转置前后padding,stride仍然是卷积过程指定的数值,不会改变。
如果不能理解这个反卷积的过程的话,推荐一篇讲解反卷积非常好的博客
最后把有关卷积的动图的连接贴出来git