卷积神经网络(一)- Foundations of Convolutional Neuron Networks

来源:互联网 发布:淘宝拍卖房产靠谱吗 编辑:程序博客网 时间:2024/06/15 15:19

从本篇开始将是 deeplearning.ai的第四门课程,卷积神经网络

对于机器视觉任务来说,普通的神经网络将不再适用,最主要的原因来自于数据量太大,前面课程的练习中,面对图像分类任务,我们使用普通神经网络就可以完成是因为图片像素低,而现实的任务,高像素的图片随处可见,1000x1000的RGB图像,光输入就达到3M的数量级,如果进行全连接,第一层的权重将非常巨大,极易造成overfitting等诸多问题,于是我们引入卷积操作。

Edge Detection Example

在之前的课程中,我们提到过,在机器视觉任务中,浅层网络提取出的是edge特征,然后结合edges我们在网络中层合成部分人脸,最后呢合成特征脸。那么所谓边缘检测到底是如何实现的呢,接下来就通过例子来说明,并引入卷积操作。
下图左边为一个6x6的矩阵,可以想象为一张图片或者是图片的一部分,那么中间的3x3是我们的卷积核,也可以理解为是一个滤波器(filter),中间的*符号代表的就是卷积操作,那么卷积操作实际上就是卷积核在图像上依次滑动,然后与对应部分对应相乘再相加的结果。最终呢,3x3在6x6的图像上依次滑动会生成一个4x4的矩阵。(这里需要提一句,学过卷积的同学呢,知道其实这并不是卷积,这其实是互相关操作,卷积其实是要将核进行顺时针180°翻转,然后再对应相乘相加,不过由于图像中,核一般都是对称的,所以在机器学习中,按照惯例呢,不去纠结是否需要翻转,通常把互相关也叫做卷积,而且实际很多机器学习库函数也是没有进行翻转的)
这里写图片描述
那么它是怎么起到边缘检测作用的呢,看下图就明白了,我们将数值矩阵对应的图像放在矩阵下面,我们执行上面说到的卷积操作,使用相同的卷积核对左边的图像进行卷积,得到右边的图像,我们发现它其实找到了左边图像的竖向边缘。那么这一结果的生成其本质是我们运用了这样一个3x3的卷积核(左边的像素亮,右边的像素暗),是使用它我们才找到了这个左图中的竖向的边缘。
这里细心的朋友发现,这个生成的edge好像略微有点宽,这个会有影响吗,其实这个主要是因为这个图像太小,对于现实任务中的大图像1000x1000,那么这个检测出的edge将会非常好。
这里写图片描述

More Edge Detection

刚刚我们讲述了如何完成竖向边缘检测,那么本节呢,第一我们讲述positive edge和negative edge的区别(也就是图像明到暗和暗到明带来的edge的变化),第二讲述一些别的边缘检测器以及如何使用算法自动学习生成edge detector而不是我们去人为制定。
那么同样进行竖向边缘检测,使用同样的卷积核,我们将图像翻转,生成的特征图也会发生数值翻转,30变为-30(明变暗),那么对于同样的卷积核来说,生成边缘的不同,说明了对于卷积核来说,原来图像的边缘变化(明到暗,还是暗到明),当然如果我们不在意这种变化,可以取绝对值。
这里写图片描述
那么有竖向边缘检测,当然就有横向边缘检测,有了竖向检测的基础,相信大家也猜到横向边缘检测的卷积核的样子了
这里写图片描述
既然如此,那么我们可以将这个3x3的卷积核视为一个需要学习的权值矩阵,然后利用反向传播算法来学习这9个权值,这样就不需要人为的去设定,而是通过数据来学习是需要一个竖向检测还是一个横向检测又或者需要一个45度,70度,73度等的矩阵。
这里写图片描述

Padding

