龙空技术网

深度学习之卷积神经网络

白泽图鉴 3047

前言:

而今姐妹们对“常用的池化操作”可能比较关心,小伙伴们都想要分析一些“常用的池化操作”的相关资讯。那么小编同时在网摘上汇集了一些关于“常用的池化操作””的相关知识,希望同学们能喜欢,兄弟们一起来学习一下吧!

结合图像分类的应用场景,对图像分类问题的建模方案进行讨论,引出对建模方案的改进,引出卷积神经网络的概念介绍。进一步对卷积神经网络的特征进行分析,介绍卷积神经网络的池化层的提出过程。

1.图像分类应用场景概述

对于一个图像分类问题,是将一个图片输入到模型中,经过一个softmax函数输出预测的分类向量,将最大概率对应的类别作为模型预测的类别。模型的损失则通过Cross-entropy函数来计算,关于Cross-entropy函数的相关介绍详见文章“四两拨千斤”-损失函数对参数优化的影响。在本例中,分类向量的“cat”类的概率为0.7,是最大的概率,此时会将图像中的动物预测成“cat”类。在实际的业务场景中,图片的长度和宽度不是统一的,通常需要将图片通过切割、缩放、放大等操作将图片大小归一化(resize)。

因此,解决图像分类问题的关键在于如何将图像输入到模型中得到分类向量。

2.图像分类模型的建模方案

对于计算机来说,图片本质上是一个3D张量(tensor),即三维的数组,且每个数均在0-255之间,代表相应颜色的强度。第一个维度是宽度、第二个维度是高度、第三个维度是通道数(channels)。图片中的每个像素点(pixel)都有红(r)、绿(g)、蓝(b)三个通道构成,图片的通道数是3。

因此,对于图像分类任务,一个简单粗暴的做法是把这个3维数组“拉直”变成向量,直接输入到神经网络中。在本例中,这个向量非常巨大,有30000行。现假设将这个向量输入到有一层1000个神经元的全连接层的神经网络模型中,易知这个仅有一层的神经网络模型的权重参数就有3*10^7个。这样的做法是非常不明智的,它增加了模型的复杂程度,同时也增加了模型过拟合的风险。由此引发了思考,对这样的图像分类模型进行改进。

3.图像分类模型的改进

事实上根据图片的特性,没有必要对每个像素都做建模处理。可以通过分析找到特征处理的方式,对上面的建模方案进行改进和固化,以降低参数数量,得到新的分类模型。

局部特征

模拟人类识别图像中物体或动物的过程,会发现人往往是对整张图片的局部特征图案进行归纳和推理,才识别出图片中的物体或动物的。如果期望机器也能做到类似的事情,如图所示,只需要教会机器识别嘴、眼睛和爪子等局部特征就可以让机器学会判断图片中动物的类别是否是一只鸟。因此,并不需要对每一个像素点进行处理,只需要将一张图片切分成几块,让机器识别局部特征即可。

如何设计神经网络使得每个神经元只考虑图片局部的特征,是分类模型演化的关键。如下图所示,可以设计一个感受野(Receptive field),使得某一个神经元只关注这个感受野范围内的像素点,这就转化为一个神经元处理数据的数量为3*3*3。同理,不同感受野区块也可以连接神经元。这样做的好处是既可以让模型做到处理局部特征的要求,又满足减少参数数量降低过拟合风险的需求。感受野尺寸大小的设计,其实是一个超参数,取决于对实际问题的认知。

在实际应用时,关于感受野的设计十分灵活,既可以同一个感受野连接多个神经元(the same receptive field),也可以让不同的感受野之间存在重叠的部分(can be overlapped)。同时,也可以进行其他的设计,例如一张图片中的不同感受野尺寸不同;某个感受野只考虑一个通道,而不是三个通道;也可以出现矩形的感受野。

尽管感受野的设计十分灵活,但在深度学习业界也提出了通用的设计方案。在设计感受野时,通常会考虑所有的通道,因此可以通过宽度和高度描述感受野的尺寸大小(Kernel size)。

每一个感受野不会只连接一个神经元,会连接一系列的神经元。通过会把左上角的感受野,往右侧移动,得到一个新的感受野。为避免漏掉某些重要的局部图案特征,通常相邻的感受野之间会存在共同的区域(overlap)。将感受野移动的像素点个数称为stride,本例中stride取值是2。如果移动时发现某个感受野超出图片的范围,为避免漏掉某些局部的特征,会进行padding操作,也就是会将超出的部分像素值全部置为0。当然除了置为0之外,padding还可以使用其他做法,如取图片平均值,取最近的像素点数值。同时感受野也可以向下移动,直到扫过整张图片时为止。

