Machine Learning,  Programming

卷积神经网络CNN

卷积神经网络是一类包含卷积计算且具有深度结构的前馈神经网络,是深度学习的代表算法之一,擅长处理图像识别等相关问题。

卷积网络通过一系列方法,将数据量庞大的图像识别问题不断降维,最终使其能够被训练。

卷积(Convolution)

卷积神经网络中的核心即为卷积运算,其相当于图像处理中的滤波器运算,对于一个卷积核

avatar

卷积核W中的每一个权值w分别和覆盖的原图像X中对应的像素相乘,然后求和,如:

avatar

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

avatar

举一个标准的卷积运算例子,初始位置的计算过程是:1×1+1×0+1×1+0x0+1×1+1×0+0x1+0x0+1×1=4

avatar

对于一个大小为n的原图像,经过大小为 f的卷积运算后,其输出图像的尺寸为n-f+1

卷积不仅仅可以发生在二维图像上,也可以发生在三维立体上。

来看一个例子,假如说不仅想检测灰度图像的特征,也想检测 RGB 彩色图像的特征。如果彩色图像是6×6×3,这里的3指的是三个颜色通道,可以想象成3个6×6图像的堆叠,为了检测图像的边缘或者其他的特征,不是把它跟原来的3×3的过滤器做卷积,而是跟一个三维的3×3×3的过滤器卷积,这样这个过滤器也有三层,对应红绿、蓝三个通道。

给这些起个名字(原图像),这里的第一个6代表图像高度,第二个6代表宽度,这个3代表通道的数目。同样地,过滤器也有一个高,宽和通道数,并且图像的通道数必须和过滤器的通道数匹配,所以这两个数(紫色方框标记的两个数,3)必须相等。 avatar

把过滤器先放到最左上角的位置,这个3×3×3的过滤器有27个数,27个参数就是3的立方,依次取这27个数,然后乘以相应的红绿蓝通道中的数字:

  • 先取红色通道的前9个数字
  • 然后绿色通道
  • 然后蓝色通道
  • 乘以黄色立方体覆盖的对应的27个数
  • 相加,得到第一个数字

如果要计算下一个输出,就把这个立方体滑动一个单位,执行上面的操作,以此类推

avatar

那么,这个有什么用?

举个例子,这个过滤器是3×3×3的,如果想检测图像红色通道的边缘,那么可以将第一个过滤器设为[[1 0 -1],[1 0 -1],[1 0 -1]],而绿色和蓝色通道全为0,这样三个矩阵堆叠在一起形成了一个333的过滤器,且只对红色通道有用

avatar

 

步长(stride)

滑动一定的间距,但这个间距该如何定义呢? 这个概念就是卷积的 “步长”(stride)。

stride = 1 表示卷积核滑过每一个相距是 1 的像素,是最基本的单步滑动,作为标准卷积模式。Stride 是 2 表示卷积核的移动步长是 2,跳过相邻像素,输出图像缩小为原来的 1/2。Stride 是 3 表示卷积核的移动步长是 3,跳过 2 个相邻像素,图像缩小为原来的 1/3,以此类推 avatar

填充(Pooling)

在卷积过程中,存在两个问题:

  • 每次卷积,图像就会缩小,从6×6缩小到4×4,再多做几次之后,比如当一个100层的深层网络,每经过一层图像都缩小,经过100层网络后,就会得到一个很小很小的图像,可能是1×1,可能是别的,但我们不想让图像在每次识别边缘或其他特征时都缩小
  • 对于图像边缘的像素,只被一个输出使用,但图像中间的元素,则被多个输出使用。这意味着卷积过程丢掉了图像边缘位置的许多信息。

对于这个问题,可以用额外的“假”像素(通常为0,经常使用的术语为“零填充”)填充边缘。

是否选择填充像素,有两个选择,分别叫做Valid卷积核Same填充。

  • Valid卷积意味着不填充,即图像会通过卷积逐渐缩小
  • Same卷积意味填充

池化(Pooling)

随着模型网络不断加深,卷积核越来越多,要训练的参数还是很多,直接拿卷积核提取的特征直接训练容易出现过拟合的现象,可以使用“池化”来解决这种问题。

