卷积层、池化层和全连接层详解

为什么使用卷积

相比标准神经网络,对于大量的输入数据,卷积过程有效地减少了 CNN 的参数数量,原因有以下两点:

  • 参数共享(Parameter sharing):特征检测如果适用于图片的某个区域,那么它也可能适用于图片的其他区域。即在卷积过程中,不管输入有多大,一个特征探测器(滤波器)就能对整个输入的某一特征进行探测。

  • 稀疏连接(Sparsity of connections):在每一层中,由于滤波器的尺寸限制,输入和输出之间的连接是稀疏的,每个输出值只取决于输入在局部的一小部分值。
    池化过程则在卷积后很好地聚合了特征,通过降维来减少运算量。

由于 CNN 参数数量较小,所需的训练样本就相对较少,因此在一定程度上不容易发生过拟合现象。并且 CNN 比较擅长捕捉区域位置偏移。即进行物体检测时,不太受物体在图片中位置的影响,增加检测的准确性和系统的健壮性。

然后这篇文章, 从感受视野的角度出发,解释了参数共享、稀疏连接、平移不变性等

然后卷积层可以看做全连接的一种简化形式:不全连接+不参数共享。所以全连接层的参数才如此之多。


为什么要使用许多小卷积核如3x3,而不是几个大卷积核?

这在VGGNet的原始论文中得到了很好的解释。原因有二:首先,您可以使用几个较小的核而不是几个较大的核来获得相同的感受野并捕获更多的空间上下文,而且较小的内核计算量更少。其次,因为使用更小的核,您将使用更多的滤波器,您将能够使用更多的激活函数,从而使您的CNN学习到更具区分性的映射函数。

https://arxiv.org/pdf/1409.1556.pdf


为什么我们对图像使用卷积而不仅仅只使用FC层?

这个答案有两部分。首先,卷积保存、编码和实际使用来自图像的空间信息。如果我们只使用FC层,我们将没有相对的空间信息。其次,卷积神经网络( CNNs )具有部分内建的平移不变性,因为每个卷积核充当其自身的滤波器/特征检测器。

CNNs为什么具有平移不变性?因为CNNs是以滑动窗口的方式进行卷积,卷积过程中参数共享并且稀疏连接,那么无论目标在图像的什么位置,都能扫描到。


池化层简介

通过卷积层获得了图像的特征之后,理论上我们可以直接使用这些特征训练分类器(如softmax),但是这样做将面临巨大的计算量的挑战,而且容易产生过拟合的现象。为了进一步降低网络训练参数及模型的过拟合程度,我们对卷积层进行池化处理。池化常用方法为最大池化和平均池化。

最大池化:将输入拆分成不同的区域,输出的每个元素都是对应区域中元素的最大值,如下图所示:

Max-Pooling

池化过程类似于卷积过程,上图所示的池化过程中相当于使用了一个大小 f=2的滤波器,且池化步长 s=2。卷积过程中的几个计算大小的公式也都适用于池化过程。如果有多个通道,那么就对每个通道分别执行计算过程(池化不压缩通道数,卷积会压缩)

对最大池化的一种直观解释是,元素值较大可能意味着池化过程之前的卷积过程提取到了某些特定的特征,池化过程中的最大化操作使得只要在一个区域内提取到某个特征,它都会保留在最大池化的输出中。但是,没有足够的证据证明这种直观解释的正确性,而最大池化被使用的主要原因是它在很多实验中的效果都很好

平均池化:就是从取某个区域的最大值改为求这个区域的平均值:

Average-Pooling

池化过程的特点之一是,它有一组超参数,但是并没有参数需要学习。池化过程的超参数包括滤波器的大小 f、步长 s,以及选用最大池化还是平均池化。而填充 p则很少用到。

池化过程的输入维度为:

输出维度为:


池化层的作用

通过卷积层获得了图像的特征之后,理论上我们可以直接使用这些特征训练分类器(如softmax),但是这样做将面临巨大的计算量的挑战,而且容易产生过拟合的现象。为了进一步降低网络训练参数及模型的过拟合程度,我们对卷积层进行池化处理。

池化层作用:
(1)降维,提高计算速度。相对卷积操作,池化是以指数形式降维,理想情况下,还能保留显著特征
(2)同时减小噪声提高所提取特征的稳健性。
(3)可以扩大感知野
(4)在图像识别领域,池化还能提供平移、旋转和尺度不变性
(5)池化的输出是一个固定大小的矩阵,这对分类问题很重要


池化为什么对平移不变性有贡献

池化在丢失少量信息的情况下,会对有效信息进行最大程度的激活。以下解答摘自池化-ufldl

如果人们选择图像中的连续范围作为池化区域,并且只是池化相同(重复)的隐藏单元产生的特征,那么,这些池化单元就具有平移不变性 (translation invariant)。这就意味着即使图像经历了一个小的平移之后,依然会产生相同的 (池化的) 特征。

在很多任务中 (例如物体检测、声音识别),我们都更希望得到具有平移不变性的特征,因为即使图像经过了平移,样例(图像)的标记仍然保持不变。

例如,如果你处理一个MNIST数据集的数字,把它向左侧或右侧平移,那么不论最终的位置在哪里,你都会期望你的分类器仍然能够精确地将其分类为相同的数字。

