计算机视觉与卷积神经网络

卷积神经网络的结构

我们知道神经网络的结构是这样的:
在这里插入图片描述

卷积神经网络也是一个层级网络的结构,只是层的功能和形式做了变化,可以说是传统神经网络的一个改进。下图是一个典型的卷积神经网络的结构。
在这里插入图片描述

卷积神经网络的层级结构包括以下层:

  • 数据输入层/ Input layer
  • 卷积计算层/ CONV layer
  • ReLU激励层 / ReLU layer
  • 池化层 / Pooling layer
  • 全连接层 / FC layer

数据输入层

该层要做的处理主要是对原始图像数据进行预处理,其中包括:

  • 去均值:把输入数据各个维度都中心化为0,如下图所示,其目的就是把样本的中心拉回到坐标系原点上。
  • 归一化:幅度归一化到同样的范围,如下所示,即减少各维度数据取值范围的差异而带来的干扰,比如,我们有两个维度的特征A和B,A范围是0到10,而B范围是0到10000,如果直接使用这两个特征是有问题的,好的做法就是归一化,即A和B的数据都变为0到1的范围。
  • PCA/白化:用PCA降维;白化是对数据各个特征轴上的幅度归一化

去均值与归一化效果图:

在这里插入图片描述

去相关与白化效果图:

在这里插入图片描述

卷积计算层

这一层就是卷积神经网络最重要的一个层次,也是“卷积神经网络”的名字来源。

卷积计算

卷积神经网络主要是用来对图像进行处理的。我们先来看一下怎样对一幅图像进行卷积计算。

在这里插入图片描述
上图左侧一列是一幅773的图像的数据。我们用一个333的张量(图中第2列的3个33的方块,我们成为filter,或者卷积核)对其做卷积操作,偏置项是1,用到的步长是2,得到一个新的33的方块,也就是第4列的第1个方块。其中的3是这样得到的:((00+00+0*(-1))+(01+10+20)+(00+10+01))+((00+01+0*(-1))+(0*-1+01+2(-1))+(00+2(-1)+20))+((00+01+0*(-2))+(01+0(-1)+10)+(00+20+0(-1)))+1=-3。做完这次卷积操作之后,按步长2滑动窗口进行下一次卷积操作,。。。,直至算出第4列的第1个方块的所有9个值。图中第3列是另一个filter,我们用它对原始图像做卷积操作,得到第4列的第2个方块。第一个filter我们记作w1,第二个filter我们记作w2,它们对应两个神经元的权值,而这两个神经元的输出就是第4列的两个方块。

下面的动画描述了上面的全部计算过程。

在这里插入图片描述

padding

在上面的卷积计算中,我们将一个77大小的原始图像,通过一个33的filter进行步长为2的卷积计算,最后得到了一个33的图像。一般地,如果原始图像的大小是nn,filter的大小是f*f,步长是s,则最后得到的图像大小是
( n f s + 1 ) ( n f s + 1 ) (\frac{n-f}{s}+1)*(\frac{n-f}{s}+1)

这样做卷积运算的缺点是,卷积图像的大小会不断缩小,另外图像的左上角的元素只被一个输出所使用,所以在图像边缘的像素在输出中采用较少,也就意味着你丢掉了很多图像边缘的信息,为了解决这两个问题,就引入了padding操作,也就是在图像卷积操作之前,沿着图像边缘用0进行图像填充。通过进行适当宽度的填充,就可以保证输出图像和输入图像一样大。
假如填充宽度是p,则输出图像的大小是
( n + 2 p f s + 1 ) ( n + 2 p f s + 1 ) (\frac{n+2p-f}{s}+1)*(\frac{n+2p-f}{s}+1)

卷积计算的作用

假如你有一张如下的图像,你想让计算机搞清楚图像上有什么物体,你可以做的事情是检测图像的垂直边缘和水平边缘。通过卷积计算可以得到图像的边缘。

在这里插入图片描述
如下图,左边的矩阵中0表示图像暗色区域,10为图像比较亮的区域,通过一个3*3过滤器对图像进行卷积,得到的图像中间亮,两边暗,亮色区域就对应图像边缘。 这个过滤器就称为水平过滤器,通过它可以进行图像的水平边缘检测。
在这里插入图片描述

