分享

一文理解卷积神经网络

本帖最后由 levycui 于 2019-9-3 16:50 编辑
问题导读:
1、如何全面理解卷积神经网络?
2、如何理解卷积神经网络各理论点?
3、如何理解局部感知、参数共享、分层提取、感受野、多核卷积?
4、如何实现卷积层和池化层?




人类视觉原理

        深度学习的许多研究成果,离不开对大脑认知原理的研究,尤其是视觉原理的研究。

        1981 年的诺贝尔医学奖,颁发给了 David Hubel(出生于加拿大的美国神经生物学家) 和TorstenWiesel,以及 Roger Sperry。前两位的主要贡献,是“发现了视觉系统的信息处理”,可视皮层是分级的。

        人类的视觉原理如下:从原始信号摄入开始(瞳孔摄入像素 Pixels),接着做初步处理(大脑皮层某些细胞发现边缘和方向),然后抽象(大脑判定,眼前的物体的形状,是圆形的),然后进一步抽象(大脑进一步判定该物体是只气球)。下面是人脑进行人脸识别的一个示例:

2019-09-03_155543.jpg
        我们可以看到,在最底层特征基本上是类似的,就是各种边缘,越往上,越能提取出此类物体的一些特征(轮子、眼睛、躯干等),到最上层,不同的高级特征最终组合成相应的图像,从而能够让人类准确的区分不同的物体。那么我们可以很自然的想到:可以不可以模仿人类大脑的这个特点,构造多层的神经网络,让计算机来逐层提取图像中的特征,最终在顶层做出分类呢?答案是肯定的,这也是卷积神经网络的灵感来源。

1整体描述

        卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积运算且具有深度结构的前馈神经网络(Feedforward Neural Networks)。相比早期的BP神经网络,卷积神经网络最重要的特性在于“局部感知”与“参数共享”,自2012年的AlexNet开始,卷积神经网络就多次成为ImageNet大规模视觉识别竞赛(ImageNet Large Scale Visual Recognition Challenge, ILSVRC)的优胜算法,至此,卷积神经网络开始大放异彩,成为了众多科学领域的研究重点之一。

        如图1所示,一个完整的卷积神经网络可包含卷积层、池化层、全连接层等。其中卷积层用来进行特征提取,池化层用于降低维数,全连接层可用于结果预测(也可使用全卷积网络进行预测)。
2019-09-03_155633.jpg
注:卷积运算也属于一种线性运算,故需要进行非线性处理,即添加激活函数(示例中为修正线性单元的函数,即 Relu 激活函数)。

对于卷积层,其详细描述如图1.2所示
2019-09-03_155715.jpg
2019-09-03_155803.jpg
注:对于某一个卷积层,其不同特征图所使用的激活函数相同,但不同卷积层所使用的激活函数可以不同,该步骤在整体描述中为突出与神经网络的相似性而单独提出,但实际上其仍属于卷积层的一部分。

对于池化层,其详细描述如图1.3所示:
2019-09-03_155839.jpg
承接上例,对于 28\times 28 \times n 的特征图,其池化过程仅需通过池化核对该特征图进行池化运算即可得到输出。

然后将得到的特征图经过全连接层进行处理并由softmax算法进行回归即可得到最终的输出结果。

注:全连接层即为机器学习中常见的由神经元构成的神经网络。
(关于神经网络及softmax回归可参考:神经网络的前向及反向传播、深度学习笔记)

2基本理论

2.1卷积(convolution)

卷积神经网络中的核心即为卷积运算,其相当于图像处理中的“滤波器运算”。
2019-09-03_160024.jpg

如图2.1所示,对一幅图像的一个完整的卷积运算过程为:卷积核以一定的间隔滑动,并对所覆盖的区域进行卷积运算得到值 z,直至遍历完整幅图像。
20190720180736192.gif
图2.1 卷积运算
2019-09-03_160135.jpg

2.2步长(stride)

滑动一定的间距,但这个间距该如何定义呢? 这个概念就是卷积的 “步长”(stride),设置卷积的步长可使卷积过程跳过原图像中的某些像素。结合步长 s 操作后,其输出图像的尺寸为