再例如,医学图像分割,可以查看感兴趣的区域,从而忽略不需要的区域的干扰。如看骨折,只需要将骨头所表示的特征图像(一般是一定会度值的一块区域)从背景(如肌肉,另一种灰度值)分割出来,而其它的肌肉等则不显示(为黑色)


SPP空间金字塔池化

卷积神经网络要求输入的图像尺寸固定,这种需要会降低图像识别的精度。SPPNet(Spatial Pyramid Pooling)的初衷非常明晰,就是希望网络对输入的尺寸更加灵活,分析到卷积网络对尺寸并没有要求,固定尺寸的要求完全来源于全连接层部分,因而借助空间金字塔池化的方法来衔接两者,SPPNet在检测领域的重要贡献是避免了R-CNN的变形、重复计算等问题,在效果不衰减的情况下,大幅提高了识别速度。

论文翻译:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition


全连接层的作用

全连接层相对卷积层来说,就是:不稀疏连接+不参数共享。全连接层的每一个结点都与上一层的所有结点相连,用来把前边提取到的特征综合起来。由于其全相连的特性,一般全连接层的参数也是最多的,可占全网络参数的80%。

全连接会把上一层的多维特征图转化成一个固定长度的特征向量,这个特征向量虽然丢失了图像的位置信息,但是它组合了图像中最具特点的图像特征,用于后面的Softmax分类。

换一种说法,全连接层的作用是 将网络学习到的特征映射到样本标记空间(卷积池化层层等作用是将原始数据映射到隐层特征空间)。

在实际使用中,全连接层可由卷积操作实现:对前层是全连接的全连接层可以转化为卷积核为1x1的卷积;而前层是卷积层的全连接层可以转化为卷积核为hxw的全局卷积,h和w分别为前层卷积结果的高和宽。

因为传统的网络输出的都是分类,也就是几个类别的概率,甚至就是一个数,比如类别号。那么全连接层就是高度提纯的特征了,方便交给最后的分类器或者回归。

其实卷积神经网络中全连接层的设计,属于人们在传统特征提取+分类思维下的一种”迁移学习”思想,但后期在很多end-to-end模型中,其最初用于分类的功能被弱化了,而全连接层参数又过多,所以人们一直试图设计出各种不含全连接层又能达到相同效果的网络。

知乎:全连接层的作用是什么?

如果一个全连接层,输入有4*4*50个神经元结点,输出有500个结点,则一共需要4*4*50*500=400000个权值参数W和500个偏置参数b


CNN的卷积核是单层的还是多层的

描述网络模型中某层的厚度,通常用名词 通道(channel)数或者 特征图(feature map)数。不过人们更习惯把作为数据输入的前层的厚度称之为通道数(比如RGB三色图层称为输入通道数为3),把作为卷积输出的后层的厚度称之为特征图数

卷积核(filter)一般是3D多层的,除了面积参数, 比如3x3之外, 还有厚度参数H(2D的视为厚度1). 还有一个属性是卷积核的个数N。

  • 卷积核的厚度H,一般等于前层厚度M(输入通道数或feature map数)。特殊情况M > H。
  • 卷积核的个数N,一般等于后层厚度(后层feature maps数,因为相等所以也用N表示)。
  • 卷积核通常从属于后层,为后层提供了各种查看前层特征的视角,这个视角是自动形成的。
  • 卷积核厚度等于1时为2D卷积,对应平面点相乘然后把结果加起来,相当于点积运算;
  • 卷积核厚度大于1时为3D卷积,每片分别平面点求卷积,然后把每片结果加起来,作为3D卷积结果;1x1卷积属于3D卷积的一个特例,有厚度无面积,直接把每片单个点乘以权重再相加。

下面解释一下特殊情况的 M > H:
实际上,除了输入数据的通道数比较少之外,中间层的feature map数很多,这样中间层算卷积会累死计算机。所以很多深度卷积网络把全部通道/特征图划分一下,每个卷积核只看其中一部分。这样整个深度网络架构是横向开始分道扬镳了,到最后才又融合。这样看来,很多网络模型的架构不完全是突发奇想,而是是被参数计算量逼得。特别是现在需要在移动设备上进行AI应用计算(也叫推断), 模型参数规模必须更小, 所以出现很多减少握手规模的卷积形式, 现在主流网络架构大都如此。


dropout随机失活

dropout(随机失活)是在神经网络的隐藏层为每个神经元结点设置一个随机消除的概率,保留下来的神经元形成一个结点较少、规模较小的网络用于训练。dropout 正则化较多地被使用在计算机视觉(Computer Vision)领域。

对于单个神经元,其工作是接收输入并产生一些有意义的输出。但是加入了 dropout 后,输入的特征都存在被随机清除的可能,所以该神经元不会再特别依赖于任何一个输入特征,即不会给任何一个输入特征设置太大的权重

因此,通过传播过程,dropout 将产生和 L2 正则化相同的收缩权重的效果。

对于不同的层,设置的keep_prob也不同。一般来说,神经元较少的层,会设keep_prob为 1.0,而神经元多的层则会设置比较小的keep_prob。

dropout 的一大缺点是成本函数无法被明确定义。因为每次迭代都会随机消除一些神经元结点的影响,因此无法确保成本函数单调递减。因此,使用 dropout 时,先将keep_prob全部设置为 1.0 后运行代码,确保 J(w,b)函数单调递减,再打开 dropout。