【学习笔记】深度学习之CNN卷积神经网络

什么是CNNCNN(卷积神经网络)?

定义

卷积神经网络(ConvolutionalNeuralNetworkConvolutional Neural Network, CNNCNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。

卷积神经网络由一个或多个卷积层和顶端的全连通层(对应经典的神经网络)组成,同时也包括关联权重池化层PoolingLayerPooling Layer)。这一结构使得卷积神经网络能够利用输入数据的二维结构。与其他深度学习结构相比,卷积神经网络在图像语音识别方面能够给出更好的结果。这一模型也可以使用反向传播算法进行训练。相比较其他深度、前馈神经网络,卷积神经网络需要考量的参数更少,使之成为一种颇具吸引力的深度学习结构。

作为深度学习中比较重要也广为人知的一种网络结构——卷积神经网络——是非常令人吃惊的。它变成了一种颠覆性的技术,打破了从文本、视频到语音等多个领域所有最先进的算法,远远超出了其最初在图像处理的应用范围。

神经网络,顾名思义,是科学家们类比生物神经网络搭建的一种人工网络,模仿生物进行图像、音频等信息进行处理从而快速得到我们想要的信息。

卷积,则是指在人工神经网络处理信息的过程中使用了卷积这种数学上的运算方法。卷积网络是一种特殊的神经网络,它们在至少一个层中使用卷积代替一般矩阵乘法。

CNNCNN的结构

卷积神经网络由一个输入层和一个输出层以及多个隐藏层组成。CNNCNN的隐藏层通常由一系列与乘法或其他点积卷积的卷积层组成。

**函数通常是ReLUReLU层,随后是其他卷积。

例如池化层,全连接层和归一化层(SoftmaxSoftmaxSigmoidSigmoid),称为隐藏层,因为它们的输入和输出被**函数和最终卷积掩盖了。
【学习笔记】深度学习之CNN卷积神经网络
卷积神经网络的结构:输入层(InputLayerInput Layer)—卷积层(ConvolutionalLayerConvolutional Layer)—池化层(PoolingLayerPooling Layer)—卷积层—池化层(降采样层)—…—全连接层—全连接层—…—输出层(全连接层+SoftmaxSoftmax**)

其中,卷积和池化次数依据需求来定,全连接层同理。

卷积-池化-全连接只是最基础的CNNCNN

随着人工智能的不断发展,现在已经由许多种由此衍生出来的CNNCNN(卷积方式、信息传递的flowflow等有所不同),但是其根本结构还是大同小异的。

【学习笔记】深度学习之CNN卷积神经网络

卷积层

作用:提取图像的底层特征

卷积层是一组平行的特征图(feature map),它通过在输入图像上滑动不同的卷积核并执行一定的运算而组成。此外,在每一个滑动的位置上,卷积核与输入图像之间会执行一个元素对应乘积并求和的运算以将感受野内的信息投影到特征图中的一个元素。这一滑动的过程可称为步幅 stridestride,步幅stridestride 是控制输出特征图尺寸的一个因素,是我们需要设置的一个超参数。卷积核的尺寸要比输入图像小得多,且重叠或平行地作用于输入图像中,一张特征图中的所有元素都是通过一个卷积核计算得出的,也即一张特征图共享了相同的权重和偏置项。

【学习笔记】深度学习之CNN卷积神经网络
该动图演示的是在输入图像上滑动一个3×33\times3的卷积核,且其步长设为1,感受野为7×77\times7

卷积核是一种特征发现器,我们通过卷积层可以很容易地发现图像中的各种边缘

但是卷积层发现的特征往往过于精确,我们即使高速连拍拍摄一个物体,照片中的物体的边缘像素位置也不大可能完全一致,因此,我们需要通过池化层来降低卷积层对边缘的敏感性。

卷积后的图像尺寸

我们假定输入图片尺寸为 m x n,输出的图片尺寸为 l x c,跨度用 stride 表示,卷积核大小用 k 表示,则有下面公式。

l=(mk)/stride+1c=(nk)/stride+1\begin{array}{l} l=(m-k) / \text {stride}+1 \\ \\c=(n-k) / \text {stride}+1 \end{array}

池化层

作用:缩小数据维度(防止数据爆炸,节省运算量和运算时间),防止过拟合(防止过学习,即防止培养出高分低能,在考场(训练集)称霸但在社会上(测试集)混不下去的人工智障)

池化,也叫做下采样(subsampling),用一个像素代替原图上邻近的若干像素,在保留feature map特征的同时压缩其大小。

池化实际上是一种非线性形式的降采样。有多种不同形式的非线性池化函数,主要有两种:Maximum Pooling和Average Pooling

而其中“最大池化(Max Pooling)”是最为常见的。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。