2019-09-03_160232.jpg
20190720182452976.gif
图2.3 一个步长为2的卷积运算

2.3填充(padding)

在标准的卷积过程中,存在两个问题:
  • 每次卷积运算后,图像就会缩小,在经历多次运算后,图像终会失去其形状,变为 1*1 的 “柱状”。
  • 对于图像边缘的像素,其只被一个输出所触碰或者使用,但对于图像中间的像素,则会有多个卷积核与之重叠。所以那些在角落或者边缘区域的像素点在输出中采用较少,意味着卷积过程丢掉了图像边缘位置的许多信息。


2019-09-03_160356.jpg
至于选择填充多少像素,通常有两个选择,分别叫做 Valid 卷积和 Same 卷积。

Valid卷积
Valid 卷积意味着不填充,如之前所述,图像会经历卷积运算后逐渐缩小,输出的图像尺寸即为上述公式:
2019-09-03_160434.jpg
Same卷积
Same卷积意味填充后,输出图像的尺寸与输入图像的尺寸相同,根据上述公式,令

2019-09-03_160508.jpg
注:一般卷积核 f 的大小会选择一个奇数,如 3 \ 5 \ 7 等。主要因为:
如果 f 是一个偶数,那么只能使用一些不对称填充。只有当 f 是奇数时,Same 卷积才会有自然的填充,即可以选择同样的数量填充四周。
当卷积核 f 是奇数时,其只有一个中心点,在具体的程序实现过程中会便于指出卷积核的位置。

2.4三维卷积

此处可分为两种,一种是常见的多通道图像(如RGB彩色图像)的三维卷积(也是实际中最常用的卷积方式),与之前所举的二维卷积例子原理相似只是通道数不为1,具体如下图所示:
2019-09-03_160554.jpg

在该卷积过程中,卷积核n(包含3个小卷积核) 中的每个小卷积核分别与原图像中所对应的图层进行卷积运算(如卷积核1中左边的小卷积核与原图像中左边的红色图层进行卷积运算,得到红色的单通道特征图;卷积核1中中间的小卷积核则与原图像中间的绿色图层进行卷积运算,得到绿色的单通道特征图,以此类推),分别生成3个单通道特征图,然后将这3个特征图按元素对应相加,即可得到卷积核n 生成的单通道特征图,最后将 n 个特征图相叠加即可得到最终的 n通道特征图。

2019-09-03_160640.jpg
2019-09-03_160651.jpg
第二种三维卷积优点类似于卷积的局部连接,但该类卷积运算的卷积核并非只与原图像中的某几层相连接(在一个固定平面内滑动),而是以空间滑动的方式与原图像的所有像素进行卷积。

2019-09-03_160736.jpg

2019-09-03_160800.jpg

2.5 1x1卷积
2019-09-03_160829.jpg

2.6偏置(bias)
2019-09-03_160906.jpg
其具体计算过程如图2.7所示(以二维卷积为例,也可理解为图2.6中的某一个偏置单元与特征图中对应图层的计算过程)。

2019-09-03_160932.jpg
2019-09-03_160956.jpg
2019-09-03_161020.jpg

2.7池化(pooling)

        在通过卷积获得了特征 (features) 之后,下一步我们希望利用这些特征去做分类。理论上讲,人们可以用所有提取得到的特征去训练分类器,但这样做会面临巨大计算量的挑战。并且容易出现过拟合 (over-fitting)。

        为了解决这个问题,首先回忆一下,我们之所以决定使用卷积后的特征是因为图像具有一种“静态性”的属性,这也就意味着在一个图像区域有用的特征极有可能在另一个区域同样适用。因此,为了描述大的图像,一个很自然的想法就是对不同位置的特征进行聚合统计,例如,人们可以计算图像一个区域上的特征的最大值 (或平均值)。这些统计到的特征不仅具有低得多的维度 (相比使用所有提取得到的特征),同时还会改善结果(不容易过拟合)。这种聚合的操作就叫做池化 (pooling)。

        除了最大值池化(Max Pooling)之外,还有平均值池化(Average pooling)等。相对于Max池化是从目标区域中取出最大值,Average池化则是计算目标区域的平均值。如图2.6.1所示的即为Max池化的运算过程,Average池化依此类推。
