在前面的两篇博客中,咱们介绍了DNN(深度神经网络)并使用keras实现了一个简单的DNN。在这篇博客中将介绍CNN(卷积神经网络),而后在下一篇博客中将使用keras构建一个简单的CNN,对cifar10
数据集进行分类预测。html
咱们能够想一个例子,假如咱们如今须要对人进行识别分类,根据咱们人类的思惟,咱们确定是比较他的👀是否是同样的,👃是否是同样大小,是否是双(or 三)下巴。换句话来讲,咱们的判断标准是一个可视的范围。git
CNN就是受到了人类视觉神经系统的启发,使用卷积核来代替人类中的视野,这样既可以下降计算量,又可以有效的保留图像的特征,同时对图片的处理更加的高效。咱们能够想想前面介绍的DNN网络,它是将一个一个的像素点进行计算的,毋庸置疑,这样必然会带来参数的膨胀,好比说cifar-10中一张32*32*3的图像,第一个隐藏层的中的单个神经元就有\(32 \times 32 \times 3 = 3072\)个权重,彷佛挺小的,可是若是图片的像素再大一点,则参数会飞速猛增,同时参数增长的同时就会致使过拟合。github
下图是我使用DNN网络去训练cifar-10获得的结果,能够明显的看到过拟合:算法
而CNN就是将DNN中复杂的问题简单化(实际上更复杂,可是参数简单化了)。这里借用Easyai的几张图和几段话:网络
在下面的场景中,有⚪是1,不然就是0,⚪的位置不一样,产生的数据也就不一样,可是从视觉的角度上面来讲,两张图的内容是差很少的,只在于⚪的位置的不一样罢了。ide
而 CNN 解决了这个问题,他用相似视觉的方式保留了图像的特征,当图像作翻转,旋转或者变换位置时,它也能有效的识别出来是相似的图像。函数
下面是一张来自cs231n中一张识别汽车的图,使用的是CNN网络,里面包含了CNN网络的网络层:spa
在上图中的CNN网络中,网络层有一下类型:3d
能够很明显的看到,CNN网络与DNN网络有类似,也有不一样。在CNN网络中,使用了卷积层和池化层,最后才使用全链接层,而卷积层就是CNN的核心。可是在DNN网络中所有都是全链接层。code
下面将对这几层进行介绍,其中参考了YouTube上How Convolutional Neural Networks work这个视频。该视频有条件的建议去看一看,讲的仍是蛮形象生动的。
咱们以识别一张照片是X
仍是O
做为咱们的识别目的:
咱们如何识别一张新的图片是X
仍是O
,确定是拿该照片与已有的标准X
和O
照片进行对比,哪个类似度高,则就认为新的照片是属于哪个类别。对比对于人类来讲很简单,可是,对于计算机来讲,应该怎么对比呢?
计算机能够进行遍历图片的每个像素点的像素值,而后与标准图片的像素值进行比较,可是毋庸置疑,这样确定是不行的,好比说在下图中计算机就认为只有中间的是同样的,其它四个角都不一样,所以可能会得出这张图片不是X
这个结论。
可是咱们确定是但愿无论在平移,旋转,仍是变形的状况下,CNN模型均可以识别出来。
so,咱们将比较范围由像素点扩大到某一个范围,在CNN模型中,会比较两张图片的的各个局部,这些局部称之为特征(features)。
每个feature都是一张小图,也就是更小的二维矩阵。这些特征会捕捉图片中的共同要素。以X
图片为例,它最重要的特征就是对角线和中间的交叉。也就是说,任何叉叉的线条或中心点应该都会符合这些特征。
那么如何判断一张图片中是否有相符合的特征,而后符合的特征有多少个,这里咱们使用数学的方法卷积(convolution)进行操做,这个也就是CNN名字的由来。
下面我仍是将以识别X
做为例子来说解一下如何进行进行卷积。卷积的目的是为了计算特征与图片局部的相符程度。
计算的步骤以下:
若是咱们将这个\(3 \times 3\)的特征矩阵沿着该图片以stide = 1(也就是每次滑动一格),能够获得一个\(7 \times 7\)的矩阵,最终获得的结果以下图所示:
很容易理解,卷积以后的结果越接近1,则至关与对应位置与特征feature越接近。分别与三个特征进行卷积的结果以下所示,获得了feature map:
这里是一张来自cs231n的一张卷积示意图:
不过这里与上面不一样的是,它并无取平均值,同时加上了一个偏置\(b\),同时最后的结果是三个的的卷积的和。而且加上了一个padding(也就是外面那一层灰色取0的地方)
设输入的为\(W_1 \times H_1 \times D_1\),卷积核的大小是\(F \times F\),卷积核的数量是\(K\),padding的大小是\(P\),stride步为\(S\),输出的矩阵的大小是\(W_2 \times H_2 \times D_2\),则:
整流线性单位函数(Rectified Linear Unit, ReLU),又称修正线性单元, 是一种人工神经网络中经常使用的激励函数(activation function),一般指代以斜坡函数及其变种为表明的非线性函数。数学表达式为:
Relu激励层的工做流程以下所示:
将卷积层的输出经过激励层后的结果以下:
这一层仍是蛮简单的,可能你们会发现,在深度神经网络中,sigmoid激活函数就不多使用了,这是由于sigmoid函数过小了,在多层神经网络下会出现”梯度消失“现象。
池化层就更加的简单了,池化层能够大幅度的下降数据的维度。池化层多种,下面介绍两种简单经常使用的:
average pooling
):计算图像区域的平均值做为该区域池化后的值。max pooling
):选图像区域的最大值做为该区域池化后的值。那么池化是怎么操做的呢,下面是最大池化进行操做的示意图:
池化层也就是从必定的范围(也就是池化层的大小)中选出一个(或者计算出一个)值做为这个区域范围的表明。
对全部的feature map都进行池化,最后的结果以下:
由于最大池化(max-pooling)保留了每个小块内的最大值,因此它至关于保留了这一块最佳的匹配结果(由于值越接近1表示匹配越好)。这也就意味着它不会具体关注窗口内究竟是哪个地方匹配了,而只关注是否是有某个地方匹配上了。这也就可以看出,CNN可以发现图像中是否具备某种特征,而不用在乎到底在哪里具备这种特征。这也就可以帮助解决以前提到的计算机逐一像素匹配的死板作法。
设输入的为\(W_1 \times H_1 \times D_1\),池化层的大小是\(F \times F\),stride步为\(S\),输出的矩阵的大小是\(W_2 \times H_2 \times D_2\),则:
咱们将前面所讲的卷积层,激励层,池化层进行结合,所得:
加大网络的层数就获得了深度神经网络:
经过前面得卷积,池化操做,咱们成功得将数据进行了降维,获得降维后的数据后,咱们在将其放入全链接层中,就能够获得最终得结果。
仍是以上面识别X为例子:
咱们称之这一层为全链接层。
固然全链接层也能够有多个:
综上,全部得结构咱们能够表达为:
同时咱们能够与CS231n的图片做比较,二者是同样的。
这一篇博客主要是介绍了每一层的功能,以及每一层工做的原理,可是并无对其数学公式继续宁推导,若是想更多的了解CNN的前向和反向传播算法,能够去参考这一篇博客。
在下一篇博客中,将介绍使用CNN对cifar-10(也多是cifar-100)进行训练预测。