卷积神经网络

通俗理解1

卷积神经网络主要包括卷积层,池化层和全连接层三部分。卷积层用来识别这些特定线条,池化层用来减少图像的数据量,提升识别效率,全连接层用来识别判断。

卷积层:图像上一个黄色的X,黄色的像素设为1,白色的像素点设为0,要想识别这个X,只要识别出一个右下的斜线,和一个左下的斜线就可以了。首先识别右下斜线,这时我们找一个3×3的卷积核(局部特征,即需要识别的线条),这个卷积核也是一个右下斜线。用图像左上角3×3的区域与卷积核相应的像素点相乘再相加,得到结果2,依次计算得到表格。表格中的数值越大,表示越符合卷积核右下斜线的特征,基本上数值较大的部分,就是原图像右下斜线的部分。(数值计算是内积计算。向量的内积的几何意义就是投影,可以理解为A线投影在B线的长度与B线长度的乘积。数值越大就代表特征越相似)

池化层:对图像进行压缩。将四个像素点的最大值保留就可以了(最大池化)。可以看到压缩后的图像依旧保持原来的特征。(也叫下采样)

全连接层:把两个3×3的图像展开成一维数组,并且拼接起来。在识别前要拿样本图像对计算机进行训练,训练之后计算机就会对特定图像保存一个特征数组。然后计算机用识别图像得的数组和训练之后的数值做对比,根据相似度就能识别物体了。(全连接层可以理解为一个函数,把展开后的数组扔进去,最终会输出该图像是某一物体的概率)

通俗理解2

损失函数:损失函数就是用来表现预测与实际数据的差距程度。目标是把损失函数降到最低。

超参数:超参数是在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据。通常情况下,需要对超参数进行优化,给学习机选择一组最优超参数,以提高学习的性能和效果。

卷积与池化

对于全连接层而言,一张三维图像,将所有像素展开得到一个3072维的向量,把向量和权值矩阵相乘,如下图的例子:

这里用10行数据与这个3072维的输入进行点积运算,然后得到一个数字,就是该神经元的值,这个例子中应该有10个这样的值。

对于卷积层而言,它和全连接的主要差别是它可以保全空间结构,例如下图中就可以保持图片的结构,这个三维输入的结构:

然后将5*5*3的卷积核在整个图像上滑动,计算出每一个空间定位时的点积结果。首先,采用卷积核总是会将输入量扩展至整个卷积层,所以它们都是一个很小的空间区域,它们通常会遍历所有通道。就像下图中将卷积核的每个位置元素和与之对应图像区域的像素值相乘,经过运算后得到的点积,结果是W^T+b。

接下来继续讨论如何滑动卷积核并遍历所有空间位置,我们将这个卷积核从左上方边角处开始,让卷积核遍历输入的所有像素点,在每一个位置都进行点积运算,以最简单的方式一个像素一个像素的滑动,持续相应的操作并相应的填满输出激活映射。我们可以按照同样的方法使用多个卷积核进行计算,将会得到多层的激活映射。

简单描述一下在卷积神经网络中是如何使用这些卷积层的,ConvNet基本上是由多个卷积层组成的一个序列,它们依次堆叠,然后用激活函数对其进行逐一处理,比如说一个ReLU激活函数;然后将得到一些比如Conv和ReLU的东西以及一些池化层;

完成了对一个堆叠的卷积层的学习之后,前面几层的卷积核一般代表了一些低阶的图像特征,比如说一些边缘特征;而对于中间层的卷积核,可以看到一些更复杂的图像特征,比如边角和斑点等;而后面的几层,会看到更加丰富的内容。

卷积神经网络整体上来看就是输入一个图片,让它通过很多层,比如卷积层、非线性层、池化层,经过这些处理后,最终得到卷积层输出,然后就可以用全连接层连接所有的卷积层输出,用其获得一个最终的分值函数。

(卷积神经网络的层数–应用权值的次数。6个卷积+1fc全连接->7层)

接下来用一个例子来理解这个过程,还是用刚才前面提到的这个32*32*3的图像,用5*5*3的卷积核在图像上滑过:

假设实际上用的7*7的输入(此处假设只是为了方便),有一个3*3的卷积核,接下来将卷积核从左向右滑动(每一滑动1个步长),最后将得到一个5*5的输出,因为在水平和垂直方向都是5个空间位置。

现在如果让每次滑动的步长为2,那么最终得到一个3*3的输出;如果采用步长为3,就不能和图像完美的拟合,这样是行不通的,不会这样去做卷积。因为它会导致不对称的输出。输出的计算公式和结果如下图:

但是如果使用0来填补(可以帮助获得全部尺寸的输出),得到:

此时滑动的步长为1时,可以得到7*7的输出矩阵,因此此时N=9;同样的,滑动的步长为2时,得到4*4的输出矩阵;滑动步长为3时,则得到3*3的输出矩阵。

如果处理的图像是多层叠在一起的,会发现如果不做零填充或者其他形式的填充,输出图像的尺寸会迅速减小,这并不好,因为这会损失很多的信息,意味着只能使用很少的值来表示原始图像。

总结卷积层:

(1)有特定维数的输入W1*H1*D1

(2)各种参数:卷积核大小,步长大小,0填充大小。

视觉之外的神经网络

从大脑神经元的角度分析一个卷积层。

在每个位置,会取一个卷积核与图像的特定部分之间的一个点积,从而得到一个数值结果;基于同样的想法,取输入值和权值矩阵W之间的点积,然后得到一个输出值;但是它们的主要区别在于神经元具有局部的连接性,所以不关注所输入图片的全部而是关注图像空间的一个局部区域。

假设有一个5*5的卷积核,也可以称为5*5的接收区域,也就是输入区域,对一个5*5的滤波器,都将让他们划过整个图像空间,但是这些卷积核都具有相同的权重和参数。

卷积核的数量就是所谓的深度,假设有5层的卷积核,那么从这个网格中就得到了一个5*28*28尺寸的输出,这些不同的卷积核作用于图像的相同区域当中。

另一个需要提到的方面是每隔几个卷积层就有一个池化层夹在中间。

一开始有一个图像,经过卷积层,得到的是每一个滑过输入图像的卷积核的激活映射。把激活映射送进ReLU得到一些这样的值,在池化层得到的数据就是前面ReLU层输出,这就做了降采样,取出所有卷积核对应位置上的最大值,每一层的输出都是一个积累的结果。这样得到的全连接层把所有的信息聚合到一起,得到一组分类的分值,每个值代表复合的复杂概念的受激程度。

这些池化层所要做的是要让所生成的表示更小且更容易控制,且降低采样率处理,比如进行一个空间的降采样,然而并不在深度方向上的池化处理,只在平面上做:

最常见的方法是最大池化法,例如下面的例子中,池化层也有一个卷积核的大小,如果使用一个步长为2的2*2的滤波器,让这个卷积核滑过整个输入部分,取滑过区域中的最大值。

对于池化层来说是的,通常是让它们没有任何重叠,可以通过降采样的处理,对一个给定区域避免重叠的处理。

下面是训练卷积网络的演示程序,可以点进去用它在CIFAR-10上训练卷积网络,这样可以对激活映射有更多的了解。

笔记

官方笔记

通俗理解卷积神经网络

全连接层

可视化1,2,3

理解cnn