【深度视觉】第五章:卷积网络的重要概念及花式卷积

七、卷积网络的重要概念及花式卷积操作

本部分是重点讲一些卷积层的特点、相关概念、以及一些花式的卷积操作方法。属于查漏补缺,或者是点对点的补充吧。

首先再明确一些概念和操作流程:

  • 任何神经网络中,一个神经元都只能存储一个数字。
  • 卷积神经网络的神经元就是特征图上的每个数字,就是特征图上几乘几矩阵里的每个数字,这些数字我们也称“像素”, 一个数字就是一个神经元。下一个卷积层生成的特征图feature map上的每个神经元都不是和上层神经元全连接的,都只是和它对应的感受野里面的神经元连接的。
  • 在计算机视觉中说“降维”,往往是减少一张图上的像素量。
  • 卷积核尺寸一般用3*3
  • 类似DNN,CNN每层后面都跟一个激活层,而且我们一般不把激活层列出来,一般都是在那个层里的神经元里面直接处理了。CNN也是经过卷积操作后,生成的特征图的每个神经元要再经过激活函数变换。只是因为激活层是没有要训练的参数,所以一般我们不列出这个层。
  • CNN的输入和输出是特征图,而且层与层之间的传递是通过扫描核扫描的,所以输出的特征图的尺寸是随着网络的加深是逐渐减小的。所以如果输入特征图的尺寸和扫描核的尺寸以及步长、padding这些搭配不好的话,就会导致网络深度受到限制,网络深度不深就说明提取的特征不够充分。
  • 池化核的移动也有步长stride,但默认步长就等于它的核尺寸,这样可以保证它在扫描特征图时不出现重叠。当然,如果需要,我们也可以设置参数令池化核的移动步长不等于核尺寸,这叫“Overlapping Pooling”,重叠池化,但我们一般不会重叠池化,原因我们前面说过很多遍,因为池化就相当于统计,你重复统计就是瞎统计,没有意义,还捣乱。
  • 池化核一般都设置为2X2或3X3。使用(2,2)结构的池化层会将featrue map的行列都减半,将整个feature map的像素数减少3/4,因此它是非常有效的降维方法。

1、局部连接、参数共享
卷积神经网络的两大核心思想:局部连接(Local Connectivity)、参数共享(Parameter Sharing),两者共同的一个关键作用就是减少模型的参数量,使运算更加简洁高效,能够运行在超大规模数据集上。

下图展示了全连接网络中一个神经元的参数量。不进行局部连接,每个神经元和每一个输入像素连接,参数量动辄千万级别,网络很难训练:
【深度视觉】第五章:卷积网络的重要概念及花式卷积_第1张图片
这种就是DNN的运行机制,这种情况参数巨量,无法训练。所以CNN中的卷积操作就是局部连接,避免了全连接中参数过多而造成无法计算的情况。 同时,上一个卷积层的数据和下一个卷积层的数据之间不是像DNN那样的全链接,而是上一层的部分信息和下一层的部分信息相关,因为下一层的信息是通过卷积核和上一层对应的感受野做点积传递到下一层的一个点上的。或者说,就是下一层的特征图上的某个数字只和它上一层特征图的对应位置的感受野范围内的数字相关,和上一层特征图其他位置的数值无关,所以是局部连接。也所以感受野这个概念也是深度视觉中的一个重要概念,后面我们会单独讲这个概念,但你得知道是因为局部连接才有感受野这个概念的。

参数共享的意思就是:我们做卷积操作生成一张feature map时,是前面所有通道图都使用同一组卷积核组卷积而来的。不管你的图像是几乘几的尺寸、不管你有多少张这样的图像,这些张图像在用卷积核进行扫描提取特征的时候,参数都是卷积核尺寸里的几个参数乘以图像的张数,这么多个参数。或者说,就是一张图像中的所有数据(神经元)都共同用一个相同的卷积核进行扫描,所以是参数共享,而且也使参数量骤减。

这两个概念很容易理解,尤其是对卷积操作非常熟悉的同学,就没有太多需要解释的。主要是你知道后,你再读其他人写的东西时,你就很容易知道他在说什么,很多概念大家都没有一个统一的叫法,有的人还叫稀疏交互sparse interaction,这些都是一个东西。

2、感受野 receptive field
在计算机视觉任务中,感受野这个概念非常重要,本部分详细聊聊感受野。
感受野:CNN中某一feature对应(看)着的输入空间中的区域(即:输入图片的像素区域,这些像素参与了该feature的计算)被称为该feature的感受野。 这是我到网上找的一个概念,读着有点蹩脚,其实通俗理解就是:原图->卷积->卷积->池化等一番操作下来->生成了一张特征图。现在问生成的特征图上的某一个像素值,它是由原图中哪些像素点计算而来的?原图中参与计算的那些像素点组成的区域就是感受野。
如果没有特别说明,我们说的感受野都指的是一直映射到原始图像上的感受野。

