一文帮你深入学习卷积神经网络(CNN)的原理知识

专栏推广

正文

卷积神经网络常用于图片,先来看一下在计算机中,图片是如何表达和存储的?

图像在计算机中是一堆按顺序排列的数字,数值为0到255。0表示最暗,255表示最亮。 我们可以把这堆数字用一个长长的向量来表示,类似tensorflow的向量的表示方式。 然而用向量表示的话会失去平面结构的信息,为保留该平面结构信息,通常选择矩阵的表示方式。

有些图片是灰度图,普遍的图片表达方式是RGB颜色模型,即红、绿、蓝三原色的色光以不同的比例相加,以产生多种多样的色光。

这样,RGB颜色模型中,单个矩阵就扩展成了有序排列的三个矩阵,也可以用三维张量去理解,其中的每一个矩阵又叫这个图片的一个通道。

在电脑中,一张图片是数字构成的“长方体”。可用 宽, 高, 深(通道)来描述,一张图片在电脑中是这样存在的:

一文帮你深入学习卷积神经网络(CNN)的原理知识

以上就是图片在计算机中的形式。

下面让我们来看一下神经网络:

一文帮你深入学习卷积神经网络(CNN)的原理知识

上图是人工神经网络,有些时候使用神经网络已经有很好的效果了,但是对于多类别的可能需要更多的层次结构和神经元个数来完成这个任务,如此多的神经元个数和复杂的神经网络结构我们要想训练它,会有一些问题。

首先需要非常多的计算资源才能支撑它来做反向传播和前向传播,层次多了之后神经网络的学习能力会非常的强,有了非常强的记忆功能,可以存储非常多的参数w,也就是说如果你给它的样本如果没有达到它的量级的时候,它可以轻轻松松把你给他的样本全部都记下来,这会出现过拟合的情况。

所以我们应该把神经元和神经元之间的连接的权重个数降下来,但是降下来我们又不能保证它有较强的学习能力,所以这是一个纠结的地方,所以有一个方法就是局部连接+权值共享,人们发现局部连接+权值共享不仅权重参数降下来了,而且学习能力并没有实质的降低,除此之外还有其它的好处,下来看一下,下面的这几张图片:

一文帮你深入学习卷积神经网络(CNN)的原理知识

我们发现这几张图片描述的都是一个东西,但是不同的是有的大有的小,有的靠左边,有的靠右边,有的位置不同,但是我们构建的网络识别这些东西的时候应该是同一结果。为了能够达到这个目的,我们可以让图片的不同位置具有相同的权重(权值共享),也就是上面所有的图片,我们只需要在训练集中放一张,我们的神经网络就可以识别出上面所有的,这也是权值共享的好处。

用一句话总结这个神经网络就是:卷积神经网络就是让权重在不同位置共享的神经网络

现在我们对卷积神经网络有一个初步认识了,下面具体来讲解一下卷积神经网络,卷积神经网络依旧是层级结构,但层的功能和形式做了改变,用卷积神经网络来识别图片是比较好的,比如识别一辆汽车(主体):

一文帮你深入学习卷积神经网络(CNN)的原理知识

上面是卷积神经网络的基本的结构,一般卷积神经网络的结构是这样的:

一文帮你深入学习卷积神经网络(CNN)的原理知识

RELU表示激活函数

数据输入的是一张图片(输入层)

后面其中CONV表示卷积层,RELU表示激励层,POOL表示池化层(多个卷积层+激励层之后接一个池化层)

Fc表示全连接层(和人工神经网络一样)

先来看一下数据输入层/input layer

有三种常见的图像的处理方式:

一文帮你深入学习卷积神经网络(CNN)的原理知识

1均值化(CNN只用去均值):把输入数据各个维度都中心化到0

2归一化:数据幅度归一化到同样的范围

3PCA/白化:用PCA降维,白化是对数据每个特征轴上的幅度归一化

一文帮你深入学习卷积神经网络(CNN)的原理知识

去均值:所有样本求和求平均,然后用所有的样本减去这个均值样本就是去均值。

