DL入门(1):卷积神经网络(CNN)

  写在前面:看预测论文综述时,面临这样一个问题:很多DL的方法只是会简单运用,却不是特别了解其详细原理,故针对CNN、RNN、LSTM、AutoEncoder、RBM、DBN以及DBM分别做一些简单总结,以达到了解的目的,此篇为CNN。

1.CNN的模型结构

  CNN的模型结构图如下所示:(网图)
在这里插入图片描述
可以看到,CNN通常包括这几层:输入层(input layer)、卷积层(convolutional layer)、池化层(pooling layer)以及输出层(全连接层+softmax layer)。

2.卷积层

2.1卷积

  卷积是一种局部操作,通过一定大小的卷积核作用于局部图像区域获取图像的局部信息。图像中不同数据窗口的数据和卷积核做inner product(内积)的操作叫做卷积,其本质是提纯,即提取图像不同频段的特征。
  上面这段话不是很好理解,我们举一个简单例子:
在这里插入图片描述
  假设最左边的是一个输入图片的某一个通道,为5 * 5,中间为一个卷积核的一层,3 * 3,我们让卷积核的左上与输入的左上对齐,然后整个卷积核可以往右或者往下移动,假设每次移动一个小方格,那么卷积核实际上走过了一个3 * 3的面积,那么具体怎么卷积?比如一开始位于左上角,输入对应为(1, 1, 1;-1, 0, -3;2, 1, 1),而卷积层一直为(1, 0, 0;0, 0, 0;0, 0, -1),让二者做内积运算,即1 * 1+(-1 * 1)= 0,这个0便是结果矩阵的左上角。当卷积核扫过图中阴影部分时,相应的内积为-1,如上图所示。

2.2 卷积核

  卷积层是卷积神经网络的核心基石。在图像识别里我们提到的卷积是二维卷积,即卷积核与二维图像做卷积操作,简单讲是卷积核滑动到二维图像上所有位置,并在每个位置上与该像素点及其领域像素点做内积,就如上图所示。不同卷积核可以提取不同的特征 ,在深层卷积神经网络中,通过卷积操作可以提取出图像低级到复杂的特征。

  要注意的是,层与层之间会有若干个卷积核(上图只是一个),同时,卷积核深度与初始图片的通道数一致,如下图所示(中间卷积核深度为3):
在这里插入图片描述
由上总结,卷积核的参数有以下几个:宽度、高度、深度、个数,下面一个个解释:

  1. 宽度与高度。这个比较好理解,比如上图中卷积核的宽度和高度都是3。
  2. 深度。卷积核深度与初始输入图片的通道数相同,比如上图中深度为3,那么一个卷积核其实就是3 * 3 * 3,前面两个3分别为宽度和高度,最后一个3为卷积核深度。
  3. 个数。层与层之间可以有若干个卷积核。

  那么同理,输入图片对应也有四个参数:宽度、高度、通道数以及个数,意义与上述四个参数基本一致。

2.3 计算

  那么输入的多个图片怎么与多个卷积核进行运算,并得到什么结果呢?下面这个动图可以很好地解释这一切,如下所示:
在这里插入图片描述
  最左边输入了一张图片,图片图片原本是5 * 5 * 3(宽度 * 高度 * 通道数),加上一个padding后变成了(7 * 7 * 3),上中下三张图分别对应三个通道。
  中间为卷积层,可以看到有两个卷积核,分别为W0和W1,W0和W1都是3 * 3 * 3(宽度 * 高度 * 深度)。
  计算过程如下:
  上一层所有feature map(1个)对应地跟某个卷积核的所有层做卷积,结果相加(或者再加上bias),都会产生下一层的一个feature map,有N个卷积核,下层就会产生N个feather map,每一层代表提取的一种特征。上图中间有两个卷积核,对应结果就为两个feature map,如最右边所示。
  由于每个卷积核通道数和图片通道数是一样的,所以我们让图片的三个通道与卷积核的三层对应做内积,然后相加,就得到一个feature map。以输出feature map的左上角数据1为例:三个通道的左上角分别为(0, 0, 0;0, 0, 1; 0, 0, 1)、(0, 0, 0;0, 1 , 1;0, 0, 2)、(0, 0, 0;0, 2, 0;0, 0, 0),分别对应与卷积核的三层做内积,再相加,即可得到1,其余计算类似。

3.全连接网络与CNN

  全连接网络顾名思义,当前层的每一个神经元与下一层的每个神经元都进行了连接,如下所示:
在这里插入图片描述

而CNN相比于全连接网络,有以下两点不同:1、至少一个卷积层;2、局部连接和权值共享。

