avatar

CNN卷积神经网络

概述

深度学习是一种利用复杂结构的多个处理层来实现对数据进行高层次抽象的算法,是机器学习的一个重要分支。传统的BP算法仅有几层网络,需要手工指定特征且易出现局部最优问题,而深度学习引入了概率生成模型,可自动地从训练集提取特征,解决了手工特征考虑不周的问题,而且初始化了神经网络权重,采用反向传播算法进行训练,与BP算法相比取得了很好的效果。本章主要介绍了深度学习相关的概念和主流框架,重点介绍卷积神经网络和循环神经网络的结构以及常见应用。

感受野

感受野就是视觉感受区域的大小。在卷积神经网络中,感受野是CNN中的某一层输出结果的一个元素对应输入层的一个映射,即feature map上的一个点所对应的输入图上的区域。

感受野是卷积神经网络的一个很重要的基础,它的目的是降低网络参数,减少不必要的信息,保留主要的特征信息,减少运算压力。

卷积神经网络中,越深层的神经元看到的输入区域越大,如下图所示,使用的卷积核都是3x3的卷积核,步长都为1,Layer1中绿色区域就是Layer2中绿色方块能够看到的区域,黄色代表Layer3可以看到的区域,所以,在Layer2中的1x1编码区域我们可以获取Layer1中的3x3的区域,而Layer3中的1x1大小的区域可以获取Layer1中5x5的区域。

感受野是个相对的概念,某层feature map上的的元素看到前面层的范围都不同。

卷积

卷积的概念

卷积实际上是一个滤波器,对两个函数进行运算,运算公式:

我们这里用图像来辅助理解:

我们可以把前面的图像比作一个函数,后面的也比作一个函数进行相乘求和操作

我们可以发现,实际上卷积实际上就是提取两个函数共有的特征并,简单地说就是反转相乘相加

就这样通过卷积来实现感受野的机制

卷积的计算

以下先使用灰度图来进行介绍,首先我们知道,灰度图只有单通道的编码

这里我们将输入图像编码比作$\ f[n] $函数,将卷积核比作$\ g[n] $函数

下图中我们使用的是一个$\ 3x3 $的卷积核,步长为1进行卷积

下面再用一个简单的示例进行说明,就显而易见了。这里的卷积核采用的是$\ 2x2 $的,步长为1,这里将4个像素编码压缩成了一个像素编码

卷积之后,我们的特征就保留了下来,并且像素编码变少了

卷积核通常使用$\ 3x3 $的卷积核,通常使用的是小卷积多深度,这样可以将特征获取更加全面,不易丢失特征

这里需要注意的问题就是,我们这样计算容易丢失边缘的特征,所以为了尽量保留边缘的特征,我们可以通过padding操作进行补零


padding操作是指在图像周围补一圈零(具体补多少层,又需求决定,可以左边一层右边两层,也能上面一层下面不补,完全取决于个人需求)

这样,我们就不容易丢失边缘的特征,所以,在原来边缘位置的像素点就能够进行多次操作。


我们将进行卷积后的图像进行还原以后我们可以看出,进行卷积之后,我们可以看成,图片变模糊了,但是基本的重要的特征都被保留了下来,这样就通过卷积实现了感受野的机制

对于卷积特征图的大小计算

  • $\ n_{out} $代表输出的feature map的大小
  • $\ n_{in} $代表输入图的大小
  • $\ p $代表padding补零的大小
  • $\ f $代表卷积核大小
  • $\ s $代表步长

不同方向的卷积

我们可以通过调整卷积核的参数来对图的特征进行指定方向的提取

我们通常使用多个卷积核对图像进行卷积,以获取更多的图像特征

多通道卷积

对彩色图像,我们知道,彩色图像符合RGB原理,每个像素可以使用三个值RGB来进行表示像素的颜色

对彩色图像,我们使用多通道的卷积,如下图所示

我们分别对每个通道使用一个卷积核进行卷积,也可以共用一个卷积核,具体看需求

彩色图像的编码RGB使用张量来表示了,下图能够形象的将对彩色图卷积的操作表达出来

池化

池化也叫下采样,池化通常和卷积配套使用,但是也可以不用,不是说有卷积就一定要有池化

池化实际上是进一步把编码进行压缩的一种方法

池化有最大池化、平均池化和随机池化等,如下图所示,我们使用的是$\ 2x2 $的池化核,移动步长为2,对图像进行池化