归一化:对于每个特征而言,范围最好是[-1,1],

PCA/白化:用PCA降维,让每个维度的相关度取消,特征和特征之间是相互独立的。

白化,对数据每个特征轴上的幅度归一化

卷积神经网络之卷积层:

图片有一个性质叫做局部关联性质,一个图片的像素点影响最大的是它周边的像素点,而距离这个像素点比较远的像素点二者之间关系不大。这个性质意味着每一个神经元我们不用读全局的图片了(和上一层全连接),我们的每一个神经元只需要和上一层局部连接,相当于每一个神经元扫描一小区域,然后许多神经元(这些神经元权值共享)合起来就相当于扫描了全局,这样就构成一个特征图(表示图像的某一维度的特征,具体是哪一维度可能也说不清),n个特征图就提取了这个图片的n维特征,每个特征图是由很多神经元来完成的。

在卷积神经网络中,我们先选择一个局部区域(filter),用这个局部区域(filter)去扫描整张图片。 局部区域所圈起来的所有节点会被连接到下一层的一个节点上。我们拿灰度图(只有一维)来举例:

一文帮你深入学习卷积神经网络(CNN)的原理知识

图片是矩阵形式的,将这些以矩阵排列的节点展成了向量。就能更好的看出来卷积层和输入层之间的连接,并不是全连接的,我们将上图中的红色方框称为filter,它是2*2的,这是它的尺寸(filter-size),这不是固定的,我们可以指定它的尺寸。

我们可以看出来当前filter是2*2的小窗口,这个小窗口会将picture矩阵从左上角滑到右下角,每滑一次就会一下子圈起来四个,连接到下一层的一个神经元,然后产生四个权重,,这四个权重((w1、w2、w3、w4))形成的矩阵,就叫做卷积核,因为权重共享,所以卷积核是一样的。

一文帮你深入学习卷积神经网络(CNN)的原理知识

卷积核是算法自己学习得到的,它会和上一层计算,比如,第二层的节点0的数值就是局部区域的线性组合(w1*0+w2*1+w3*4+w4*5),即被圈中节点的数值乘以对应的权重后相加

我们前面说过图片不用向量表示是为了保留图片平面结构的信息。 同样的,卷积后的输出若用上图的向量排列方式则丢失了平面结构信息。 所以我们依然用矩阵的方式排列它们,就得到了下图所展示的连接,每一个蓝色的连接四个黄色的。

一文帮你深入学习卷积神经网络(CNN)的原理知识

图片是一个矩阵,然后它的下一层也是一个矩阵,我们用一个filter从图片矩阵左上角到右下角滑动,每滑动一次,当然被圈起来的神经元们就会连接下一层的一个神经元,形成参数矩阵这个就是卷积核,当然每次滑动虽然圈起来的神经元不同,连接下一层的神经元也不同,但是产生的参数矩阵确是一样的,这就是权值共享。

卷积核会和扫描的图片的那个局部矩阵作用产生一个值,比如第一次的时候,(w1*0+w2*1+w3*4+w4*5),所以,filter从左上到右下的这个过程中会得到一个矩阵(这就是下一层也是一个矩阵的原因),具体过程如下所示:

一文帮你深入学习卷积神经网络(CNN)的原理知识

上图中左边是图片矩阵,我们使用的filter的大小是3*3的,第一次滑动的时候,卷积核和图片矩阵作用(1*1+1*0+1*1+0*0+1*1+1*0+0*1+0*0+1*1)=4,会产生一个值,就是右边矩阵的第一个值,filter滑动9次之后,会产生9个值,也就是说下一层有9个神经元,这9个神经元产生的值就构成了一个矩阵,就是上图右图所示,这矩阵叫做特征图,表示image的某一维度的特征,当然具体哪一维度可能并不知道,可能是这个图像的颜色,也有可能是这个图像的轮廓等等。

