卷积神经网络CNN

旧巷老猫 提交于 2020-03-02 13:16:39

为什么选择CNN?

传统神经网络结构存在两个缺点:
(1) 当输入层维度较大时,导致网络权重 W 数值较大(一张 64x64 的三通道图片,神经网络输入层的维度为 12288),训练的神经网络结构较复杂【具体原因在本篇下文介绍】,训练网络所需的内存和计算量庞大,模型训练更加困难,且样本训练集不够,容易出现过拟合;
(2) 不符合图像特征提取的机制。传统神经网络是将二维或者三维(包含 RGB 三通道)图片拉伸成一维特征,作为神经网络的输入层。这种操作实际上是将图片的各个像素点独立开来,忽略了各个像素点之间的区域性联系。

CNN基础 – 边缘检测

边缘检测是用来检测图片中包含的边缘信息,具体原理是:将图片与相应的边缘检测算子进行卷积操作(对应位置元素相乘再求和)。
卷积的具体过程如下:
在这里插入图片描述

padding 填充

根据上述的卷积过程可得,可得如下结论:
当原始图片的尺寸为 n × n (n = 6), 滤波器算法大小为 f × f (f = 3), 注意:f一般为奇数,则卷积后的图片尺寸为 (n-f+1) × (n-f+1) (4 × 4)。
观察上述结论可得出:

  • 卷积运算后,输出的图片的尺寸变小
  • 原始图片边缘信息对输出贡献少,输出图片丢失边缘信息

为解决图片缩小问题,可使用padding填充方法使得输出图片尺寸与原始图片尺寸保持一致。

padding填充方法是:对原始图片每个方向进行扩展,扩展的区域值为0,用p表示扩充的宽度。具体如下图:
在这里插入图片描述
经过 padding 之后,原始图片尺寸为 (n+2p) x (n+2p),滤波器算子尺寸为 f x f,则卷积后的图片尺寸为 (n+2p-f+1) x (n+2p-f+1)。若要保证卷积前后图片尺寸不变,则 p 应满足:
在这里插入图片描述

Stride 滑动步长

Stride 表示滤波器算子每次在原图片中水平方向和垂直方向的步进长度。
在这里插入图片描述

现用 s 表示 stride 长度,用 p 表示 padding 长度;如果原始图片尺寸为 n x n,滤波器算子尺寸为 f x f,则卷积后的图片尺寸公式为:
在这里插入图片描述

CNN网络层次结构

CNN的网络层次共计5层,分别是:

  • 数据输入层(Input layer)
  • 卷积计算层(Conv layer)
  • 激励层(ReLu layer)
  • 池化层(Poolin layer)
  • 全连接层(FC layer)

数据输入层+卷积计算层+激励层 示例如下:
在这里插入图片描述

  1. 数据输入层
    图片是由一个个像素点组成,上图中的(6×6×3)中的3是指RGB(红绿蓝)三通道,CNN和传统神经网络(又称“全连接层神经网络”)数据输入的区别是:
    CNN:6×6×3格式
    传统神经网络:将上述格式拉伸成6×6×3=108维度再进行后期的计算。
  2. 卷积计算层
    上述卷积运算中,有2个滤波器算子,每一个滤波器算子大小为3×3×3,卷积过程是:各滤波器算子以窗口滑动(根据Stride参数滑动)的方式扫描数据的输入,各个通道分别与其对应的滤波器算子进行卷积运算,各个通道得到的结果求和作为相应位置的输出。

具体过程如下如所示:
在这里插入图片描述
3. 激励层
在卷积计算完成后,会对其结果添加偏移常数b,此时的结果是线性结果,紧接着使用激励函数进行非线性运算,该过程与传统神经网络相似:
在这里插入图片描述
其中,W[l]表示滤波器组数值;A[l-1]表示数据输入,如果是中间层则表示上一层非线性运算结果;b是偏移常数,Z[l]表示线性结果;g[l]表示非线性运算的激励函数,A[l]表示该层的非线性结果的输出;

说明1:如果输入图片的尺寸为 n x n x nc,nc 为图片通道数目,滤波器组的尺寸为 f x f x nc,则卷积+激励后的图片尺寸为 (n-f+1) x (n-f+1) x n′c。nc′ 表示滤波器组个数。

说明2:假设每个滤波器组有 3x3x3=27 个参数,还有 1 个偏移量 b,则对于CNN来讲,每个滤波器组有 27+1=28 个参数,两个滤波器组总共包含 28x2=56 个参数。而对于传统的神经网络来讲,应该有(6×6×3+1)×2=218 个参数;这就是本文刚开始提到的传统神经网路的缺点原因;

因此可以发现,当选定滤波器组后,参数数量与输入图片尺寸大小无关。所以就避免了由于图片尺寸过大,造成参数过多的情况发生。这样大大简化了模型的复杂度,提高了模型的运算速度和性能。

  1. 池化层
    在 CNN 中,池化层可起到压缩数据和参数的量作用,也可提高运算速度。常用的方法如下:
    • Max Pooling: 在滤波器算子滑动区域内取最大值;
    • Average Pooling: 在滤波器算子滑动区域内取平均值;
      在这里插入图片描述
  2. 全连接层
    全连接层是CNN 中的标准神经网络结构,即将卷积层维度拉伸成一维向量,例如:将6×6×3拉伸为维度是108的向量,该层一般出现在 CNN 末端,Softmax 层之前。

一个完整的CNN模型如下所示:
在这里插入图片描述

CNN模型的训练过程

CNN 模型的训练过程与传统的神经网络的训练过程近乎一致,都是基于梯度优化的。

  • 初始化CNN 中每一层的滤波器组和FC 层各项参数;
  • 正向传播;
  • 计算模型的损失函数;
  • 梯度下降算法及各种优化算法进行反向传播;
  • 更新各个滤波器组和 FC 层各项参数;
  • 多次迭代训练;
  • 得到最优的各滤波器组和 FC 层各项参数;
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!