3.1 局部连接

  局部连接,顾名思义,不是全连接。每个神经元仅与输入神经元的一块区域连接,这块局部区域称作感受野。对于二维图像本身而言,局部像素关联较强。这种局部连接保证了学习后的过滤器能够对于局部的输入特征有最强的响应。
  比如说,输入图像为1000 * 1000大小,即输入层有1000 * 1000= 1 0 6 10^6 106维,若隐含层与输入层的数目一样,也有 1 0 6 10^6 106个,则输入层到隐含层的全连接参数个数为 1 0 6 ∗ 1 0 6 = 1 0 12 10^6 * 10^6 = 10^{12} 106106=1012,数目非常之大,基本很难训练。
  假如每个神经元只和10 * 10个像素值相连,那么权值数据为 1 0 6 ∗ 100 = 1 0 8 10^6 * 100 = 10^8 106100=108个参数,减少为原来的千分之一。而那10 * 10个像素值对应的10 * 10个参数,其实就相当于卷积操作。

3.2 权值共享

  通过局部连接处理后,神经元之间的连接个数已经有所减少。可是实际上并没有减少很多,参数数量还是很大。而权值共享就是来解决这个问题的,它能显著降低参数的数量。
  所谓权值共享,指的是计算同一个深度切片的神经元时采用的卷积核是共享的。请注意权重只是对于同一深度切片的神经元是共享的,在卷积层,通常采用多组卷积核提取不同特征,即对应不同深度切片的特征,不同深度切片的神经元权重是不共享。
  例如在上面的局部连接中,每个神经元都对应100个参数,一共 1 0 6 10^6 106个神经元,如果这 1 0 6 10^6 106个神经元的100个参数都是相等的,那么参数数目就变为100了。由此可见,权值共享可以大大减少网络的参数。
在这里插入图片描述

4.池化操作

  一般来说,每一个卷积层后面都会加一个池化层。池化层(Pooling Layer)也叫子采样层(Subsampling Layer), 其作用是进行特征选择, 降低特征数量, 从而减少参数数量。通常使用的池化操作为平均值池化和最大值池化。

4.1 最大池化

  对于一个区域,选择这个区域内所有神经元的最大活性值作为这个区域的表示,如下所示:
在这里插入图片描述
对于左上角2 * 2区域,选取其最大值7作为该区域的池化结果。

4.2 平均池化

  对于一个区域,选择这个区域内所有神经元平均活性值作为这个区域的表示,对于上图来说,池化结果为4。

  需要指出的是,池化层没有需要学习的参数,使用时仅需指定池化类型(average 或 max 等)、池化操作的核大小( kernel size )和池化操作的步长(stride)等超参数即可。

5.输出层

  输出层通常为一个全连接层和一个softmax layer。

5.1 全连接层

  全连接层在整个卷积神经网络中起到“分类器”的作用。即通过卷积、激活函数、池化等深度网络后,再经过全连接层对结果进行识别分类。
  在实际使用中,全连接层可由卷积操作实现:对前一层是全连接的全连接层,可以转化为卷积核为 1 × 1 的卷积(即保持不变);而前层是卷积层的全连接层可以转化为卷积核为h × w的全局卷积,h 和 w 分别为前层卷积输出结果的高和宽,这样我们就可以确定全连接层的神经元个数了。

5.2 softmax layer

  最终我们是要分类,假设需要分为三类:
在这里插入图片描述
分为三类,则softmax layer层有三个神经元,前面全连接层计算传播到softmax layer后有三个值,假设为3, 1, -1,则softmax layer要做的操作如下所示:
在这里插入图片描述
对三个数分别求e的指数,然后再求出三者占指数和的比例,比例大的即为预测结果。

6.典型的CNN—LeNet-5

LeNet-5中主要有2个卷积层、2个池化层以及3个全连接层。

  1. 卷积层:卷积层采用的都是5x5大小的卷积核,且卷积核每次滑动一个像素(stride=1),一个特征图使用同一个卷积核,每个上层节点的值乘以连接上的参数,把这些乘积及一个偏置参数相加得到一个和,把该和输入激活函数,激活函数的输出即是下一层节点的值。
  2. 池化层:池化层采用的是2x2的输入,即上一层的4个节点作为下一层1个节点的输入,每次滑动2个像素,每个池化节点的4个输入节点求和后取平均(平均池化),均值乘以一个参数加上一个偏置参数作为激活函数的输入,激活函数的输出即是下一层节点的值。

猜你喜欢

转载自blog.csdn.net/Cyril_KI/article/details/112723818