以上就是单通道的图片的卷积处理,这里再总结一下,图片是一个矩阵,我们用指定大小的filter去左上角到右下角来滑动,每次滑动所圈起来的结点会和下一层的一个结点相连,连接之后就会形成局部连接,每一条连接都会产生权重,这些权重就是卷积核,所以每次滑动都会产生一个卷积核,因为权值共享,所以这些卷积核都是一样的。卷积核会不断和当时filter所圈起来的局部矩阵作用,每次产生的值就是下一层结点的值了,这样多次产生的值组合起来就是一个特征图,表示某一维度的特征。

也就是从左上滑动到右下这一过程中会形成一个特征图矩阵(共享一个卷积核),再从左上滑动到右下又会形成另一个特征图矩阵(共享另一个卷积核),这些特征图都是表示特征的某一维度。

一文帮你深入学习卷积神经网络(CNN)的原理知识

我们来看一下这个图,我们的图片是一维的,我们的下一层有5个特征图集合,这里化的很抽象,其中每一个特征图是由很多个神经元构成的,每一个特征图都是通过共享的卷积核从左上到右下作用得到的。

一文帮你深入学习卷积神经网络(CNN)的原理知识

至此我们应该已经知道了单通道的灰度图是如何处理的,实际上我们的图片都是RGB的图像,有三个通道,那么此时的时候,图像是如何卷积的呢?

filter窗口滑动的时候,我们只是从width和height的角度来滑动的,并没有考虑depth,所以每滑动一次实际上是产生一个卷积核,共享这一个卷积核,而现在depth=3了,所以每滑动一次实际上产生了三个卷积核(三个卷积核不相同,分别作用于蓝色、绿色、红色),共享这三个卷积核。

卷积核是要和上一层的数据发生作用的,我们已经知道了单通道的是如何作用的

一文帮你深入学习卷积神经网络(CNN)的原理知识

而现在三通道呢?

我们的一个卷积核和蓝色的矩阵作用产生一个值,另一个卷积核和绿色的矩阵作用产生一个值,最后一个卷积核和红色的矩阵作用产生一个值,然后这些值加起来就是下一层结点的值了。

一文帮你深入学习卷积神经网络(CNN)的原理知识

这里我们要注意一点,我们虽然此时有三个卷积核,是因为我们要卷积的depth为三层,所以这三个卷积核实际上是分别卷积每一depth的,最后卷积的结果要加起来,所以它们最终只会得到某一维度的特征,也就是一张特征图,并不是三张特征图。这里要注意。

要想有多张特征图的话,我们可以再用新的filter来进行左上到右下的滑动,也是三个卷积核(本特征图中共享这三个卷积核的权值)分别对每一depth滑动,这样就会形成新的特征图。

也就是说增加一个滑动窗口filter(filter其实就是卷积核,可以看作是卷积核是在滑动),让他从左上到右下滑动就会产生一个特征图,多个特征图,所以这样卷积层的输出也不再是depth为1的一个平面,而是和输入一样是depth为复数的长方体。

这样卷积后输出的长方体可以作为新的输入送入另一个卷积层中处理,有几个特征图depth就是几,那么下一层的每一个特征图就得用几个卷积核来对应处理,这个逻辑要清楚。

现在我们知道了一个卷积层的输出也是一个长方体。 那么这个输出长方体的(width, height, depth)由哪些因素决定和控制。

一文帮你深入学习卷积神经网络(CNN)的原理知识

矩阵乘法执行卷积:

如果按上面所说的以扫描的方式一步步计算局部节点和filter的权重的点乘,不能高效的利用GPU的并行能力。 要想利用好矩阵的方式,可以利用两个大矩阵的乘法来一次性囊括所有计算。

卷积层的每个输出节点其实都是由若干个输入节点的线性组合所计算(w的转秩✖)。所以我们可以使用矩阵的方式, 矩阵乘矩阵的意义可以理解为批量的线性组合按顺序排列。 其中一个矩阵可以表示权重w(下面的w1、w2、w3表示三个卷积核),另一个矩阵上一层的结点值(V1、V2、V3表示每层通道上的结点值)。一般权重放在矩阵乘法的左边。可以表示如下所示:

