卷积神经网络(CNN)模型结构

    在前面咱们讲述了DNN的模型与前向反向传播算法。而在DNN大类中,卷积神经网络(Convolutional Neural Networks,如下简称CNN)是最为成功的DNN特例之一。CNN普遍的应用于图像识别,固然如今也应用于NLP等其余领域,本文咱们就对CNN的模型结构作一个总结。html

    在学习CNN前,推荐你们先学习DNN的知识。若是不熟悉DNN而去直接学习CNN,难度会比较的大。这是我写的DNN的教程:git

深度神经网络(DNN)模型与前向传播算法github

深度神经网络(DNN)反向传播算法(BP)算法

深度神经网络(DNN)损失函数和激活函数的选择网络

深度神经网络(DNN)的正则化函数

1. CNN的基本结构

    首先咱们来看看CNN的基本结构。一个常见的CNN例子以下图:post

    图中是一个图形识别的CNN模型。能够看出最左边的船的图像就是咱们的输入层,计算机理解为输入若干个矩阵,这点和DNN基本相同。学习

    接着是卷积层(Convolution Layer),这个是CNN特有的,咱们后面专门来说。卷积层的激活函数使用的是ReLU。咱们在DNN中介绍过ReLU的激活函数,它其实很简单,就是$ReLU(x) = max(0,x)$。在卷积层后面是池化层(Pooling layer),这个也是CNN特有的,咱们后面也会专门来说。须要注意的是,池化层没有激活函数。htm

    卷积层+池化层的组合能够在隐藏层出现不少次,上图中出现两次。而实际上这个次数是根据模型的须要而来的。固然咱们也能够灵活使用使用卷积层+卷积层,或者卷积层+卷积层+池化层的组合,这些在构建模型的时候没有限制。可是最多见的CNN都是若干卷积层+池化层的组合,如上图中的CNN结构。blog

    在若干卷积层+池化层后面是全链接层(Fully Connected Layer, 简称FC),全链接层其实就是咱们前面讲的DNN结构,只是输出层使用了Softmax激活函数来作图像识别的分类,这点咱们在DNN中也有讲述。

    从上面CNN的模型描述能够看出,CNN相对于DNN,比较特殊的是卷积层和池化层,若是咱们熟悉DNN,只要把卷积层和池化层的原理搞清楚了,那么搞清楚CNN就容易不少了。

2. 初识卷积

    首先,咱们去学习卷积层的模型原理,在学习卷积层的模型原理前,咱们须要了解什么是卷积,以及CNN中的卷积是什么样子的。

    你们学习数学时都有学过卷积的知识,微积分中卷积的表达式为:$$S(t) = \int x(t-a)w(a) da$$

    离散形式是:$$s(t) = \sum\limits_ax(t-a)w(a)$$

    这个式子若是用矩阵表示能够为:$$s(t)=(X*W)(t)$$

    其中星号表示卷积。

    若是是二维的卷积,则表示式为:$$s(i,j)=(X*W)(i,j) = \sum\limits_m \sum\limits_n x(i-m,j-n) w(m,n)$$

    在CNN中,虽然咱们也是说卷积,可是咱们的卷积公式和严格意义数学中的定义稍有不一样,好比对于二维的卷积,定义为:$$s(i,j)=(X*W)(i,j) = \sum\limits_m \sum\limits_n x(i+m,j+n) w(m,n)$$

    这个式子虽然从数学上讲不是严格意义上的卷积,可是大牛们都这么叫了,那么咱们也跟着这么叫了。后面讲的CNN的卷积都是指的上面的最后一个式子。

    其中,咱们叫W为咱们的卷积核,而X则为咱们的输入。若是X是一个二维输入的矩阵,而W也是一个二维的矩阵。可是若是X是多维张量,那么W也是一个多维的张量。