同样,通过下面的垂直过滤器,就可以进行图像的垂直边缘检测。
在这里插入图片描述
通过其它的一些过滤器,我们还可以得到图像的颜色,纹理等等信息。

在这里插入图片描述
但是,在卷积神经网络中,这些过滤器的值是多少我们并不知道,这正是我们要学习的参数,卷积神经网络训练的目标就是去理解过滤器的参数。这就是我们把这些过滤器称为w1,w2,…的原因。

参数共享机制

  • 在卷积层中每个神经元连接数据窗的权重是固定的,每个神经元只关注一个特性。神经元就是图像处理中的滤波器,比如边缘检测专用的Sobel滤波器,即卷积层的每个滤波器都会有自己所关注一个图像特征,比如垂直边缘,水平边缘,颜色,纹理等等,这些所有神经元加起来就好比就是整张图像的特征提取器集合。
  • 通过参数共享,使得需要估算的权重个数减少: AlexNet 1亿 => 3.5w
  • 一组固定的权重和不同窗口内数据做内积: 卷积

激励层

激励层的作用是把卷积层输出结果做非线性映射。

在这里插入图片描述

CNN采用的激励函数一般为ReLU(The Rectified Linear Unit/修正线性单元),它的特点是收敛快,求梯度简单,但较脆弱,ReLU函数的图像如下。
在这里插入图片描述

激励层的实践经验:
①不要用sigmoid!不要用sigmoid!不要用sigmoid!
② 首先试RELU,因为快,但要小心点
③ 如果2失效,请用Leaky ReLU或者Maxout
④ 某些情况下tanh倒是有不错的结果,但是很少

池化层

池化操作分为最大池化(Max pooling)和平均池化(Average pooling)两种,实际用的较多的是最大池化。先来看最大池化。
下图中,我们将左边的矩阵分成4个区域,然后对每个区域取其最大值,就得到了右边的矩阵。其实在这里我们选择了2*2的过滤器,步长为2,过滤器的功能是取最大值。
在这里插入图片描述

如下图,当我们选择一个3*3的过滤器,步长为1时,池化操作就得到了右边的矩阵。

在这里插入图片描述

而平均池化与最大池化的唯一区别是我们把取最大值变成了求平均值。

我们看到,数据经过池化之后,数据量变小了。池化层的具体作用是:

  1. 特征不变性,也就是我们在图像处理中经常提到的特征的尺度不变性,池化操作就是图像的resize,平时一张狗的图像被缩小了一倍我们还能认出这是一张狗的照片,这说明这张图像中仍保留着狗最重要的特征,我们一看就能判断图像中画的是一只狗,图像压缩时去掉的信息只是一些无关紧要的信息,而留下的信息则是具有尺度不变性的特征,是最能表达图像的特征。

  2. 特征降维,我们知道一幅图像含有的信息是很大的,特征也很多,但是有些信息对于我们做图像任务时没有太多用途或者有重复,我们可以把这类冗余信息去除,把最重要的特征抽取出来,这也是池化操作的一大作用。

  3. 在一定程度上防止过拟合,更方便优化。

全连接层

两层之间所有神经元都有权重连接,通常全连接层在卷积神经网络尾部。也就是跟传统的神经网络神经元的连接方式是一样的:

在这里插入图片描述

一般CNN结构依次为
  1. INPUT
  2. [[CONV -> RELU]*N -> POOL?]*M
  3. [FC -> RELU]*K
  4. FC

卷积神经网络的训练算法

卷积神经网络的训练算法跟一般机器学习算法是一样的,即先定义Loss function,衡量和实际结果之间差距。然后最小化损失函数的W和b, CNN中用的算法是SGD(随机梯度下降)。

卷积神经网络的优缺点

优点
  • 共享卷积核,对高维数据处理无压力
  • 无需手动选取特征,训练好权重,即得特征分类效果好
缺点
  • 需要调参,需要大样本量,训练最好要GPU
  • 物理含义不明确(也就说,我们并不知道没个卷积层到底提取到的是什么特征,而且神经网络本身就是一种难以解释的“黑箱模型”)

猜你喜欢

转载自blog.csdn.net/ajaccio8899/article/details/82877616