2019-09-03_161052.jpg
池化有4个重要特性:
  •     不同于卷积,池化没有需要学习的参数。
  •     池化运算后图像的高度和宽度被压缩,但通过数不会改变。
  •     降低了数据特征,扩大了卷积核的感受野。
  •     微小的位置变化具有鲁棒性,在输入数据发生微小偏差时,池化仍会返回相同的结果。如图2.6.2为例,输入数据在宽度方向上只偏离1个元素时,输出仍为相同的结果(根据数据的不同,有时结果也不相同)。

2019-09-03_161129.jpg

2.8全局池化 (Global Pooling)

        “global pooling”在滑窗内的具体池化方法可以是任意的,所以就会被细分为“global average pooling”、“global max pooling”等。在 Network in Network 的工作中,作者使用GAP(Global average pooling)来取代了传统方式最后的全连接层,直接实现了降维,更重要的是极大地减少了网络的参数(CNN网络中占比最大的参数其实后面的全连接层)。GAP的结构如下图所示:
2019-09-03_161212.jpg
虽然说GAP就是把池化的窗口大小设置成输入图像的大小,但这并不是GAP内涵的全部。GAP的意义是对整个网络从结构上做正则化防止过拟合。既降低参数避免了全连接带来的过拟合风险,又达到了全连接一样的转换功能。

2.9激活函数(activation functions)
2019-09-03_162539.jpg
注:某些特殊情况可能会用到线性激活函数,如机器学习中回归问题的输出层(不在隐藏层)或是压缩问题(可以在隐藏层)。

常用的激活函数主要有:
(1)sigmoid函数
2019-09-03_162630.jpg
2019-09-03_162718.jpg
(2)tanh 函数
2019-09-03_162653.jpg
2019-09-03_162741.jpg

注:tanh函数的效果总是优于 sigmoid 函数。因为函数值域在-1 和+1的激活函数,其均值是更接近零均值的。在训练一个算法模型时,如果使用 tanh 函数代替sigmoid 函数中心化数据,会使得数据的平均值更接近 0 而不是 0.5。

注:sigmoid 函数和 tanh 函数两者共同的缺点是,在 z 特别大或者特别小的情况下,导数的梯度或者函数的斜率会变得特别小,最后就会接近于 0,导致降低梯度下降的速度。

(3)修正线性单元的函数(ReLu)
2019-09-03_162826.jpg
2019-09-03_162846.jpg
(4)Leaky Relu函数
2019-09-03_162914.jpg
2019-09-03_162934.jpg
注:Relu 进入负半区的时候,梯度为 0,神经元此时不会训练,产生所谓的稀疏性,而 Leaky ReLu 不会有这问题。


3特性
3.1局部感知

        一般认为,人对外界的认知是从局部到全局的,而对于图像来说,空间联系也是局部的像素联系较为紧密,而距离较远的像素相关性则较弱。因而,每个神经元其实没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息。网络部分连通的思想,也是受启发于生物学里面的视觉系统结构。视觉皮层的神经元就是局部接受信息的(即这些神经元只响应某些特定区域的刺激)。

        在全连接神经网络中(如图3.1所示),相邻层的神经元全部连接在一起,由于其输入数据是一维结构,故图像需先转换为一维向量,而这个过程,也导致图像完全丢失了“形状”,即像素间的空间信息,从理论上来讲,神经网络几乎能解决所有深度学习问题,但是在处理复杂问题时,往往难以达到理想的效果。
2019-09-03_163015.jpg
         该类网络不仅参数量巨大,且学习速度较慢,即使是一个简单的问题,一般也需要几百次甚至上千次的学习才能收敛,而且易产生过拟合问题,泛化能力较弱。

        而卷积层则可以保持形状不变。当输入图像时,卷积层会以3维数据的形式接收输入数据,并同样以3维数据的形式输出至下一层。因此,在CNN中,可以正确理解图像等具有形状的数据,而且由于局部连接,大大降低了参数量,节省了内存。

3.2参数共享

        也可理解为“平移不变性”。卷积神经网络在图像的某一区域学到某个模式之后,它就可以在图像的任何地方识别这个模式。