【学习笔记】深度学习之CNN卷积神经网络
可以看出,如果向下面动图演示的一样进行池化,那么会大大减少参数的数量,在尽可能保留原始特征的同时提高系统的运行速度。

【学习笔记】深度学习之CNN卷积神经网络

全连接层

全连接层:输出的每个神经元都和上一层每一个神经元连接。
【学习笔记】深度学习之CNN卷积神经网络

汇总经过前面处理得到的信息,并进行输出

最后,在经过几个卷积和池化层之后,神经网络中的高级推理通过全连接层来完成。就和常规的非卷积人工神经网络中一样,全连接层中的神经元与前一层中的所有**都有联系。
输出可以是Softmax输出,也可以是Sigmoid二分类输出

【学习笔记】深度学习之CNN卷积神经网络
上图中箭头所指即为全连接层。可以看到,神经网络对处于最底部的输入层(手写数字33)进行卷积、池化、全连接等操作,最后进行归一化,在090-9十个数字中,选出概率最大的数,即为目标数字33
【学习笔记】深度学习之CNN卷积神经网络
该图是CNN的输出层。

名词解释

卷积核

卷积核并没有什么神秘的,它是一个 22 维数组。它的行数和列数相同并且数值为奇数
【学习笔记】深度学习之CNN卷积神经网络
上面就是一个 3x33x3 的卷积核,它的核大小(kernel size) 为 33。它里面的元素值代表不同的权值。

一般而言,卷积核里面所有元素之和等于 11,当然也可以不让它等于 11,大于11时生成的图片亮度会增加,小于 00 时生成的图片亮度会降低。

那么,卷积核是如何作用呢?

一句话描述就是:针对输入层中单个元素,将它的值由周围邻近的元素值加权平均。而这种加权平均的操作产生的新的元素值按照次序可以产生一个新的输出层。

【学习笔记】深度学习之CNN卷积神经网络

需要注意的是,在深度学习当中,只需要逐元素相乘再相加就可以了,不需要对结果取均值。

感受野

在机器视觉领域的深度神经网络中有一个概念叫做感受野,用来表示网络内部不同位置的神经元对原图像的感受范围的大小。

神经元之所以无法对原始图像的所有信息进行感知,是因为在这些网络结构中普遍使用卷积层和池化层,层与层之间均为局部相连(通过slidingfiltersliding filter)。

神经元感受野的值越大,表示其能接触到的原始图像范围就越大,也意味着他可能蕴含更为全局、语义层次更高的特征;值越小则表示其所包含的特征越趋向于局部和细节。

因此感受野的值可以大致用来判断每一层的抽象层次。

【学习笔记】深度学习之CNN卷积神经网络
可以看到在Conv1Conv1中的每一个单元所能看到的原始图像范围是3×33 \times 3,而由于Conv2Conv2的每个单元都是由2×22 \times 2范围的Conv1构成,因此回溯到原始图像,其实是能够看到 5×55 \times 5的原始图像范围的。

因此我们说Conv1Conv1的感受野是33Conv2Conv2的感受野是55. 输入图像的每个单元的感受野被定义为11,这应该很好理解,因为每个像素只能看到自己。

步长

滑动卷积核时,我们会先从输入的左上角开始,每次往左滑动一列或者往下滑动一行逐一计算输出,我们将每次滑动的行数和列数称为Stride,下面两张动图中,步长分别为Stride=1;Stride=2。

【学习笔记】深度学习之CNN卷积神经网络
卷积过程中,有时需要通过padding来避免信息损失,有时也要在卷积时通过设置的步长(Stride)来压缩一部分信息,或者使输出的尺寸小于输入的尺寸。

【学习笔记】深度学习之CNN卷积神经网络
stride的作用:是成倍缩小尺寸,而这个参数的值就是缩小的具体倍数,比如步幅为2,输出就是输入的1/2;步幅为3,输出就是输入的1/3。以此类推。

【卷积核的大小一般为奇数】 1×11\times13×33\times35×55\times57×77\times7都是最常见的。这是为什么呢?为什么没有偶数?

(1)更容易padding

在卷积时,我们有时候需要卷积前后的尺寸不变。这时候我们就需要用到padding。假设图像的大小,也就是被卷积对象的大小为n×nn \times n,卷积核大小为k×kk \times k,padding的幅度设为 (k1)2\frac{(k-1)}{2} 时,卷积后的输出就为nk+2×k121+1=n\frac{n-k+2\times\frac{k-1}{2}}{1}+1=n
即卷积输出为n×nn \times n,保证了卷积前后尺寸不变。但是如果kk是偶数的话, (k1)2\frac{(k-1)}{2}就不是整数了。

(2)更容易找到卷积锚点