局部特征的位置

对于相同的局部特征,可能出现在不同图片的不同位置。如图所示,鸟嘴既可能出现在左上角的位置,也可能出现在中间的位置。而它们却使用了不同的神经元去检测,这样可能造成参数的重复和浪费,因此可以设计成它们共享一个神经元进行计算处理。这样的处理方式被称为共享参数(parameter sharing)。

共享参数参数的设计思路见下图,对于不同的感受野(图示中左侧两个红色立方体范围),它们的权重是相同的,但是由于输入的感受野不同,即便权重相同,输出结果也是不同的。在图像分类的经典设计中,往往采用不同感受野共用一层神经元的方式来完成参数共享的设定,一组参数中的每个参数都被称为过滤器(filter)。

综合以上关于模型的设计,从最经典的全连接层到感受野设计,最后到共享参数的设计,参数的数量不断减小,模型的弹性也在不断的减小。在深度学习中,感受野加共享参数等价于卷积层(Convolutional Layer)。使用卷积层的神经网络被称为卷积神经网络(Convolutional Network),简写为CNN。卷积神经网络是专门为图像设计的模型。从另一个角度说,由于CNN模型的弹性较小,因此CNN往往有较大的偏差,而全连接的神经网络有较小的偏差,这是全连接神经网络容易出现过拟合,卷积神经网络不容易出现过拟合的原因。

4.理解卷积神经网络

对于一个卷积层而言,可以理解为有一组3*3*channel的过滤器。其中,channel表示通道数。对于彩色图片,通道数为3。对于黑白图片,通道数为1。这些过滤器的作用就是从图片中提取局部特征。

理论上来说卷积层中的filter为未知的参数,需要通过梯度下降算法训练学习得到。现假设filter中的参数是已知的,通过黑白图片的示例说明卷积层如何提取局部特征。如下图所示,

以1列或1行为间隔(此时stride=1),不断平移3*3的感受野和filter1做内积,最终得到4*4的矩阵,作为提取局部特征的结果。由于filter1的对角线均为1,其余为-1。因此,图中的filter1作用是在检测矩阵对角线的强度,对角线的数值越大,计算结果越大。依此类推,每个filter都做类似的操作,都会得到一个4*4的矩阵。将经过filter计算得到的结果叫做特征图(Feature Map)。

上面的例子是对图像使用一个卷积层处理的结果,可以对卷积层进行叠加。由于下一层卷基层要处理的通道数由上一层特征图的通道数决定。假设第一层的卷积层有64个过滤器,那么经过一个卷积层之后可以输出64个通道,这64个通道都需要一个卷积核处理,因此到下一层每个filter的高度就变成了64。

即使保持每层filter的kernal size不变,均为3*3,经过多层卷积层叠加之后,模型的感受野其实是被放大的。如图所示,上一层5*5的感受范围,实际上是通过下一层3*3的卷积核处理计算的。在实际的操作中,每个filter处理之后也会加上bias偏差。

5.池化操作的提出

通过观察,可以发现对图像进行下采样(subsampling),如拿掉图片中奇数的行和偶数的列,基本不会改变图片中物体的样貌。池化操作,更像是激活函数。常见的池化操作是maxpooling,即对卷积层的输出结果分组取最大的数值。类似地,还有取均值(mean pooling)。图示结果,是2*2的pooling 结果,分组的尺寸也是由模型的使用者决定。池化操作的主要目的是把特征图变小,因此,卷积层往往搭配池化操作使用。当卷积层和池化操作交替使用时,就形成了一个深层的卷积神经网络。pooling的作用在于可以减少网络的计算量,但它却降低来了模型的预测精度。如果,算力足以支撑全卷积的神经网络,可以不使用池化操作。

6.完整的卷积神经网络

因此,完整的卷积神经网络模型等价于卷积和池化的交替使用,然后通过Flatten层将高维矩阵排成一个向量,接着接入一个全连接层,最后通过softmax层将向量映射成和类别通常度的向量。

由于围棋的特征和图像的特征非常类似,因此,卷积神经网络模型经常被应用在下围棋的博弈任务中。著名的AlphaGo在下围棋时使用的就是卷积神经网络,只不过它剔除了不满足围棋特征的pooling操作部分。

标签: #常用的池化操作