下图中假设原始图像是26x26的尺寸,这里画的是一个截面图,你把它想象成一个面。
第一个卷积层的卷积操作是:3x3卷积核、padding=1、步长=1进行卷积。如此操作三个卷积层,然后进行maxpool,maxpool是2x2的卷积核,步长为2的非重叠池化,最后再是一次卷积操作。
下图是展示上面4次卷积+1次maxpool整个过程中,最后一张特征图的像素点对应到原图中的感受野范围。其中绿色背景的就是这个网络生成的特征图的感受野:【深度视觉】第五章:卷积网络的重要概念及花式卷积_第2张图片

从上图可见:
(1)特征图第8个像素点是原图第10-21个像素点计算而来,而且是越靠中间的像素点参数计算的次数越多,越靠两边的像素点参数计算的次数越少。
(2)也就是说,上图这个网络生成的特征图的感受野就是12。就是特征图每个像素看到的是原图中的12个像素点。局部链接、稀疏交互嘛。
(3)上图中还画了粉色背景和蓝色背景的,分别表示第一个生成的feature map的第一个像素和最后一个像素对应的感受野。单独把这两个点拿出来是因为这两个点的感受野虽然也是12,但它们两个像素的12个感受野中有5个点是无中生有的点,就是padding和池化出来的点。由此也可以推断出最后生成的特征图它其实看到的是有一层厚厚黑边的原图!

随着网络深度的加深,feature map上的神经元对应的感受野会越来越大,这意味着feature map神经元上携带的原始数据的信息也越来越多。由于卷积网络是稀疏交互的,所以在被输入到FC层之前的神经元的感受野越大越好,因为越大表示携带更大范围内的信息。理论研究也表明,一个表现优异的模型在FC层前的感受野一定是非常大的,巨大的感受野是模型表现好的必要条件。

我们通常认为,较大的感受野意味着较好的效果,但稍微增加一些感受野的尺寸,并不能对整个模型的分类效果带来巨大的改变。但是对于像素级别的密集预测任务,就是像素级别的预测任务,就是需要给原始图像中的每个像素点进行分类,比如语义分割任务、语音处理中的立体声和光流估计任务等,FC层之前的感受野的大小至关重要。就是进入FC层前的每个神经元的感受野至少都是需要和原始图像一样大的区域才行,因为它至少也要携带和原始图像一样大的信息,才能判断它自己应该是属于哪个类别。

  • 感受野尺寸的计算

上面的公式是基于输入架构的图像尺寸是正方形、卷积核的尺寸也是正方形,对于第l个卷积层/池化层输出的特征图,任意一个神经元的感受野大小的公式。
rl是本层任意神经元的感受野大小
rl-1是上一层任意神经元的感受野大小,其中第0层神经元的感受野是1,就是它自己。
kl是本层卷积核/池化核的大小
si是第i层的卷积/池化的步长。最后部分表示是l层之前所有对感受野有影响的卷积、池化层的步长连乘的结果。
可见,感受野的大小只与卷积核的大小、各层的步长有关,和padding无关。
这个公式是个基础公式,后面我们讲卷积的变体操作——膨胀卷积时,其感受野的计算基础也是这个公式。

  • 下图是根据公式手动计算Lenet和Alexnet的感受野:

【深度视觉】第五章:卷积网络的重要概念及花式卷积_第3张图片

  • 增大有效感受野的具体方法:

上面我们说了感受野非常重要、感受野越大越好,那到底还有哪些具体措施来放大感受野呢?
一是,加深卷积网络的深度。理论上来说,每增加一个卷积层,感受野的宽和高就会按照卷积核的尺寸-1 的线性增加。
二是,池化层或者是其他快速消减特征图尺寸的技术。
三是,使用更加花式的卷积操作,比如膨胀卷积dilated convolution、残差连接等等。
方法1和2比较好把握,方法3就非常复杂了,在你使用前你首先要非常清楚这些花式操作的各个细节和特点才能游刃有余得使用。所以针对方法3我后面会专门写几个小标题专门讨论。

3、卷积的花式操作:膨胀卷积
膨胀卷积是卷积花式操作的基础,就是最基本的变体,所以这部分也是基础。这部分就和前面的感受野联系得非常紧密,所以感受野的基本知识点你要先吃透,这部分你才能继续往下推进。

(1)什么是膨胀卷积
膨胀卷积又叫空洞卷积,是在论文2016ICLR《Multi-scale Context Aggregation by Dilated Convolutions》中提出的。与标准的卷积核不同,膨胀卷积在kernel中增加了一些空洞,从而可以扩大模型的感受野。

【深度视觉】第五章:卷积网络的重要概念及花式卷积_第4张图片 普通卷积 【深度视觉】第五章:卷积网络的重要概念及花式卷积_第5张图片 膨胀卷积

pytorch中的conv2d卷积层里面就有一个参数:dilation。当dilation=1时,就是普通的卷积操作,就是上图左图中的卷积操作。当dilation=2时就是上图右图的卷积操作,就是隔一个点相乘相加。当dilation=3时,就是隔两个点进行相乘相加。    
 

待续。。。。

你可能感兴趣的:(网络)