2019-09-03_163047.jpg
        如图3.2所示,假设使用某一特征过滤器(检测器)提取 “手写5” 的特征,那么图片的右下角区域,以及旁边的各个区域都可以使用这个过滤器。每个特征检测器以及输出都可以在输入图片的不同区域中使用同样的参数,以便提取特征 “5”。而对于全连接网络来说,如果模式出现在新的位置,它只能重新学习这个模式。这使得卷积神经网络在处理图像时可以高效利用数据(因为视觉世界从根本上具有平移不变性),只需要更少的训练样本就可以学到具有泛化能力的数据表示。

3.3分层提取

        卷积神经网络可以学到模式的空间层次结构(spatial hierarchies of patterns)。
2019-09-03_163119.jpg
        如图3.3。第一个卷积层将学习较小的局部模式(比如边缘),第二个卷积层将学习由第一层特征组成的更大的模式,以此类推,层数越高,学到的特征就越全局化。这使得卷积神经网络可以有效地学习越来越复杂、越来越抽象的视觉概念(视觉世界从根本上具有空间层次结构)。
3.4感受野(Receptive field)

        感受野用来表示网络内部的不同神经元对原图像的感受范围的大小,换句话说,即为每一层输出的特征图(feature map)上的像素点在原始图像上映射的区域大小。其中神经元感受野的值越大表示其能接触到的原始图像范围就越大,也意味着它可能蕴含更为全局,语义层次更高的特征;相反,值越小则表示其所包含的特征越趋向局部和细节,因此感受野的值可以用来大致判断每一层的抽象层次。

2019-09-03_163156.jpg
2019-09-03_163218.jpg
3.5多核卷积

        一个卷积核只能提取某一种特征,而计算机对于一幅图像的 “理解” 过程中,往往需要对其多个特征进行学习,其每个卷积核都是一种特征提取方式,就像一个筛子,将图像中符合条件(激活值越大越符合条件)的部分筛选出来。

        如图3.3,我们人类对于猫的理解会包括猫的耳朵、鼻子和眼睛,故其可采取图示的三种卷积核来进行提取,而更底层的特征,如不同形状的曲线、图案等则由其他不同种类的卷积核来进行提取。

4局部卷积

        以LeNet网络举例,其结构如下图所示:
2019-09-03_163252.jpg
原始图像进来以后,先进入一个卷积层C1,由6个 5x5 的卷积核组成,卷积出28x28的图像,然后下采样到14x14(S2)。接下来,再进一个卷积层C3,由16个5x5的卷积核组成,之后再下采样到5x5(S4)。注意,这里S2与C3的连接方式并不是全连接,而是部分连接,如下图所示:
2019-09-03_163323.jpg
        其中行代表S2层的某个节点,列代表C3层的某个节点。我们可以看出,C3的 0 和S2的 0、1、2 连接,C3的 1 和S2的 1、2、3 连接,不过从C3的6~13变为了每次连接4个节点,C3的14变为了5个节点,C3的15与S2的节点全部连接。

        即用不同底层特征的组合,可以得到进一步的高级特征,例如:/ + \ = ^,再比如,以图3.3为例,第一层的9个卷积核与输入图像 “猫” 是全部连接,从 “猫” 中得到了9种不同的底层特征图(各类底层曲线及图案),而第二层的卷积核1(将用于提取 “猫眼睛”)则只与第一层的特征图1~5相连接(即仅与特征图1~5进行卷积运算),同理,第二层的卷积核3(“猫耳朵”)则只与第一层的特征图7~9相连接。

注:此处所说的 “全部连接” 与BP神经网络中的 “全连接” 有着本质的不同,BP神经网络中的全连接表示网络中的每一个神经元都与上一层的所有神经元相连接,而卷积网络中的 “全部连接” 只是表示该层的卷积核与上一层特征图的所有通道进行卷积,但卷积运算的过程仍是 “局部连接”。
2019-09-03_163439.jpg
            结合图3.3,以图4.3为例,第一层中卷积核1~9的通道数都与原图像的相同(值都为3),故此处属于卷积的 “全部连接”,也是卷积运算默认的连接方式,而第二层中卷积核1的通道数为5,卷积核3的通道数为3,而上层特征图的通道数为9,故此处属于卷积的 “局部连接”。

    注:在此处,卷积核1与卷积核3分别仅与第1~5层特征图、7~9层特征图进行卷积运算,即分别仅在其所处的立体空间中的一个面内移动,分别输出的是一个二维的图像(通道数为1),其与处理视频序列的三维卷积概念不同。

