CNN-卷积神经网络-基本知识点总结
CNN-卷积神经网络-基本知识点总结
卷积神经网络(CNN)是深度学习领域中一种重要的神经网络模型,广泛应用于图像识别、计算机视觉等任务。本文将从基本概念、关键组件到经典网络结构,全面介绍CNN的核心原理和实现细节。
什么是卷积神经网络?
卷积神经网络是多层感知机(MLP)的变种,由纽约大学的Yann Lecun于1998年提出(LeNet-5),其本质是一个多层感知机,成功的原因在于其所采用的局部连接和权值共享的方式:一方面减少了权值的数量使得网络易于优化;另一方面降低了模型的复杂度、减小了过拟合的风险。
2012年AlexNet取得ImageNet比赛的分类任务的冠军,使得卷积神经网络真正爆发。如今的卷积神经网络(CNN)是一种带有卷积结构的深度神经网络,卷积结构可以减少深层网络占用的内存量,其三个关键的操作——局部感受野、权值共享、pooling层,有效地减少了网络的参数个数,缓解了模型的过拟合问题。
下图是含有2个隐含层的多层感知器网络拓扑结构图。
输入层神经元接收输入信号,隐含层和输出层的每一个神经元与之相邻层的所有神经元连接,即全连接,同一层的神经元间不相连。
什么是感受野?
当使用全连接神经网络处理大尺寸图像时,有三个非常明显的缺点:1、将图像展开为向量会丢失空间信息;2、参数过多效率低下,训练困难;3、大量的参数也很快会导致网络过拟合。
卷积神经网络则可以很好地解决以上三个问题。与常规神经网络不同,卷积神经网络的各层中的神经元是3维排列的:宽度、高度和深度。对于输入层来说,宽度和高度指的是输入图像的宽度和高度,深度代表输入图像的通道数。对于中间层来说,宽度和高度指的是特征图(feature map)的宽和高,通常由卷积运算和池化操作的相关参数决定;深度指的是特征图的通道数,通常由卷积核的个数决定。全连接神经网络中的主要运算为矩阵相乘,而卷积神经网络中主要为卷积计算。
全连接神经网络|卷积神经网络示例图:
什么是卷积?
在卷积神经网络中,对于输入的图像,需要多个不同的卷积核对其进行卷积,来提取这张图像不同的特征;同时也需要多个卷积层进行卷积,来提取深层次的特征。
卷积的计算
权值共享
在卷积运算中采用权值共享可以有效减少需要求解的参数。权值共享是基于这样的一个合理的假设:如果一个特征在计算某个空间位置(x1,y1)的时候有用,那么它在计算另一个不同位置(x2,y2)的时候也有用。
通俗地来讲,在一个卷积核在和一个n通道的特征图(为方便理解,这里可以暂时理解为3通道的RGB输入图像)进行卷积运算时,可以看作是用这个卷积核作为一个滑块去“扫”这个特征图,卷积核里面的数就叫权重,这个特征图每个位置是被同样的卷积核“扫”的,所以权重是一样的,也就是共享。同时,这个卷积核在去“扫”n通道特征图的时候,可以看作由一个二维的“片状结构”通过复制n次堆叠成为一个n通道的“块状结构”去“扫”这个n通道的特征图。
分辨率(Resolution)
分辨率指的是输入模型的图像尺寸,即长宽大小。通常情况会根据模型下采样次数n和最后一次下采样后feature map的分辨率k×k来决定输入分辨率的大小,即:从输入r×r到最后一个卷积特征feature map的k×k,整个过程是一个信息逐渐抽象化的过程,即网络学习到的信息逐渐由低级的几何信息转变为高级的语义信息,这个feature map的大小k×k可以是3×3,5×5,7×7,9×9等等,k太大会增加后续的计算量且信息抽象层次不够高,影响网络性能,k太小会造成非常严重的信息丢失,如原始分辨率映射到最后一层的feature map有效区域可能不到一个像素点,使得训练无法收敛。
网络深度(Depth)
神经网络的深度决定了网络的表达能力,它有两种计算方法,早期的backbone设计都是直接使用卷积层堆叠的方式,它的深度即神经网络的层数,后来的backbone设计采用了更高效的module(或block)堆叠的方式,每个module是由多个卷积层组成,它的深度也可以指module的个数,这种说法在神经架构搜索(NAS)中出现的更为频繁。通常而言网络越深表达能力越强,但深度大于某个值可能会带来相反的效果,所以它的具体设定需要不断调参得到。
网络宽度(Width)
宽度决定了网络在某一层学到的信息量,但网络的宽度指的是卷积神经网络中最大的通道数,由卷积核数量最多的层决定。通常的结构设计中卷积核的数量随着层数越来越多的,直到最后一层feature map数量达到最大,这是因为越到深层,feature map的分辨率越小,所包含的信息越高级,所以需要更多的卷积核来进行学习。通道越多效果越好,但带来的计算量也会大大增加,所以具体设定也是一个调参的过程。通常各层通道数会按照8×的倍数来确定,这样有利于CPU的并行计算。
下采样(Down-Sample)
•下采样层有两个作用,一是减少计算量,防止过拟合,二是增大感受野,使得后面的卷积核能够学到更加全局的信息。
•下采样的设计有两种:(1)采用步长(stride)为2的池化层,如Max-pooling或Average-pooling,目前通常使用Max-pooling,因为它计算简单且最大响应能更好保留纹理特征;(2)采用步长(stride)为2的卷积层,下采样的过程是一个信息损失的过程,而池化层是不可学习的,用stride为2的可学习卷积层来代替pooling可以得到更好的效果,当然同时也增加了一定的计算量。
上采样(Up-Sampling)
•在卷积神经网络中,由于输入图像通过卷积神经网络(CNN)提取特征后,输出的尺寸往往会变小,而有时我们需要将图像恢复到原来的尺寸以便进行进一步的计算(如图像的语义分割),这个使图像由小分辨率映射到大分辨率的操作,叫做上采样,它的实现一般有三种方式:
•1、插值,一般使用的是双线性插值,因为效果最好,虽然计算上比其他插值方式复杂,但是相对于卷积计算可以说不值一提;
•2、转置卷积又或是说反卷积,通过对输入feature map间隔填充0,再进行标准的卷积计算,可以使得输出feature map的尺寸比输入更大;
•3、MaxUnpooling,在对称的max pooling位置记录最大值的索引位置,然后在unpooling阶段时将对应的值放置到原先最大值位置,其余位置补0。
MaxUnpooling:
参数量(Params)
参数量指的网络中可学习变量的数量,包括卷积核的权重weight,批归一化(BN)的缩放系数γ,偏移系数β,有些没有BN的层可能有偏置bias,这些都是可学习的参数,即在模型训练开始前被赋予初值,在训练过程根据链式法则中不断迭代更新。整个模型的参数量主要由卷积核的权重weight的数量决定,参数量越大,则该结构对运行平台的内存要求越高,参数量的大小是轻量化网络设计的一个重要评价指标。
计算量(FLOPs)
神经网络的前向推理过程基本上都是乘累加计算,所以它的计算量也是指的前向推理过程中乘加运算的次数,通常用FLOPs(即“每秒浮点运算次数”)来表示,即floating point operations(浮点运算数)。计算量越大,在同一平台上模型运行延时越长,尤其是在移动端/嵌入式这种资源受限的平台上想要达到实时性的要求就必须要求模型的计算量尽可能地低,但这个不是严格成正比关系,也跟具体算子的计算密集程度(即计算时间与IO时间占比)和该算子底层优化的程度有关。
卷积结构类型:
标准卷积 (Convolution)
深度卷积 (Depthwise Convolution)
3. 分组卷积 (Group Convolution)
4. 空洞卷积 (Dilated Convolution)
5. 转置卷积 (Transposed Convolutions)
6. 可变形卷积 (Deformable Convolution)
7. 1×1卷积(Pointwise Convolution)
此部分较为复杂,感兴趣读者请自行了解。
其他组成结构:
1. 池化(pooling)层
•(1)最大池化(Max Pooling)和平均池化(Mean Pooling)
•通常在连续的卷积层之间会周期性地插入一个池化层(也称“汇聚”层)。它的作用是逐渐降低数据体的空间尺寸,这样的话就能减少网络中参数的数量,使得计算资源耗费变少,也能有效控制过拟合。池化这个操作比较简单,一般在上采样和下采样的时候用到,没有参数,不可学习。
•普通池化操作常见的有最大池化(Max Pooling)和平均池化(Average Pooling)。 其中,最常用的是最大池化,因为实践证明,最大池化的效果比平均池化要好。
•(2)全局平均池化(Global Average Pooling)
•全局平均池化的操作是对一个维度为(C,H,W)的feature map,在H和W方向整个取平均,然后输出一个长度为C的向量,这个操作一般在分类模型的最后一个feature map之后出现,然后接一个全连接层就可以完成分类结果的输出了。早期的分类模型都是把最后一个feature map直接拉平成C×H×W的向量,然后再接全连接层,可以明显看出这样计算量极大,甚至有的模型最后一个全连接层占了整个模型计算量的50%以上,之后由研究人员发现对这个feature map做一个全局平均池化,然后再加全连接层可以达到相似的效果,且计算量降低到了原来的1/HW。
2. 全连接(Full Connected)层
全连接层和常规神经网络中一样,它的本质其实就是矩阵乘法再加上偏差,输入一个(B,iC)的数据,权重为(iC,oC),那么输出为(B,oC),在多层感知机和分类模型最后一层常常见到。
3. Addition / Concatenate分支
•Addition和Concatenate分支操作统称为shortcut,如下图所示,操作极为简单。Addition是在ResNet中提出,两个相同维度的feature map相同位置点的值直接相加,得到新的相同维度feature map,这个操作可以融合之前的特征,增加信息的表达,Concatenate操作是在Inception中首次使用,被DenseNet发扬光大,和addition不同的是,它只要求两个feature map的HW相同,通道数可以不同,然后两个feature map在通道上直接拼接,得到一个更大的feature map,它保留了一些原始的特征,增加了特征的数量,使得有效的信息流继续向后传递。
4. Channel shuffle
channel shuffle是ShuffleNet中首次提出,主要是针对分组卷积中不同组之间信息不流通,对不同组的feature map进行混洗的一个操作,如下图所示,假设原始的feature map维度为(1,9,H,W),被分成了3个组,每个组有三个通道,那么首先将这个feature map进行reshape操作,得到(1,3,3,H,W),然后对中间的两个大小为3的维度进行转置,依然是(1,3,3,H,W),最后将通道拉平,变回(1,9,H,W),就完成了通道混洗,使得不同组的feature map间隔保存,增强了信息的交互。
5. 常用激活函数
•(1)ReLU系列
•这里主要指常用的ReLU,ReLU6和leakyReLU。ReLU比较好部署,小于0的部分为0,大于0的部分为原始值,只需要判断一下符号位就行;ReLU6与ReLU相比也只是在正向部分多了个阈值,大于6的值等于6,在实现时多了个比较也不算麻烦;而leakyReLU和ReLU正向部分一样,都是大于0等于原始值,但负向部分却是等于原始值的1/10。
6. Dropout
•Dropout是在训练网络时用的一种技巧(trike),相当于在隐藏单元增加了噪声。
•Dropout指的是在训练过程中每次按一定的概率(比如50%)随机地“删除”一部分隐藏单元(神经元)。所谓的“删除”不是真正意义上的删除,其实就是将该部分神经元的激活函数设为0(激活函数的输出为0),让这些神经元不计算而已。
•能够有效防止过拟合。
7. Batch Normalization
•(1)问题引出
•在引入BN之前,以前的model training有一些系统性的问题,导致很多算法收敛速度都非常慢,甚至根本就不能工作,尤其在使用sigmoid激活函数时。在机器学习中我们通常会对输入特征进行标准化或归一化,因为直接输入的数据每个维度量纲可能不同、数值差别很大,导致模型不能很好地从各个特征中学习。神经网络是一个多层结构,每层神经元是会受到它之前所有神经元影响的,因为每一层的输出都是下一层的输入,所以一个神经元输出的数据分布发生改变一定会使其他神经元跟着改变,这样相互影响的调参很容易使调参过程乱套,这个被称作Internal Covariate shift(ICS)。此外,当上一层输出值太大或太小,其经过sigmoid激活函数时会落在饱和区域,反向传播会有梯度消失的问题。
•(2)BN层功效
BN层通常添加在每个神经网络层和激活层之间,对神经网络层输出的数据分布进行统一和调整,变成均值为0方差为1的标准正态分布,使输出位于激活层的非饱和区,达到加快收敛的效果。BN层的效果演示如下图:
经典CNN网络简介
•1. LeNet
•https://yann.lecun.com/exdb/lenet/
•2. AlexNet https://papers.nips.cc/paper_files/paper/2012/hash/c399862d3b9d6b76c8436e924a68c45b-Abstract.html
•3. VGG
•https://arxiv.org/abs/1409.1556
•4. NiN(Network in Network)
•https://arxiv.org/abs/1312.4400
•5. GoogleNet
•https://arxiv.org/pdf/1409.4842v1.pdf
•6. ResNet
•https://arxiv.org/abs/1512.03385
•7. DenseNet