在讲述深度神经网络之前,我们需要提到一个关于卷积操作的改进,那就是padding。
在上面提到的卷积操作中,我们发现使用3x3的卷积核去卷积6x6的矩阵生成的是一个4x4的矩阵,这是因为3x3的矩阵在6x6的矩阵上每个方向只能放置4个3x3的矩阵,也就是3x3的卷积核在每个方向上只能滑动3次,如果再滑动的话就会掉出到图像之外。
我们假设图像的长宽为n,卷积核长宽为f,那么由此得到的特征图大小就是n-f+1,于是有6-3+1=4。但是这样的卷积呢有两个问题,第一是输出维度的衰减(shrinking output),尽管可能我们图片的像素很高,但是如果我们层数太多,那么经过很多层之后,图像会太小。第二个问题是对于边角上的像素呢,会丢失很多信息,如下图左,打上绿色阴影的就是原图的左上角像素,如果普通卷积的话,它只会被卷积一次,而红色阴影的像素将会被卷积9次,那么自然对于绿色像素来说就会有信息丢失。那么为了解决这两个问题,我们引入padding,字面意义就是填充,其实就是在图像外围来填充0,我们叫做zero-padding。如果padding一圈,那么就变成8-3+1=6,这样图像就不会缩小,而且边角像素也会被多次利用。
这里写图片描述
这里需要提到一般我们有两种padding方式,一种是SAME,一种是VALID。那么关于这两种方式呢,这里不详述,请参考CNN_MNIST那篇博客会有详细解读。

Strided Convolutions

带步长的卷积同样也是卷积中的一个基本的构建单元。那么首先讲一下什么是步长,步长(stride)就是卷积核在图像上每次移动的步数,上面所有提到的卷积的步长都是1,所以使用3x3去卷积6x6,可以移动3次,如果步长为2,那么就只能移动1次了。当然是对于VALID padding来说。那么具体的讲解呢,也请参考CNN_MNIST那篇博客,会结合tensorflow来讲解。

Convolutions Over Volume

本节呢,讲述体积层面的卷积也就是三维卷积,本节呢也希望大家能够结合CNN_MNIST来进行理解,在实际操作中,单纯的2d卷积是不存在的,首先对于RGB图像来说,输入其实就是一个三通道的矩阵,也就是一个三维矩阵,那么层与层之间,由于卷积时,往往不会只单单提取一个特征,所以每一层都会有多个卷积核,那么每一层最后就会生成多通道的特征图,那么就又是三维的卷积了。光讲显得有些不好理解,看下图。
左边为RGB图像,为了完成三维卷积,那么卷积核对应的通道也要是一样的,所以会有3个3x3的二维卷积核来拼成一个三维卷积核。那么三维图像和三维卷积核呢也是对应相乘再相加,也就是最后呢是生成一张二维的特征图。
这里写图片描述
那么刚才提到了,我们不希望每次只提取一种特征,这样太低效了,于是我们会同时使用多个卷积核,来提取多种特征,比如一个是提取vertical edge,一个提取horizontal edge等。最后呢,多张生成的二维特征图拼接起来就又是一个三维图像了。那么可以看出我们的卷积核其实是4维的。那么更加具体的讲解请参考CNN_MNIST,结合tensorflow将更好理解。
这里写图片描述

One Layer of a Convolutional Network

那么有了上述的一些基础知识呢,我们来看看具体的一层卷积网络。
下图略微有点乱啊,主要不想讲的太细,就不分别截图了。其本质上呢,就是图像在经过刚才讲的多个三维卷积之后,会各自生成一个4x4的特征图,然后对这个特征图我们要加上一个bias,然后再经过ReLU。
这里就要去类比我们普通的神经网络,也是输入与权重相乘加上bias再经过非线性激活。
这里写图片描述
那么对于上述这个带有10个卷积核的卷积层,到底有多少参数呢,其实也就 (3x3x3+1)x10=280个,不管输入有多大,参数个数始终是不变的,这就是卷积神经网络的一个特点,参数共享,对于一个卷积核来说,一张图片的卷积都是该卷积核不断滑动卷积完成,也就是所有卷积参数共享。由于这个特性呢,参数个数就会非常小,也就不容易过拟合。
对于单层卷积网络进行总结,下图就是各个部分的维度,就不展开描述了。
这里写图片描述

Simple Convolutional Network Example

这个部分呢,主要是提供一个具体的简单卷积神经网络的例子,这个例子就不细讲了,对于卷积神经网络的每一层参数变化,在我翻译的论文中都有多次提到,而且比这个复杂,弄懂那个,这个就非常简单了。
这里写图片描述

Pooling Layers

在卷积神经网络结构中,往往会使用池化层减小特征图的大小来加速网络的运算,同时也使得我们检测到的特征更加鲁棒。池化一般分为两种一种是最大值池化,一种是平均值池化。下面是一个最大值池化的例子。
从左边到后面,其实就是把对应颜色区域中的最大值提取出来。这里我们对比卷积呢,同样也有f和s,f在这里表示我们池化的区域大小,其实也等价于是一个滤波器,s代表这个滤波器的移动步长。
Andrew教授给我们提供了一种直观上理解max pooling的思路,我们知道一张特征图其实是上一层的输出经过激活函数后得到的图像,那么图像上较大的数字呢,说明我们探测到了某种特征,比如下图左上区域的9就说明在图像的左上区域我们有探测到这一特征,而右上区域数值小,说明没有这种特征。那么最大值池化所做的就是,如果我们在图像上某处检测到了一种特征,那么我们可以通过最大值池化将它保留下来,如果没有检测到特征就算取该区域的最大值也依然是一个小值,比如下图左的右上区域,最大值是2。这样就完成了计算量的减少,以及特征的更加鲁棒。当然Andrew教授也说,人们使用max pooling的最大原因是因为它在实际的实验中取得了很好的效果,其背后真正的含义,为什么能取得好的成果,其实人们并没有真正的了解。
最大值池化还有一个特点就是,它没有参数可以学习,只有一些需要设定的超参数,比如f和s等,当这些确定之后,池化层就确定了。
这里写图片描述
那么接下来讲讲另一种池化,平均值池化,相信大家看到这个名字应该就猜出个大概了,也就是对同样的区域我们不再取最大值而是取它们的平均值作为输出,超参数也是一样的,同样也没有需要学习的参数。
值得一提的是,最大值池化在网络中的运用更多一些,而平均值池化往往是运用在网络很深的情况,来collapse我们的特征(这里这个collapse呢,单词本意是坍塌,折叠,那么这里大家意会一下,不是很好翻译),关于这一点可以参考NIN和GoogLeNet,里面均会用到平均值池化。
同样的关于池化的具体呢可以去参考一下,CNN_MNIST这篇博文。
这里写图片描述

CNN Examples

本节呢,介绍了一个完整的CNN例子,介绍的是最为经典的LeNet-5网络,也是最基础的CNN网络,具体不细讲。贴出表格。
这里写图片描述
值得注意的是,池化层是没有参数的,卷积层的参数其实是很少的,网络的大部分参数都集中在FC层中,还有网络激活值的size是缓慢减小的。

Why Convolutions

在本篇开头就提到了,为什么对于机器视觉任务来说,一般的神经网络是不行的,参数太多太多,难以计算,容易过拟合,于是引出了卷积,经过上面所有的讲解我们发现卷积确实是大大减小了参数,那么它究竟是为什么可以这样做呢,又是怎么做到的呢。
1. 参数共享,这个点在之前稍微提到了一点,也就是对于一个卷积核,我们用它来卷积整个图像,那么对于整个图像来说,共享了一个卷积核。那么这样做的道理在于,一个对于图像某部分有用的特征检测器有很大的可能对于图像的另一部分也适用,比如竖向边缘检测,一个图像可能有很多地方都存在着竖向边缘,那么就不需要分别对图像不同部分去学习不同的卷积核,而是可以使用同一个。尽管很多程度上,图像的数据分布是不一致的,但是同样不同部分的图像的数据分布又是可能极其相似的。
2. 稀疏连接,下图右边的每个像素都只跟左边的9个像素有关系,和其余剩下的27个像素无关,这就是稀疏连接,这也是参数大大减小的原因之一。
这里写图片描述

阅读全文
0 0
原创粉丝点击