卷积神经网络及经典模型(2) CNN的结构

718 阅读5分钟

原理讲解(Youtube):www.youtube.com/watch?v=Fmp…(2:47)

国内解说(b站):www.bilibili.com/video/BV1sb…

可视化网站:poloclub.github.io/cnn-explain…

下图是一个卷积神经网络CNN的例子,可以看到CNN主要由卷积层、激活层(ReLU)、池化层和全连接层组成,其中全连接层位于最后几层用于最终的分类,卷积层之后会跟个激活层,卷积层和激活值一般为一个整体,后面可能会再跟一个池化层。除了最后几层的全连接层,前面都是卷积层和池化层的组合。下面会介绍每一层的作用。

image.png

1. 全连接层

先来介绍一下全连接层。单个神经元结构如下图所示,这也是一个基本的感知机模型,输入的CodeCogsEqn.svg乘上权重后相加再经过一个激活函数就是这个神经元的输出,即: image.png

image.png

全连接层,是每一个神经元都与上一层的所有结点相连,由于其全相连的特性,一般全连接层的参数也是最多的。如下图的神经网络就是由若干个全连接层组成,其中Layer0又称为输入层,Later3又称为输出层,中间的都成为隐藏层。

image.png

全连接层有很好的非线性表示能力,在卷积神经网络中一般用于最终的分类。

2. 卷积层

2.1 卷积操作

前面已经介绍过了,传统的ANN无法处理图像识别问题(数据量过大),于是在使用全连接层之前加入卷积层来提取特征,使得在不影响数据效果的前提下对数据实现降维,这一操作通过卷积核进行卷积实现的。单次卷积操作如下图所示,就是将卷积核与其覆盖的位置对应相乘然后将结果相加,放到输出的对应位置上,其中卷积核中的值是通过反向传播训练学习得到的,无需人为设置。

image.png

卷积的参数有:

  • 卷积核大小(kernel size)表示每次选取识别特征的区域(一般为正方形)
  • 步长(stride)表示卷积核每次移动的距离
  • 填充(padding)表示是否在像素矩阵外填充0,这可以影响卷积层输出的矩阵大小

image.png

2.2 卷积的特性

如下图,左边是全连接,右边是局部连接。对于一个1000 × 1000的输入图像而言,如果下一个隐藏层的神经元数目为10^6个,采用全连接则有1000 × 1000 × 10^6 = 10^12个权值参数,如此数目巨大的参数几乎难以训练;而采用局部连接,隐藏层的每个神经元仅与图像中10 × 10的局部图像相连接,那么此时的权值参数数量为10 × 10 × 10^6 = 10^8,将直接减少4个数量级。

image.png

图片有一个特性:图片的底层特征是与特征在图片中的位置无关的,比如说下图的两只鸟,一只的嘴在图片上方,一只在中间,无论在哪,它们都可以用一个提取鸟嘴特征的卷积核提取出来。由于卷积核的参数也是通过学习而来的,假设有一个卷积核学习得到的参数就是用来识别鸟嘴这一个特征的,那么我们就可以用这一个卷积核来逐一处理图片中的每个小区域来提取区域中是否存在鸟嘴。

image.png

image.png

在局部连接改进的基础上,我们可以通过权值共享,使得需要训练的参数进一步减少。在局部连接中,图片的一个子区域作为一个神经元的输入,但是每个神经元的参数是独立的需要分别进行训练。但是我们发现,对于提取同一个特征的卷积核,我们训练出来的权值是可以共享的,即这些神经元上的参数可以是一样的。注意这里是只提取某个特定的特征(如眼睛、鼻子等),而如果需要更多的特征,可以通过增加卷积核来增加通道实现。

image.png

综上,我们可以知道卷积最重要的两大特性:

  • 拥有局部感知机制
  • 权值共享,这也使得运算的规模大幅下降

2.3 相关参数的计算

image-20220401190452406.png

  • 卷积核的channel和输入特征层的channel相同(注:channel表示色彩通道数,RGB为3通道)
  • 输出的特征矩阵channle与卷积核个数相同。
  • 卷积操作后,输出矩阵的尺寸大小只与输入图片大小 W * W,卷积核大小 F * F ,步长S,padding的像素数P决定,计算公式为:

3. 池化层

卷积后的图像可能非常大,也可能提取到了太多弱的特征,这就需要进行压缩降维了,这就是池化操作,池化的原理就是对一块区域的值取一个等效值替代,所以池化层也类似于卷积层,也是有一个核在矩阵中移动,池化层有很多类,主要是计算方式不同,下面以AvgPooling平均下采样为例:

image.png

池化后图像大小显著降低,可以显著提升训练速度,减少过拟合现象,那么为什么池化操作是合理的呢?图像中的相邻像素倾向于有形似的值,所以卷积后的图像也有这样的性质,这就意味着卷积层输出的信息有很多是冗余的,所以可以使用池化操作去除这些冗余,如下图所示。

image.png

4. 激活层

激活层其实就是经过一个激活函数的处理,常用的激活函数入下所示,在CNN中ReLU用的比较多。

image-20220521112830063.png

至于为什么需要经过激活层,是因为如果没有激活函数的处理,那么无论经过多少层神经网络,最终都和单层感知机等效。

至于为什么使用ReLU函数,而不使用sigmod也是有原因的。最早的CNN也是使用的sigmod函数,但是随着网络变深,使用sigmod的CNN出现了严重 梯度消失问题,这个问题直到出现了ReLU才得到解决。

20220405200453.png