美文网首页
CNN原理篇—其实没有你想象那么难

CNN原理篇—其实没有你想象那么难

作者: 不分享的知识毫无意义 | 来源:发表于2020-01-19 22:11 被阅读0次

    这篇文章尝试把CNN拆解开来说,让大家都可以看懂CNN,并且知道以此为基础的变体网络都是怎么工作的。

    1.CNN核心概念

    • 卷积核(filter)
      就是一个矩阵,一般有3×3,5×5,7×7的,里边的数字就是我们要训练的参数,用这个矩阵去跟原始输入矩阵矩阵乘后求和,再经过滑动之后就得到一个矩阵,就是经过卷积以后得到的原输入矩阵的降维矩阵。
    • 特征图(feature map)
      输入数据的维度,可以这么理解,图像有RGB三个通道,每一通道都可以通过矩阵表示图像特征,每一个通道就是一个feature map。这个作用于卷积结果计算的时候,如果只有一个feature map就是对应位置相乘后求和,如果有3个feature map就是三个位置求和。
    • 池化(pooling)
      主要作用是在保留关键信息的同时降低维度,可以防止过拟合。常用的池化方法有平均池化、最大池化和随机池化等,其中最大池化用的比较多。
    • 填充(padding)
      如果我们不断的对输入进行卷积操作,那么剩下的特征维度会越来越小,为了避免这种情况出现,提出了填充的概念。填充的核心思想是图像周边被卷积到的次数要明显小于图像中间部分,容易导致信息的丢失,因此可以采取在四周增加0的方式进行图像的填充。填充以后的图像如果经过卷积输入维度不变,这种填充方式叫做SAME,如果填充之后的图像如果经过卷积输入维度改变了,这种填充方式叫做VALID。SAME是向上取整,VALID是向下取整。
    • 激活函数
      激活函数的作用就是模拟人的神经系统,只对部分的输入有感知。激活函数一般都是非线性的,具体可以参考我写的那篇激活函数的文章,常用的有sigmoid、softmax、Relu等,用非线性可以达到那个目的,就是在足够多层数下可以拟合任意复杂的函数。
    • 全连接(Full Connect)
      全连接层就是把经过卷积、池化、激活得到的所有feature map拉平以后,通过wx+b的模式得到最终的输出,然后用sigmoid或者softmax去计算所属的类别。全连接层可以有好几层,但是最后一层一般和分类问题的最后类别有关系,通常是一样的。
    • 反向传播
      反向传播是神经网络优化目标函数的主要方法,通过反向传播可以不断优化参数,反向传播其实是神经网络中最不好理解的地方,这个应该注意。
      以上就是卷积神经网络几乎全部重要的概念,如果你不需要知道参数优化的概念,这些层叠加以后,你用keras或者pytorch就可以傻瓜式的搭建深度学习模型了。

    2.CNN流程

    一个完整的卷积神经网络包括以下流程:

    • 输入层
      这一层就是你的初始数据,比如一个图像分类问题,以矩阵形式输入,维度为3*28*28,即三个通道,每一个通道用28*28的数据表示图片信息。
    • 卷积层
      卷积层是卷积神经网络中最重要的一层,就是用卷积核去与原始输入相互计算,就是对应位置相乘相加,然后滑动,得到下一层的输出。这里比较重要的是参数计算问题。
      科普:卷积后的输出大小计算


      参数计算公式

      其中I是输入的长度,K是卷积核的大小,P是padding的大小,S是步长,算完以后别忘了加1。
      池化层的计算方法差不多,但不会影响到feature map的个数。
      卷积核三维相乘就是本轮的参数多少。

    • 池化层
      采用最大或者平均池化的方法,对卷积层的输出进行降维,降维以后的输出大小计算公式与卷积层差不多。
    • 全连接层
      把经过卷积和池化操作后的输出拉平,经过全连接层输出,全连接有可能不止一层,但最后一层的输出尺寸一定和分类类别相同。


      卷积神经网络一个完整流程案例

    3.CNN的反向传播

    反向传播是深度学习基础中最难的,这个也是参数优化的基本方法,不同的网络结构有不同的问题,大家需要注意一下。
    反向传播是在前向传播基础上进行的,前向传播至最后,我们得到一个输出和一个目标函数。

    3.1 普通深度神经网络(DNN)的反向传播过程

    • 输出层求梯度
      首先知道最终的输出是怎么计算出来的:


      输出计算公式

      以平方损失函数为案例,有如下的损失函数形式:


      平方损失函数
      接下来要求参数W和b,根据梯度下降原理有:
      参数的梯度方向
      在链式求导法则中,基本所有计算都依赖于损失函数对输出的求导,这一部分可以提前计算:
      损失函数对输出的求导形式
    • 反向传播求梯度
      根据链式求导法则我们都知道:


      链式求导法则

      其中最关键的是求:


      l+1层输出对l层输出的导数计算方法
      代入到上边的链式求导法则当中,我们得到:
      第l层损失对输出的求导
    • 更新W,b
      根据公式更新2到L层的参数W和b:


      参数W和b的更新公式

    3.2 卷积神经网络(CNN)的反向传播过程

    注意CNN和DNN反向传播过程是一样的,但由于CNN的特殊操作,有一些特别要注意的地方。

    • 全连接层的反向传播
      全连接层的前向传播是wx+b的形式,所以这个反向传播和DNN是完全一致的。
    • 池化层反向传播
      一般池化层都不带激活函数,可以把激活函数设置为线性激活函数,求导就是1。但是池化层前向传播的时候对输入进行了缩放,这个推导过程就不同于DNN了。
      CNN的关键在于将缩小后的误差还原到原来大小的误差,如果是最大值,则将求得的导数放到之前最大值对应的位置,如果是取平均,就将其取平均后将对应位置铺满。


      当前导数值
      最大值池化后的对应导数值
      平均值池化后对应导数值

      这样我们就求出来了下式的前半部分:


      当前导数计算公式
      其实池化是没有W这个就是一个映射方法,为了使传播可以进行下去。
      这下我们可以得到l-1层的导数值:
      l-1层的导数值
    • 卷积层的反向传播
      卷积核的w我们是知道的,但是不能直接带进去计算,需要旋转180度后再计算。主要原因是这么做以后满足对输入进行求导的要求。


      对输入进行求导结果

      最终的计算结果为:


      卷积层反向传播计算公式
    • 更新w和b
      求出导数后,w和b的更新就很简单了。


      w梯度方向
      w更新公式
      b梯度方向
      b更新公式

    相关文章

      网友评论

          本文标题:CNN原理篇—其实没有你想象那么难

          本文链接:https://www.haomeiwen.com/subject/nnhrzctx.html