卷积神经网络(简称CNN)最先能够追溯到20世纪60年代,Hubel等人经过对猫视觉皮层细胞的研究代表,大脑对外界获取的信息由多层的感觉野(Receptive Field)激发完成的。在感觉野的基础上,1980年Fukushima提出了一个理论模型Neocognitron是感觉野在人工神经网络领域的首次应用。1998年,Lecun等人提出的LeNet-5模型在手写字符识别上取得了成功,引发了学术界对卷积神经网络的关注。2012年,Krizhevsky 等人提出的AlexNet模型在ImageNet图像分类竞赛中取得第一名的成绩,其模型准确度领先第二名11%。在AlexNet以后,VGG(Visual Geometry Group)、GoogLeNet、ResNet也相继被提出。网络
咱们也能够用ANN进行图片分类。可是,在将ANN用于图片分类会致使模型参数过多。例如,训练的图片大小为100x100x3,第一层隐层的神经元数目为1000时,参数就达到3x107。所以,须要人们利用先验知识来简化ANN以达到减小模型的参数,而简化后的结构就是CNN。机器学习
ANN的简化依据:①对于一个神经元来讲,并不须要链接图片的全局区域,只须要链接局部区域的信息来检测局部物体,如图1-1所示。ide
图1-1 总体区域与局部区域函数
②同一个物体可能会出如今不一样图片的不一样区域。若有的鸟嘴位置在左上角,而在另外一张图片中间,如图1-2所示学习
图1-2 鸟嘴在不一样的区域spa
③对图片进行子采样,不会对人对图片内容的理解产生太大影响。能够把图片的奇数行、偶数列的像素去掉,使图片变为原图片的1/4,但不影响咱们理解图片内容,如图1-3所示。子采样能够减少图片大小继而减小模型参数量。3d
图1-3 图片子采样对象
卷积层主要进行卷积操做。咱们先定义一个过滤器(也称做卷积核),其实就是一个矩阵(如图1-4所示)blog
图1-4 过滤器图片
以图1-4和1-5为例,卷积操做就如图1-6所示。卷积操做就是过滤器跟过滤器覆盖的图片局部区域(如图1-5的红色区域)对应的每一个像素先相乘后累加。假设过滤器上的每一个像素值为fij,图片上被覆盖区域的像素为amn,那么卷积操做就是
图1-5 image
图1-6 卷积操做
在完成卷积后,会挪动过滤器再进行卷积操做,挪动的距离称做步长(stride)。假定步长为1,则向右移动,如图1-7所示。单个过滤器在图片上完成卷积的动态过程如图1-8所示
图1-7 步长
图1-8 完整的卷积操做
过滤器的卷积计算的做用在于若是有图片的局部区域跟过滤器比较类似,在进行卷积后的输出值会比较大,卷积后的值越大,就代表检测到对应物体。过滤器的大小只覆盖图片的局部区域,就对应“ANN简化依据①”;而在挪动过程当中,过滤器是不变的,则能够检测不一样区域上相同的物体,对应的就是“ANN简化依据②”。过滤器在挪动过程当中对应的参数也就是不变的,所以也被称做权值共享。
对于一个输入图片,咱们能够设置多个过滤器来进行卷积。例如,咱们使用5个过滤器来进行卷积,就获得5个相同大小的特征图。这些特征图会重新组合成为高度为5的图片,做为下一层卷积的输入。因此,卷积以后只会获得一个图片,图片的深度就是过滤器的数量。
卷积层在完成卷积操做后会获得一个矩阵,这个矩阵被称做特征图(Feature Map)。池化就是将特征图分为若干区域,每一个区域用一个值来进行表示。如图1-9,将特征图分为4个2x2区域,每一个区域用最大值来进行表示(固然也能够采用均值,最小值等其余操做)。
图1-9 最大池化操做
池化层的做用就是缩小特征图,获得一个更小的子图来表征原图。所以池化操做对应了“ANN简化依据③”。
CNN的整个训练过程跟ANN并无太大区别,都是利用BP来完成参数更新。可是,因为CNN中有增长权值共享这一特性,所以在更新的时候须要特别处理。如图1-10所示,在进行前向传播时,不一样颜色的权重的值是同样的。可是在进行BP更新参数时,因为输入值不同,所以计算出来的梯度也是不同的。为了使全部不一样颜色的权重值同样,能够分别计算出相同颜色的每个权重的梯度,再取平均值。最后,让每个权重更新一样的值就能够。
图1-10 权值共享
CNN在图像处理上确实取得了成功,可是因为CNN的内部过于复杂,人们每每将CNN看作一个黑盒子。所以,咱们仍是须要去探究,CNN到底学习到了什么。
如何知道各层的过滤器在检测的对象?对于一个正常的流程,应该是咱们输入一张图片,进行卷积后的输出值越大,说明过滤器就是在检测这个对象。所以,咱们须要反推正常的流程。即在肯定使输出值越大的前提下,去生成输入的图片。
过滤器通过卷积后的矩阵(如图1-10所示)的各个元素记做,k表示第k个过滤器。评估函数为
,求解的目标是
,利用梯度上升就能够完成的求解。
图1-10 特征图
过滤器学习到的检测对象,如图1-11所示。每个过滤器都会检测不一样的对象,有些是竖线,有些是横线等。
图1-11 过滤器的检测对象
咱们能够利用跟过滤器检测对象一样的方法,生成出全链接层神经元的检测对象。如图1-12所示。跟过滤器的检测对象不同的是,全链接层的神经元输出更像是全局对象,而不是检测局部对象。
图1-12 全链接层神经元的检测对象
当咱们考虑输出层神经的检测对象时,采用跟过滤器检测对象相同的作法,获得的结果如图1-13所示,显然获得的结果很是糟糕,由于根本不知道生成的图片是什么。
图1-13 输出层神经元的检测对象
可是,你把1-13中的8做为CNN的输入,输出的结果会表示该图片是8。所以,深度神经网络彷佛也不是那么智能,很容易被欺骗。为了让输出层神经元的检测对象看过去更像是一个数字,须要对评估函数作一些修改。对于数字而言,数字线条占总图片大小的区域并非不少。所以,咱们须要让生成的x*尽量小。最终的评估函数为
跟原先的评估函数相比,其实就是多了L1正则化这一项。为么是评估函数值越大,L1就须要越小越好。新的评估函数会获得稍微更好的结果,如图1-14所示
图1-14 L1后的输出层神经元的检测对象
Deep Dream就是你给一张图片,而后机器会根据图片内容,增长机器看到的物体(效果图如图1-15所示)。Deep Dream的大体思想跟检测对象的作法是类似。
图1-15 Deep Dream效果图
Deep Dream的作法流程如图1-16所示,给定一张图片,得到图片的输出向量。对于输出向量,其中令正值越大,负值越小。这个作法就是要夸张化CNN所检测的对象。最后利用修改后的向量做为目标,来反向从新调整图片。
图1-16 Deep Dream大体流程
Deep Style是给定两张图片,一张是偏内容,一张是偏风格。而后,将两种图片进行“融合”,效果如图1-17所示
图1-17 Deep Style效果图
Deep Style的大体思想如图1-18所示,一个CNN提取图片的内容;一个CNN提取图片的风格,图片的风格主要体如今过滤器与过滤器输出值之间的关联性。则最终要构造的图片应该能使输出跟左边的内容很类似,且过滤器输出值之间的关联性跟右边的很类似。
图1-18 Deep Style思想
将CNN用在下围棋的话,则输入是当前棋盘就是,输出就是下一子的位置。对于整个棋盘,咱们能够用(1,-1,0)表明(黑子,白子,无子)。而CNN以后以能够用来下围棋,缘由在于将围棋的一些特性跟“ANN简化依据”类似。在围棋上,有时候并不须要全局的信息,并且这种局部信息可能会在棋盘的不一样位置。可是,围棋不像图片,不能进行子采样。所以,将CNN应用于围棋时,应该去掉池化层。
图1-19 围棋