池化就是将输入图像进行缩小,减少像素信息,只保留重要信息,为了有效地解决过拟合问题,池化可以减少数据,但特征的统计属性仍能够描述图像,而由于降低了数据维度,可以有效地避免过拟合。

给出池化的定义,对不同位置区域提取出有代表性的特征(进行聚合统计,例如最大值,平均值等),这种聚合的操作就叫做池化,池化的过程通常也被称为特征映射的过程(特征降维),如图:

avatar

池化主要有两种,除了最大值池化(Max Pooling),还有平均值池化(Average Pooling),随机池化用的较少。

最大池化是对局部的值取最大;平均池化是对局部的值取平均;随机池化是根据概率对局部的值进行采样,采样结果便是池化结果。概念非常容易理解,其示意图如下所示:

avatar

三种池化的意义:

  • 最大池化可以获取局部信息,可以更好保留纹理上的特征。如果不用观察物体在图片中的具体位置,只关心其是否出现,最大池化效果比较好
  • 平均池化能保留整体数据的特征,能凸出背景的信息
  • 随机池化中元素值大的被选中的概率也大,但不是像最大池化总是取最大值。随机池化一方面最大化保证了Max值的取值,一方面又确保不完全是Max值起作用,造成过度失真,因此它可以在一定程度上避免过拟合

 

激活函数

为了使神经网络能够拟合出各种复杂的函数,必须使用非线性激活函数,用来加入非线性因素,把卷积层输出结果做非线性映射

要知道,网络的输出仅仅只是输入特征的线性组合。实际上,无论网络有多少层,整体完全可以仅使用1层表示,引入其他线性函数依然起不到任何作用,因为线性函数的组合本身仍是线性函数。

常用的激活函数有sigmoid,tanh,relu等

局部感知

来看一个例子:

avatar

如果采用经典的神经网络,则需要读取整幅图像作为神经网络模型的输入(即全连接),这样导致图像尺寸越大,其连接的参数越多,计算量也更大,这是我们不能接受的。

而人类对外界的认知一般是从局部到全局、从片面到全面,先对局部有感知的认识,再逐步对全体有认知,这是人类的认识模式。类似的,在机器识别图像时也没有必要把整张图像按像素全部都连接到神经网络中,局部范围内的像素之间联系较为紧密,而距离较远的像素则 相关性较弱。因而,每个神经元其实没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息。这种模式就是卷积神经网络中降低参数数目的重要神器:局部感受野,节省了内存

参数共享

每张自然图像(人物、山水、建筑等)都有其固有特性,也就是说,图像其中一部分的统计特性与其它部分是接近的。这也意味着这一部分学习的特征也能用在另一部分上。因此,在局部连接中隐藏层的每一个神经元连接的局部图像的权值参数(例如5×5),将这些 权值参数共享 给其它剩下的神经元使用,那么此时不管隐藏层有多少个神经元,需要训练的参数就是这个局部图像的权限参数(例如5×5),也就是卷积核的大小,这样大大减少了训练参数。如下图所示:

avatar

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

avatar

感受野

感受野用来表示网络内部的不同神经元对原图像的感受范围的大小,即为每一层输出的特征图上的像素点在原始图像上映射的区域大小。

神经元之所以无法对原始图像的所有信息进行感知,是因为在这些网络结构中普遍使用卷积层和pooling层,在层与层之间均为局部连接。神经元感受野的值越大表示其能接触到的原始图像范围就越大,也意味着它可能蕴含更为全局,语义层次更高的特征;相反,值越小则表示其所包含的特征越趋向局部和细节。因此感受野的值可以用来大致判断每一层的抽象层次。 avatar

可以看到在Conv1中的每一个单元所能看到的原始图像范围是33,而由于Conv2的每个单元都是由22范围的Conv1构成,因此回溯到原始图像,其实是能够看到5*5的原始图像范围的。因此我们说Conv1的感受野是3,Conv2的感受野是5。输入图像的每个单元的感受野被定义为1,这应该很好理解,因为每个像素只能看到自己

发表评论

电子邮件地址不会被公开。 必填项已用*标注