最近看到知乎发如今讲解理论知识比有些博客容易理解不少,这里记一篇卷积神经网络理论知识python
原地址:https://zhuanlan.zhihu.com/p/50800849程序员
对于即将到来的人工智能时代,做为一个有理想有追求的程序员,不懂深度学习(Deep Learning)这个超热的领域,会不会感受立刻就out了?做为机器学习的一个分支,深度学习一样须要计算机得到强大的学习能力,那么问题来了,咱们究竟要计算机学习什么东西?答案固然是图像特征了。将一张图像看作是一个个像素值组成的矩阵,那么对图像的分析就是对矩阵的数字进行分析,而图像的特征,就隐藏在这些数字规律中。
深度学习对外推荐本身的一个很重要的点——深度学习可以自动提取特征。本文主要介绍卷积层提取特征的原理过程,文章经过几个简单的例子,展现卷积层是如何工做的,以及概述了反向传播的过程,将让你对卷积神经网络CNN提取图像特征有一个透彻的理解。那么咱们首先从最基本的数学计算——卷积操做开始。
假设有一个5*5的图像,使用一个3*3的卷积核(filter)进行卷积,获得一个3*3的矩阵(实际上是Feature Map,后面会讲),以下所示:算法
下面的动图清楚地展现了如何进行卷积操做(其实就是简单的点乘运算):网络
一个图像矩阵通过一个卷积核的卷积操做后,获得了另外一个矩阵,这个矩阵叫作特征映射(feature map)。每个卷积核均可以提取特定的特征,不一样的卷积核提取不一样的特征,举个例子,如今咱们输入一张人脸的图像,使用某一卷积核提取到眼睛的特征,用另外一个卷积核提取嘴巴的特征等等。而特征映射就是某张图像通过卷积运算获得的特征值矩阵。
讲到这里,可能你们还不清楚卷积核和特征映射究竟是个什么东西,有什么用?不要紧,毕竟理解了CNN 的卷积层如何运算,并不能自动给咱们关于 CNN 卷积层原理的洞见。为了帮助指导你理解卷积神经网络的特征提取,咱们将采用一个很是简化的例子。
在CNN中有这样一个问题,就是每次给你一张图,你须要判断它是否含有"X"或者"O"。而且假设必须二者选其一,不是"X"就是"O"。理想的状况就像下面这个样子:机器学习
那么若是图像若是通过变形、旋转等简单操做后,如何识别呢?这就比如老师教你1+1等于2,让你独立计算1+2等于几是一个道理,就像下面这些状况,咱们一样但愿计算机依然可以很快而且很准的识别出来:学习
这也就是CNN出现所要解决的问题。
以下图所示,像素值"1"表明白色,像素值"-1"表明黑色。对于CNN来讲,它是一块一块地来进行比对。它拿来比对的这个“小块”咱们称之为Features(特征)。在两幅图中大体相同的位置找到一些粗糙的特征进行匹配,CNN可以更好的看到两幅图的类似性。
对于字母"X"的例子中,那些由对角线和交叉线组成的features基本上可以识别出大多数"X"所具备的重要特征。人工智能
这些features颇有可能就是匹配任何含有字母"X"的图中字母X的四个角和它的中心。那么具体究竟是怎么匹配的呢?以下三个特征矩阵a,b,c:spa
观察下面几张图,a能够匹配到“X”的左上角和右下角,b能够匹配到中间交叉部位,而c能够匹配到“X”的右上角和左上角。3d
把上面三个小矩阵做为卷积核,就如第一部分结尾介绍的,每个卷积核能够提取特定的特征,如今给一张新的包含“X”的图像,CNN并不能准确地知道这些features到底要匹配原图的哪些部分,因此它会在原图中每个可能的位置进行尝试,即便用该卷积核在图像上进行滑动,每滑动一次就进行一次卷积操做,获得一个特征值。仔细想一想,是否有一点头目呢?
(下图中求平均是为了让全部特征值回归到-1到1之间)orm
最后将整张图卷积事后,获得这样的特征矩阵:
使用所有卷积核卷积事后,获得的结果是这样的:
仔细观察,能够发现,其中的值,越接近为1表示对应位置和卷积核表明的特征越接近,越是接近-1,表示对应位置和卷积核表明的反向特征越匹配,而值接近0的表示对应位置没有任何匹配或者说没有什么关联。
那么最后获得的特征矩阵就叫作feature map特征映射,经过特定的卷积核获得其对应的feature map。在CNN中,咱们称之为卷积层(convolution layer),卷积核在图像上不断滑动运算,就是卷积层所要作的事情。同时,在内积结果上取每一局部块的最大值就是最大池化层的操做。CNN 用卷积层和池化层实现了图片特征提取方法。
经过上面的学习,咱们知道CNN是如何利用卷积层和池化层提取图片的特征,其中的关键是卷积核表示图片中的局部特征。
而在现实中,使用卷积神经网络进行多分类获目标检测的时候,图像构成要比上面的X和O要复杂得多,咱们并不知道哪一个局部特征是有效的,即便咱们选定局部特征,也会由于太过具体而失去反泛化性。还以人脸为例,咱们使用一个卷积核检测眼睛位置,可是不一样的人,眼睛大小、状态是不一样的,若是卷积核太过具体化,卷积核表明一个睁开的眼睛特征,那若是一个图像中的眼睛是闭合的,就很大可能检测不出来,那么咱们怎么应对这中问题呢,即如何肯定卷积核的值呢?
这就引出了反向传播算法。什么是反向传播,以猜数字为例,B手中有一张数字牌让A猜,首先A将随意给出一个数字,B反馈给A是大了仍是小了,而后A通过修改,再次给出一个数字,B再反馈给A是否正确以及大小关系,通过数次猜想和反馈,最后获得正确答案(固然,在实际的CNN中不可能存在百分之百的正确,只能是最大可能正确)。
因此反向传播,就是对比预测值和真实值,继而返回去修改网络参数的过程,一开始咱们随机初始化卷积核的参数,而后以偏差为指导经过反向传播算法,自适应地调整卷积核的值,从而最小化模型预测值和真实值之间的偏差。
举一个简单例子。绿色箭头表明前向传播,红色表明为反向传播过程,x、y是权重参数,L为偏差,L对x、y的导数表示偏差L的变化对x、y的影响程度,获得偏导数delta(x)后,x* = x-η*delta(x),其中η为学习率,从而实现权重的更新。
在此放一个简单的反向传播代码,python版本,结合代码理解BP思想。
连接: https://pan.baidu.com/s/1WNm-rKO1exYKu2IiGtfBKw 提取码: hwsu
本文主要讲解基本CNN的原理过程,卷积层和池化层能够提取图像特征,通过反向传播最终肯定卷积核参数,获得最终的特征,这就是一个大体的CNN提取特征的过程。考虑到反向传播计算的复杂性,在本文中不作重点讲解,先做为了解思路,往后专门再讲解反向传播的方法原理。
咱们的学习过程也像神经网络同样,不断地进行自学习和纠错,提高自身实力。学无止境,但愿本文可让你有那么一点点的收获。