这里要说三个概念

1深度depth:卷积核(滤波器的个数)

2步长stride:每次滑动几步,步数越大得到的特征数越少,上面的例子中每次滑动1步。

3填充值zero-padding:我们设置了步长之后,很有可能某些位置滑不到,为了避免了边缘信息被一步步舍弃的问题,我们需要设置填充值来解决这个问题。还有一个问题,4x4的图片被2x2的filter卷积后变成了3x3的图片,每次卷积后都会小一圈的话,经过若干层后岂不是变的越来越小?zero padding就可以在这时帮助控制Feature Map的输出尺寸。

比如:

一文帮你深入学习卷积神经网络(CNN)的原理知识

4x4的图片在边缘Zero padding一圈后,再用3x3的filter卷积后,得到的Feature Map尺寸依然是4x4不变。

当然也可以使用5x5的filter和2的zero padding可以保持图片的原始尺寸,3x3的filter考虑到了像素与其距离为1以内的所有其他像素的关系,而5x5则是考虑像素与其距离为2以内的所有其他像素的关系。

规律: Feature Map的尺寸等于(input_size + 2 * padding_size − filter_size)/stride+1。

我们可以把池化层的作用总结一点就是,池化层其实就是在提取特征,池化层中最重要的是卷积核(训练出来的),不同的卷积核(不同特征图的)可以探测特定的形状、颜色、对比度等(就是什么神奇),然后特征图保持了抓取后的空间结构,所以不同卷积核对应的特征图表示某一维度的特征。特征图作为输入再被卷积的话,可以则可以由此探测到“更大”的形状概念

可以从下面这张图中感受到不同数值的filters所卷积过后的Feature Map可以探测边缘,棱角,模糊,突出等概念。

一文帮你深入学习卷积神经网络(CNN)的原理知识

我们通过这张图片可以看出来不同的卷积核作用在图片上效果是不一样的,所以我们不同的卷积核相当于提取的是某一维度的特征。

图片被识别成什么不仅仅取决于图片本身,还取决于图片是如何被观察的。而卷积核内的权重矩阵W是卷积神经网络根据数据学习得到的,也就是说,我们让神经网络自己学习以什么样的方式去观察图片。

一文帮你深入学习卷积神经网络(CNN)的原理知识

比如这副图像有些人可能看成是一个少女,有些人看成一个老妇,所以w究竟是什么?核我们的标记有关,当标签是少女时,卷积网络就会学习抓取可以成少女的形状、概念,w就是少女的时的权重矩阵。 当标签是老妇时,卷积网络就会学习抓取可以成老妇的形状、概念,w就是老夫的权重矩阵,这个很神奇。

上面就把卷积神经网络的中的卷积层讲解完了,它的核心就是在提取特征,下面讲解激励层的作用,激励层的作用可以理解为把卷积层的结果做非线性映射。

一文帮你深入学习卷积神经网络(CNN)的原理知识

上面的f表示激励函数,常用的激励函数有几下几种:

一文帮你深入学习卷积神经网络(CNN)的原理知识

我们先来看一下激励函数Sigmoid:导数最小为0,最大为1/4:

一文帮你深入学习卷积神经网络(CNN)的原理知识

Tanh(双曲正切):和sigmoid相比,它会关于x轴上下对应,不至于朝某一方面偏向

一文帮你深入学习卷积神经网络(CNN)的原理知识

ReLU(修正线性单元):收敛快,求梯度简单,较脆弱,左边的梯度为0,只要不是一条直线,那么就是非线性的。

一文帮你深入学习卷积神经网络(CNN)的原理知识

(Leaky ReLU);不会饱和/挂掉,不会“饱和”/挂掉,计算也很快,但是计算量比较大,a 是一个很小的值

一文帮你深入学习卷积神经网络(CNN)的原理知识

指数线性单元ELU:所有ReLU有的优点都有,不会挂,输出均值趋0,因为指数存在,计算量略大