5卷积层和池化层的实现

        如果以传统思维使用for循环来实现的话,则在巨大数据量的情况下,for循环进行计算和切换内存的时间消耗会非常大。而采用向量化的并行计算方式则可以大幅缩短计算时间。
5.1卷积实现

        如图5.1所示,首先对于输入数据,将应用滤波器的区域(3维方块)横向展开为1列以匹配卷积核(权重),然后将卷积核依次展开为1列,计算两者的矩阵乘积,最后将得到的2维数据reshape至4维。

    注:为了便于观察,将步幅设置得很大,以使滤波器的应用区域不重叠。而在实际的卷积运算中,滤波器的应用区域几乎都是重叠的。在滤波器的应用区域重叠的情况下,展开后的元素个数会多于原方块的元素个数。因此该方法比普通的实现会消耗更多的内存。

    注:在程序中,因为包含批处理数量(N幅图像同时处理),故输入数据是4维,卷积核也是所有共同展开,故也是4维。其中:N——批处理的图像数量(样本数);FN——滤波器数量;C——通道数;H——高度;W——宽度

2019-09-03_163518.jpg
    注:im2col 是一个展开函数,名称是“image to column”的缩写,即 “从图像到矩阵” 的意思。Caffe、Chainer等深度学习框架中有名为im2col 的函数,并且在卷积层的实现中,都使用了 im2col。

5.2池化实现

        池化层的实现和卷积层相同,都对输入数据进行展开。不过,池化的情况下,在通道方向上是独立的。如图5.2所示,池化的应用区域按通道单独展开。如图5.2所示,对于输入数据的每一层的池化区域分别展开为2维向量,然后对每一行求最大值得到一个1维向量,最后将该向量reshape为合适的维数。
2019-09-03_163555.jpg

6可视化

        学习前的卷积核是随机进行初始化的,所以在黑白的浓淡上没有规律可循,但学习后的滤波器变成了有规律的图像。可以发现,通过学习,滤波器被更新成了有规律的滤波器,比如从白到黑渐变的滤波器、含有块状区域(称为blob)的滤波器等。
2019-09-03_163623.jpg
        以图6.1为例,不同卷积核经过学习改变了自身对不同特征的响应程度,如边缘(颜色变化的分界线)和斑块(局部的块状区域)等,其中第2个卷积核对垂直边缘响应,第5个卷积核对水平边缘响应,第9个对倾斜边缘响应,第13个对中心斑块响应。

        上面的结果是针对第1层的卷积层得出的。第1层的卷积层中提取了边缘或斑块等“低级”信息,而在堆叠了多层的CNN中,随着层次加深,提取的信息(准确说,是响应强烈的神经元))也越来越抽象。如图6.2所示,第1层的神经元对边缘或斑块有响应,第3层对纹理有响应,第5层对物体部件有响应,最后的全连接层对物体的类别(狗或车)有响应。
2019-09-03_163651.jpg
        也就是说,随着层次加深,神经元从简单的形状向“高级”信息变化。换句话说,就像我们理解东西的“含义”一样,响应的对象在逐渐变化。
7神经网络的本质

        神经网络由大量的节点(或称“神经元”,卷积神经网络中为“特征图”)相互连接构成,每个节点代表一种特定的函数,称为激活函数(Activation Function)。节点之间的连接具有特定的权重,信号经过会进行加权,代表神经网络的记忆。网络的输出则依网络的连接方式、权重值和激活函数的不同而不同。网络本身则代表对自然界某种算法或者函数的逼近,也可以是一种逻辑策略的表达。


作者:且听风吟0618
来源:https://blog.csdn.net/jack__linux/article/details/91357456

最新经典文章,欢迎关注公众号


本帖被以下淘专辑推荐:

已有(2)人评论

跳转到指定楼层
lingyufeng 发表于 2019-9-4 09:22:28
感谢分享,介绍得很详细
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条