在CNN中,进行卷积操作时一般会以卷积核模块的一个位置为基准进行滑动,这个基准通常就是卷积核模块的中心。若卷积核为奇数,卷积锚点很好找,自然就是卷积模块中心,但如果卷积核是偶数,这时候就没有办法确定了,让谁是锚点似乎都不怎么好。

【卷积的计算公式】

输入图片的尺寸:一般用n×nn \times n表示输入的image大小。

卷积核的大小:一般用 f×ff \times f表示卷积核的大小。

填充(Padding):一般用 pp 来表示填充大小。

步长(Stride):一般用 ss 来表示步长大小。

输出图片的尺寸:一般用 oo 来表示。

如果已知 nnffppss 可以求得 oo ,计算公式如下:o=n+2pfs+1o=\left\lfloor\frac{n+2 p-f}{s}\right\rfloor+1

其中" \lfloor \rfloor"是向下取整符号,用于结果不是整数时进行向下取整。

PaddingPadding

Padding,意为填充。可以发现,输入图像与卷积核进行卷积后的结果中损失了部分值,输入图像的边缘被“修剪”掉了(边缘处只检测了部分像素点,丢失了图片边界处的众多信息)。

这是因为边缘上的像素永远不会位于卷积核中心,而卷积核也没法扩展到边缘区域以外。

这个结果我们是不能接受的,有时我们还希望输入和输出的大小应该保持一致。

为解决这个问题,可以在进行卷积操作前,对原矩阵进行边界填充(Padding),也就是在矩阵的边界上填充一些值,以增加矩阵的大小,通常都用“00”来进行填充的。【学习笔记】深度学习之CNN卷积神经网络

通过填充的方法,当卷积核扫描输入数据时,它能延伸到边缘以外的伪像素,从而使输出和输入size相同。

常用的两种padding:

(1)valid padding:不进行任何处理,只使用原始图像,不允许卷积核超出原始图像边界

(2)same padding:进行填充,允许卷积核超出原始图像边界,并使得卷积后结果的大小与原来的一致

权值共享

权值共享:卷积核扫过整张图片的过程中,卷积核参数不变。

下图的动画中,绿色表示原图像素值,红色数字表示卷积核中的参数,黄色表示卷积核在原图上滑动。右图表示卷积运算之后生成的feature map。
【学习笔记】深度学习之CNN卷积神经网络
下图展示了RGBRGB三个通道图片的卷积运算过程,共有两组卷积核,每组卷积核都有三个filter分别与原图的RGBRGB三个通道进行卷积。每组卷积核各自生成一个feature map。
【学习笔记】深度学习之CNN卷积神经网络

原图最外圈补0:zero padding,便于提取图像边缘的特征。

局部连接

feature map上每个值仅对应着原图的一小块区域,原图上的这块局部区域称作感受野(receptive field)。局部连接的思想,受启发于生物学里面的视觉系统,视觉皮层的神经元就是局部接受信息的。
【学习笔记】深度学习之CNN卷积神经网络
【学习笔记】深度学习之CNN卷积神经网络

多通道卷积

上述例子都只包含一个输入通道。实际上,大多数输入图像都有 RGB 3个通道。

【学习笔记】深度学习之CNN卷积神经网络
这里就要涉及到“卷积核”和“filter”这两个术语的区别。在只有一个通道的情况下,“卷积核”就相当于“filter”,这两个概念是可以互换的。但在一般情况下,它们是两个完全不同的概念。每个“filter”实际上恰好是“卷积核”的一个集合,在当前层,每个通道都对应一个卷积核,且这个卷积核是独一无二的。

多通道卷积的计算过程:将矩阵与滤波器对应的每一个通道进行卷积运算,最后相加,形成一个单通道输出,加上偏置项后,我们得到了一个最终的单通道输出。如果存在多个filter,这时我们可以把这些最终的单通道输出组合成一个总输出。

这里我们还需要注意一些问题——滤波器的通道数、输出特征图的通道数。

某一层滤波器的通道数 = 上一层特征图的通道数。如上图所示,我们输入一张 6×6×36\times6\times3的RGB图片,那么滤波器(3×3×33\times3\times3)也要有三个通道。

某一层输出特征图的通道数 = 当前层滤波器的个数。如上图所示,当只有一个filter时,输出特征图(4×44\times4)的通道数为1;当有2个filter时,输出特征图(4×4×24\times4\times2)的通道数为2。

Conferences

1.How Convolutional Neural Networks work
2.大白话讲解卷积神经网络工作原理
3.卷积神经网络(CNN,ConvNet)及其原理详解
4.【子豪兄】深度学习之卷积神经网络
5.【深度学习入门】——亲手实现图像卷积操作
6.手写数字识别3D可视化网站
7.深度神经网络中的感受野(Receptive Field)
8.CNN基础知识——卷积(Convolution)、填充(Padding)、步长(Stride)
9.TensorFlow中CNN的两种padding方式“SAME”和“VALID”