一文帮你深入学习卷积神经网络(CNN)的原理知识

一些激励函数的使用技巧:不要用sigmoid,首先试RELU,因为快,但要小心点,如果RELU失效,请用Leaky ReLU或者Maxout,某些情况下tanh倒是有不错的结果。上面就是激励层,他就是将卷积层的线性计算的结果进行了非线性映射。可以从下面的图中理解。它展示的是将非线性操作应用到一个特征图中。这里的输出特征图也可以看作是“修正”过的特征图。如下所示:

一文帮你深入学习卷积神经网络(CNN)的原理知识

池化层

降低了各个特征图的维度,但可以保持大部分重要的信息。

池化层夹在连续的卷积层中间,压缩数据和参数的量,减小过拟合,池化层并没有参数,它只不过是把上层给它的结果做了一个下采样(数据压缩)。

下采样有两种非常用的方式:

Max pooling:选取最大的,我们定义一个空间邻域(比如,2x2 的窗口),并从窗口内的修正特征图中取出最大的元素,最大池化被证明效果更好一些。

Average pooling:平均的,我们定义一个空间邻域(比如,2x2 的窗口),并从窗口内的修正特征图算出平均值

一文帮你深入学习卷积神经网络(CNN)的原理知识

上面就是max pool方式,使用的是2*2的步长为2的,这样操作可以降低我们特征图的维度。

我们要注意一点的是:pooling在不同的depth上是分开执行的,也就是depth=5的话,pooling进行5次,产生5个池化后的矩阵,池化不需要参数控制。池化操作是分开应用到各个特征图的,我们可以从五个输入图中得到五个输出图。

一文帮你深入学习卷积神经网络(CNN)的原理知识

一文帮你深入学习卷积神经网络(CNN)的原理知识

无论是max pool还是average pool都会有部分信息被舍弃,那么部分信息被舍弃后会损坏识别结果吗?

因为卷积后的Feature Map中有对于识别物体不必要的冗余信息,我们下采样就是为了去掉这些冗余信息,所以并不会损坏识别结果。

我们来看一下卷积之后的冗余信息是怎么产生的?

我们知道卷积核就是为了找到特定维度的信息,比如说某个形状,但是图像中并不会任何地方都出现这个形状,但卷积核和没有出现这个形状的局部作用的时候也会产生一个值,但是这个值的意义就不是很大了,所以我们使用池化层的作用,将这个值去掉的话,自然也不会损害识别结果了。

比如下图中,假如卷积核探测"横折"这个形状。 卷积后得到3x3的Feature Map中,真正有用的就是数字为3的那个节点,其余数值对于这个任务而言都是无关的。 所以用3x3的Max pooling后,并没有对"横折"的探测产生影响。 试想在这里例子中如果不使用Max pooling,而让网络自己去学习。 网络也会去学习与Max pooling近似效果的权重。因为是近似效果,增加了更多的parameters的代价,却还不如直接进行Max pooling。

一文帮你深入学习卷积神经网络(CNN)的原理知识

到现在为止,我们已经从输入讲到了卷积层,激励层,池化层,这些层一起就可以从图像中提取有用的特征,并在网络中引入非线性,减少特征维度,同时保持这些特征具有某种程度上的尺度变化不变性。

最终的结果会作为全连接层的输入,下面我们来讲解一下全连接层。两层之间所有神经元都有权重连接,通常全连接层在卷积神经网络尾部。当前面卷积层抓取到足以用来识别图片的特征后,接下来的就是如何进行分类。 全连接层(前馈层)就可以用来将最后的输出映射到 。 通常卷积网络的最后会将末端得到的长方体平摊成一个长长的向量,并送入全连接层配合输出层进行分类。比如,在下面图中我们进行的图像分类有四个可能的输出结果。

一文帮你深入学习卷积神经网络(CNN)的原理知识

至此卷积神经网络就总结完了,还有一些总结的不是很好,网上也借鉴了一些高手的经验帖,感谢。


分享到:


相關文章: