机器学习系列(5):卷积神经网络CNN之--原理及python实现

机器学习系列(5):卷积神经网络CNN之--原理及Python实现

图片挂了,大家可以移步以下链接:
https://mp.weixin.qq.com/s?__biz=MzU4NTY1NDM3MA==&mid=2247483814&idx=1&sn=cbca57110684f795521fa5c96595360c&chksm=fd8608abcaf181bdab6a49da042f953429ee2d315d5e8eca74d7418ac14f39defc2d2b684193&token=255604471&lang=zh_CN#rd

CNN原理解释:

  • 计算机视觉
  • 边缘检测
  • Padding
  • 卷积步长
  • 单卷积层
  • 池化层
  • 卷积神经网络示例
  • 为什么选择CNN

Python实现:

  • 见文章内容

申明

本文原理解释及公式推导部分均由LSayhi完成,供学习参考,可传播;代码实现部分的框架由Coursera提供,由LSayhi完成,详细数据及代码可在github查阅。
https://github.com/LSayhi/DeepLearning

CSDN博客:https://blog.csdn.net/LSayhi

微信公众号:AI有点可ai(文末附二维码,感谢您的关注)

1.计算机视觉

  • 计算机视觉是一门研究如何使机器学会“看”的学科,让机器能够从图像或多维图像中感知。其应用广泛,比如人脸识别、自动驾驶、风格转换等。在本系列先前的个人笔记中,我们将深度神经网络应用于识别猫,虽然取得了不错的效果,但是训练分类器的时间较长,本次我们将介绍卷积神经网络(CNN),这种流行的网络结构广泛应用于计算机视觉领域,并取得了很好的效果。

2.边缘检测

  • 在本系列之前的识别猫的笔记中,我们提到了应用深度全连接的神经网络进行分类,当图像像素比较高时,将会遇到非常大的麻烦。举例说明,如Figure 1所示,若图片大小为1000×1000×3,第一层隐藏层神经元个数为1000,那么的维度将是1000×3M=30亿,与数据量相比大很多,很容易发生过拟合,而且巨大的参数数量,对内存的需求急剧增大,若图片的边长为n,那么这种需求是,这显然不适合于大规模计算。卷积神经网络通过卷积运算,大大减小了深度学习的计算量,而且在效果上表现更突出。

Figure 1 : MLP实现的分类器

  • 边缘检测是卷积神经网络的一个概念,它的作用是提取出图片中物体的边缘信息(可以认为是一种滤波),网络可以根据提取到的特征进行分类。如Figure 2所示,边缘检测通过两个边缘检测器(滤波器,也叫核,即kernel),分别检测出了图片的垂直边缘和水平边缘,这就是边缘检测的简单示例。那么边缘检测是如何作用的又是如何实现的,举个例子来说,见Figure 3,假设图片中像素值越大的部位越亮,反之越暗,那么经过一个垂直检测器(Figure 3中)后,过滤出来的新图片(Figure 3右)检测出了原来图片(Figure 3左)的明暗交界边缘。事实上改变过滤器中的值的大小和分布可以构造出形式各样的检测器。

    Figure 2 : 边缘特征


    Figure 3 : 卷积示意
  • 那么这个过滤的操作是什么呢?其实就是“卷积运算”(和数学上定义的卷积稍有不同,在数学定义中卷积运算在对应元素相乘之前,会有一个对Kernel先反向,在CNN中我们不进行反向,原因是其不影响对边界特征的提取,关于此点,可参见个人专题笔记《机器学习中的数学--卷积运算》),以图Figure 3说明这里“卷积”的含义,图中左边是一个图片的像素矩阵,中间是过滤器,右边是新检测出的边缘图片,左边有三种颜色标记的框,经过“卷积”运算后,对应在右边相应颜色的输出位上,看出来了吧,这里的卷积指的是矩阵的元素乘积求和,然后移动Kernel再次求和,最后拼成新的矩阵。所以改变过滤器,可改变输出的新图形(称为特征)。在卷积神经网络中,我们把过滤器中的值当作参数让网络去学习,这样可以自动给出具体的值,并且可以检测任何角度的边缘特征,通过这种计算方式,我们提取特征的方式从全连接变成了卷积,参数数量减小为过滤器的大小O(J×K),过滤器的个数L,时间复杂度降为O(J×K×L),不再是输入维数的平方量级,这大大减小了深度学习的计算量。

Padding:

  • Padding,顾名思义为填充。前面提到,我们在做特征提取时,用到的是卷积运算,由于其运算特点,容易发现其对整张图片的边沿部分的数值在计算中使用较少,而在其它区域,其数值不止使用较多,这意味这对于边沿部分提取到的特征较少,而且可以发现,每次进行特征提取后,图像的大小减小了,但你可能不想让某次的图像减小。为了解决这两个问题,CNN引入了Padding思想,即在卷积运算之前,图像外沿先填充新的像素点,这样边缘信息能被更好的提取,新出来的特征图像大小也会更大,通过合适选择填充像素圈数(设为p)和Kernel的大小,可以控制输出特征图像的大小,常见的有等维度输出,半维度输出等。如图Figure 4,对一个6×6大小的图像,经过3×3大小的Kernel,其输出图像维度为4×4,而当我们在外圈填充一层像素之后,图像先变成了8×8,然后经过3×3的kernel,输出图像依然是6×6,这就是padding的作用。

Figure 4 : Padding举例

卷积步长:

  • 在以上的描述中,Kernel每次移动的步长都是1,如果把每次移动的步长定义为卷积步长(Stride,简略为S表示),那么提取出来的特征图像与步长为1时大小不一样,例如当S为2时,输入输出大小的的关系如图Figure 5。

Figure 5 : 卷积步长

  • 一般的,容易得到特征矩阵的大小与原图像和Kernel的关系可用下式表示(假设原图像大小为n×n,Kernel的大小为f×f,Padding的大小为P,那么输出的大小为.

三维卷积

  • 三维卷积即是一维卷积和二维卷积的推广,事实上N维空间上的卷积形式是一样的,这里特地介绍三维卷积是为了描述RGB图像的边缘提取,黑白图像的维度可以用二维平面表示,而彩色图像需要用三维空间来表示,因为彩色图像有三个通道,所以在做卷积运算时,kernel的维度为从二维增加到三维,第三个维度的大小与彩色图像的必须通道数相同,Figure 6是三维卷积的演示,注意输出不是4×4×3,而是4×4×1。

Figure 6 : 三维卷积示意

单卷积层

  • 以上是卷积神经网络的基础描述,下面介绍单层卷积神经网络的具体实现。以图Figure 7为例,单层神经网络在三维卷积的基础上增加了一个Kernel个数的维度,显然输出最后一个维度也自然成了三维Kernel的个数K,和全连接神经网络一样,我们也加入了激活函数。单卷积层相当于在提取图像的特征。从这里可知,不管输入图像多大,参数的数量只由Kernel的大小和个数确定,因此参数数量远远小于全连接神经网络。

Figure 7 : 单层卷积神经网络

池化层pooling

  • 池化层是一层对图像进行另一种处理的层,直观来说,这一层的作用是提取区域特征,从实际效果上看,这种方式确实提升了CNN的“看”的能力。Figure 8是池化的一个示例,此例中使用的是最大池化(Max pooling),即取对应区域的最大值,此外常用的还有平均值池化等。
  • 池化层也有对应的Kernel,步长等参数,但是不同于卷积层的Kernel,这些参数并不需要由网络学习得到,我们给定Kernel的大小和步长后,计算是确定的(卷积层的Kernel参数还有每个Kernel里的数字,池化层没有),所以池化层不会额外增加新的参数,且由于其能缩小图像尺寸,反而能加快训练。当输入图像是三维的时候,kernel也对应增加为3维,同样输出也增加为3维(不同于卷积运算,因为在卷积层,kernel的个数是可以改变的,这增加输出的一个维度,而在池化层,kernel的个数确定是1,所以为了能使池化的输出作为卷积的输入,取最大值时,不会在三维空间取,而是在二维平面取完后,在第三个维度拼接)。

Figure 8 : 二维最大池化


Figure 9 : 三维最大池化

卷积神经网络示例

  • 卷积神经网络由输入层、卷积层、池化层、全连接层,输出层复合而成,除了输入输出层固定为1层外,其它层均不固定,以下就是一个经典的卷积网络LeNet-5的例子,如所示。

    Figure 10 : 卷积神经网络LeNet-5

为什么选择CNN

  • 参数共享机制:在卷积神经网络中,参数是kernel的值,这些值对所有的区域都是一样的,因此参数的数量可以做到比较少,能有效的防止过拟合。
  • 稀疏连接机制:在卷积网络的输出中,每一个“小格子”的输出只与输入图像和其对应的部分有关,而已其它部分无关,计算量较小。
  • 高级特征提取:不断使用卷积池化的过程相当于不断提取更高级的特征。

PYTHON实现

本文相应的代码及资料已经以.ipynb文件和.pdf形式在github中给出。

.ipynb文件在链接/Coursera-deeplearning深度学习/课程4/week1/

.pdf文件在链接/Coursera-deeplearning深度学习

github地址:https://github.com/LSayhi/DeepLearning

你可能感兴趣的:(机器学习系列(5):卷积神经网络CNN之--原理及python实现)