最大池化可以将编码中最突出的特征进行保留,所以最大池化是比较常用的池化方法

完整的卷积神经网络

一个完整的卷积神经网络又输入层、卷积层、池化层和全连接层构成

  • 卷积层和池化层主要是作为特征提取器进行特征提取
  • 全连接层主要是作为分类器进行分类

权重共享和网络局部连接

卷积神经网络两大核心思想:

  • 网络局部连接
  • 卷积核参数共享

两者的关键作用都是为了减少参数的数量,使运算变得更加简洁、高效,能够在超大规模的数据集上运算


对于卷积核参数共享

一个的卷积核在图像上扫描,进行特征提取。通常$\ 3x3, 5x5, 7x7 $的卷积核较为常用,如果channels为$\ k $的话,那么参数总量为

如果不进行权重共享的话,会造成如下图所示的情况:

这样卷积核的参数数量就变成了和图像的像素矩阵的大小一样了,这样参数就比权重共享多了非常多

例如输入一个尺寸为的图像,如果我们把第一层的卷积核参数去掉参数共享,那么参数的数目就变成了,是原来的50万倍


对于网络局部连接

如果补进行局部连接,而是用全连接,那么每个元素单元与隐层的神经原进行全连接,网络结构如下所示:

此时的参数通常超过千万个


所以我们需要使用网络局部连接和权重共享

基本单元-输入层

输入层,将图像编码输入到隐层中,相当于使用RGB编码将3个2D矩阵叠在一起,每个矩阵元素的值都在0-255之间

基本单元-卷积层

  • Filter:“滤波器”或者“特征探测器”,这里的重点就是,理解滤波器对于原输入图片来说,是个特征探测器。它的元素是通过网络训练得到的
  • 卷积操作:在原始图片(绿色)上从左往右、从上往下按照一定步数滑动橙色矩阵,并且在每个位置上,我们都对两个矩阵的对应元素相乘后求和得到一个整数,这就是输出矩阵(粉色)的元素。注意,3x3矩阵每次只“看见”输入图片的一部分,即局部感受野
  • Convolved Feature:在原图上滑动滤波器、点乘矩阵所得的矩阵称为“卷积特征”、“激励映射”或“特征映射”

  • Stride:步幅是每次滑过的像素数。当Stride=2的时候每次就会滑过2个像素。步幅越大,特征映射越小
  • Depth:深度就是卷积操作中用到的滤波器个数。这里对图片用了两个不同的滤波器,从而产生了两个特征映射。你可以认为这两个特征映射也是堆叠的2d矩阵,所以这里特征映射的“深度”就是2
  • Zero-padding:边缘补零,对图像矩阵的边缘像素也施加滤波器。补零的好处是让我们可以控制特征映射的尺寸。补零也叫宽卷积,不补零就叫窄卷积

基本单元-池化层

  • 空间池化,也叫亚采样或下采样降低了每个特征映射的维度,但是保留了最重要的信息
  • 空间池化可以有很多种形式:最大(Max),平均(Average),求和(Sum)等等。最大池化成效最好。

将池化操作施经过卷积层和ReLU激活函数的特征映射上的效果

池化层的功能:

  • 减少网络中的参数计算数量,从而遏制过拟合
  • 增强网络对输入图像中的小变形、扭曲、平移的鲁棒性(输入里的微小扭曲不会改变池化输出——因为我们在局部邻域已经取了最大值/平均值)
  • 帮助我们获得不因尺寸而改变的等效图片表征。这非常有用,因为这样我们就可以探测到图片里的物体,不论那个物体在哪

基本单元-全连接层

  • 使用softmax激活函数作为输出层的多层感知机(Multi-Layer Perceptron)
  • 全连接表示上一层的每一个神经元,都和下一层的每一个神经元是相互连接的
  • 卷积层和池化层的输出代表了输入图像的高级特征,全连接层的目的就是类别基于训练集用这些特征进行分类
  • 除了分类以外,加入全连接层也是学习特征之间非线性组合的有效办法。卷积层和池化层提取出来的特征很好,但是如果考虑这些特征之间的组合,就更好了
文章作者: 安河桥北以北
文章链接: http://chenai007.github.io/2020/05/10/DeepLeaning/CNN%E5%8D%B7%E7%A7%AF%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Ash's blog

评论