3. CNN中的卷积层

    有了卷积的基本知识,咱们如今来看看CNN中的卷积,假如是对图像卷积,回想咱们的上一节的卷积公式,其实就是对输入的图像的不一样局部的矩阵和卷积核矩阵各个位置的元素相乘,而后相加获得。

    举个例子以下,图中的输入是一个二维的3x4的矩阵,而卷积核是一个2x2的矩阵。这里咱们假设卷积是一次移动一个像素来卷积的,那么首先咱们对输入的左上角2x2局部和卷积核卷积,即各个位置的元素相乘再相加,获得的输出矩阵S的$S_{00}$的元素,值为$aw+bx+ey+fz$。接着咱们将输入的局部向右平移一个像素,如今是(b,c,f,g)四个元素构成的矩阵和卷积核来卷积,这样咱们获得了输出矩阵S的$S_{01}$的元素,一样的方法,咱们能够获得输出矩阵S的$S_{02},S_{10},S_{11}, S_{12}$的元素。

     最终咱们获得卷积输出的矩阵为一个2x3的矩阵S。

    再举一个动态的卷积过程的例子以下:

    咱们有下面这个绿色的5x5输入矩阵,卷积核是一个下面这个黄色的3x3的矩阵。卷积的步幅是一个像素。则卷积的过程以下面的动图。卷积的结果是一个3x3的矩阵。

    上面举的例子都是二维的输入,卷积的过程比较简单,那么若是输入是多维的呢?好比在前面一组卷积层+池化层的输出是3个矩阵,这3个矩阵做为输入呢,那么咱们怎么去卷积呢?又好比输入的是对应RGB的彩色图像,便是三个分布对应R,G和B的矩阵呢?

     在斯坦福大学的cs231n的课程上,有一个动态的例子,连接在这。建议你们对照着例子中的动图看下面的讲解。

    你们打开这个例子能够看到,这里面输入是3个7x7的矩阵。实际上原输入是3个5x5的矩阵。只是在原来的输入周围加上了1的padding,即将周围都填充一圈的0,变成了3个7x7的矩阵。
    例子里面使用了两个卷积核,咱们先关注于卷积核W0。和上面的例子相比,因为输入是3个7x7的矩阵,或者说是7x7x3的张量,则咱们对应的卷积核W0也必须最后一维是3的张量,这里卷积核W0的单个子矩阵维度为3x3。那么卷积核W0其实是一个3x3x3的张量。同时和上面的例子比,这里的步幅为2,也就是每次卷积后会移动2个像素的位置。
    最终的卷积过程和上面的2维矩阵相似,上面是矩阵的卷积,即两个矩阵对应位置的元素相乘后相加。这里是张量的卷积,即两个张量的3个子矩阵卷积后,再把卷积的结果相加后再加上偏倚b。
    7x7x3的张量和3x3x3的卷积核张量W0卷积的结果是一个3x3的矩阵。因为咱们有两个卷积核W0和W1,所以最后卷积的结果是两个3x3的矩阵。或者说卷积的结果是一个3x3x2的张量。
    仔细回味下卷积的过程,输入是7x7x3的张量,卷积核是两个3x3x3的张量。卷积步幅为2,最后获得了输出是3x3x2的张量。若是把上面的卷积过程用数学公式表达出来就是:$$s(i,j)=(X*W)(i,j) + b = \sum\limits_{k=1}^{n\_in}(X_k*W_k)(i,j) +b$$
    其中,$n\_in$为输入矩阵的个数,或者是张量的最后一维的维数。$X_k$表明第k个输入矩阵。$W_k$表明卷积核的第k个子卷积核矩阵。$s(i,j)$即卷积核$W$对应的输出矩阵的对应位置元素的值。
    经过上面的例子,相信你们对CNN的卷积层的卷积过程有了必定的了解。
    对于卷积后的输出,通常会经过ReLU激活函数,将输出的张量中的小于0的位置对应的元素值都变为0。

4. CNN中的池化层

    相比卷积层的复杂,池化层则要简单的多,所谓的池化,我的理解就是对输入张量的各个子矩阵进行压缩。假如是2x2的池化,那么就将子矩阵的每2x2个元素变成一个元素,若是是3x3的池化,那么就将子矩阵的每3x3个元素变成一个元素,这样输入矩阵的维度就变小了。
    要想将输入子矩阵的每nxn个元素变成一个元素,那么须要一个池化标准。常见的池化标准有2个,MAX或者是Average。即取对应区域的最大值或者平均值做为池化后的元素值。
    下面这个例子采用取最大值的池化方法。同时采用的是2x2的池化。步幅为2。
    首先对红色2x2区域进行池化,因为此2x2区域的最大值为6.那么对应的池化输出位置的值为6,因为步幅为2,此时移动到绿色的位置去进行池化,输出的最大值为8.一样的方法,能够获得黄色区域和蓝色区域的输出值。最终,咱们的输入4x4的矩阵在池化后变成了2x2的矩阵。进行了压缩。
 

5. CNN模型结构小结

    理解了CNN模型中的卷积层和池化层,就基本理解了CNN的基本原理,后面再去理解CNN模型的前向传播算法和反向传播算法就容易了。下一篇咱们就来讨论CNN模型的前向传播算法。
 

(欢迎转载,转载请注明出处。欢迎沟通交流: liujianping-ok@163.com) 

参考资料:

1) Neural Networks and Deep Learning by By Michael Nielsen

2) Deep Learning, book by Ian Goodfellow, Yoshua Bengio, and Aaron Courville

3) UFLDL Tutorial

4)CS231n Convolutional Neural Networks for Visual Recognition, Stanford

相关文章
相关标签/搜索