CNN卷积神经网络超透彻学习(基于李宏毅课程与其它资料与思考实践)

欢迎评论,一起进步

卷积神经网络(CNN)(重点)

1 人工神经网络

(1)人工神经网络由神经元组成

(2) 多个神经元组成人工神经网络

2 卷积神经网络(CNN)

(1) 感受野

选取一部分有用的信息(接收域)(感受野)作为主要输入(参考人眼)

(2) 接收域的选择

  • 可以是不同地方,可以重合,可以相同

  • 大小可以不同

  • 可以只有某些个通道

  • 可以不是正方形,而是其他形状

(3) 输入数据处理

  • 去均值

  • 中心化为0,避免数据过多偏差,影响训练效果

  • 归一化

  • 数据归到 0-1

  • PCA

  • 降维,提主要特征

  • 白化

(4) 卷积运算

  • 类似与人工神经元的运算方式

  • 动图模式

(5) Padding

  • 为何要进行Padding?

  • 如果不进行padding,那么特征图将会越来越小,边缘信息丢失,因此需要使用padding

  • 输出尺寸计算( 用f 表示卷积核大小,s 表示步长,w 表示图片宽度,h 表示图片高度)

(6) 卷积核与滤波器

  • 卷积核(算子)是二维的权重矩阵

  • 滤波器(Filter)是多个卷积核堆叠而成的三维矩阵

  • 多个通道与多个卷积核的运算方式

  • 输入图片为 3 通道,要求输出为2通道 那么过滤器是 :2(output_chanels) x 3(input_chanels) x[3 x 3]

(7) 卷积运算的效果

  • 提取特征

  • 为何可以提取到特征?

  • 特征一般是边缘部分,数据变化可能大,但也可能不大

  • 对于能捕捉到鲜明特征的传统算子,例如Sobel

  • 而CNN则可以捕捉更加细微的特征,这是因为,卷积核是自动学习的,可以在不同的特征上,使用不同的卷积核,进而可以提取以前提取不到的特征,且在卷积运算的过程中,图像也会有不同的变化,这可能是特征更容易表现出来

  • 共享参数parameter sharing

  • 具有类似特征的部分 共享参数

(8)池化层(Polling Layer)

  • 为何引入?

  • 减小模型规模,减少过拟合,提高运算速度,提高所取特征的鲁棒性

  • 三种池化(最大池化,均值池化,随机池化)

  • 三种池化方式各有优缺点

  • 均值池化是对所有特征点求平均值,而最大值池化是对特征点的求最大值。而随机池化则介于两者之间,通过对像素点按数值大小赋予概率,再按照概率进行亚采样,在平均意义上,与均值采样近似,在局部意义上,则服从最大值采样的准则

  • 根据Boureau理论 可以得出结论,在进行特征提取的过程中,均值池化可以减少邻域大小受限造成的估计值方差,但更多保留的是图像背景信息;而最大值池化能减少卷积层参数误差造成估计均值误差的偏移,能更多的保留纹理信息。随机池化虽然可以保留均值池化的信息,但是随机概率值确是人为添加的,随机概率的设置对结果影响较大,不可估计

  • 池化层的反向传播

  • 最大池化中,当输入数据变化时,可能不会引起输出变化,这样loss为 0 该如何反向传播呢?

  • 只在最大值所在的位置上设置误差σ,其它地方的误差为 0

(9) CNN与其它传统神经网络相比的特点: 参考文章链接

  • 与FC前馈神经网络的区别

  • 卷积操作仍然是线性变换

  • 假设我们有一个4×4的输入,目标是把它转换成2×2的输出。这时,如果我们用的是前馈网络,我们会把这个4×4的输入重新转换成一个长度为16的向量,然后把这16个值输入一个有4个输出的密集连接层中。下面是这个层的权重矩阵W:

  • 虽然卷积的卷积核操作看起来很奇怪,但它仍然是一个带有等效变换矩阵的线性变换。如果我们在重构的4×4输入上使用一个大小为3的卷积核K,那么这个等效矩阵会变成:

可以发现,整个卷积仍然是线性变换,但与此同时,它也是一种截然不同的变换。相比前馈网络的64个参数,卷积得到的9个参数可以多次重复使用。由于权重矩阵中包含大量0权重,我们只会在每个输出节点看到选定数量的输入(卷积核的输入)。

而更高效的是,卷积的预定义参数可以被视为权重矩阵的先验。卷积核的大小、filter的数量,这些都是可以预定义的网络参数。当我们使用预训练模型进行图像分类时,我们可以把预先训练的网络参数作为当前的网络参数,并在此基础上训练自己的特征提取器。这会大大节省时间。

从这个意义上讲,虽然同为线性变换,卷积相比前馈网络的优势就可以被解释了。和随机初始化不同,使用预训练的参数允许我们只需要优化最终全连接层的参数,这意味着更好的性能。而大大削减参数数量则意味着更高的效率。

上图中我们只展示了把64个独立参数减少到9个共享参数,但在实际操作中,当我们从MNIST选择784幅224×224×3的图像时,它会有超过150,000个输入,也就是超过100亿个参数。相比之下,整个ResNet-50只有约2500万个参数。

因此,将一些参数固定为0可以大大提高效率。那么对比迁移学习,我们是怎么判断这些先验会产生积极效果的呢?

答案在于先前引导参数学习的特征组合。

  • 局部性

  • 局部连接

  • Spatial Transformer Layer(空间变换)

  • 旋转后的图像,对称后的图像,人可以直接看出来,但是对于图像来说,像素已经改变很多,应当如何解决此问题?

  • 对变换后的图像进行学习

  • 如何进行变换呢?

(10) 1x1 卷积核的作用

👉参考文章链接

  1. 总览作用

  1. 跨通道的特征整合

  1. 特征通道的升维和降维

  1. 减少卷积核参数(简化模型),减少计算量

  1. 跨通道的特征整合

如果当前层和下一层都只有一个通道那么1×1卷积核确实没什么作用,但是如果它们分别为m层和n层的话,1×1卷积核可以起到一个跨通道聚合的作用,所以进一步可以起到降维(或者升维)的作用,起到减少参数的目的。

这里通过一个例子来直观地介绍1x1卷积。输入6x6x1的矩阵,这里的1x1卷积形式为1x1x1,即为元素2,输出也是6x6x1的矩阵。但输出矩阵中的每个元素值是输入矩阵中每个元素值x2的结果。

让我们看一下真正work的示例。当输入为6x6x32时,1x1卷积的形式是1x1x32(filter的数量为1),当只有一个1x1卷积核的时候,此时输出为6x6x1。此时便可以体会到1x1卷积的实质作用:降维。当1x1卷积核的个数小于输入channels数量时,即降维。

注意,下图中第二行左起第二幅图像中的黄色立方体即为1x1x32卷积核,而第二行左起第一幅图像中的黄色立方体即是要与1x1x32卷积核进行叠加运算的区域。

输入由6632 变成了 66filters

进行了不同通道间的信息融合

  1. 降维/升维

也就是输入由6632 变成了 66filters,可以改变通道数目

  1. 加非线性

1*1卷积核,可以在保持feature map尺度不变的(即不损失分辨率)的前提下大幅增加非线性特性(利用后接的非线性激活函数),把网络做的很deep。

备注:一个filter对应卷积后得到一个feature map,不同的filter(不同的weight和bias),卷积以后得到不同的feature map,提取不同的特征,得到对应的specialized neuron。

  1. 跨通道信息交互(channal 的变换)

例子:使用1x1卷积核,实现降维和升维的操作其实就是channel间信息的线性组合变化,3x3x64 channels的卷积核后面添加一个1x1x28channels的卷积核,就变成了3x3x28channels的卷积核,原来的64个channels就可以理解为跨通道线性组合变成了28channels,这就是通道间的信息交互

注意:只是在channel维度上做线性组合,W和H上是共享权值的sliding window

  1. 减少计算量

数据量变少了,计算量减少

  1. 1x1卷积核应用

Inception

  1. 这一点孙琳钧童鞋讲的很清楚。1×1的卷积层(可能)引起人们的重视是在NIN的结构中,论文中林敏师兄的想法是利用MLP代替传统的线性卷积核,从而提高网络的表达能力。文中同时利用了跨通道pooling的角度解释,认为文中提出的MLP其实等价于在传统卷积核后面接cccp层,从而实现多个feature map的线性组合,实现跨通道的信息整合。而cccp层是等价于1×1卷积的,因此细看NIN的caffe实现,就是在每个传统卷积层后面接了两个cccp层(其实就是接了两个1×1的卷积层)。

  1. 进行降维和升维引起人们重视的(可能)是在GoogLeNet里。对于每一个Inception模块(如下图),原始模块是左图,右图中是加入了1×1卷积进行降维的。虽然左图的卷积核都比较小,但是当输入和输出的通道数很大时,乘起来也会使得卷积核参数变的很大,而右图加入1×1卷积后可以降低输入的通道数,卷积核参数、运算复杂度也就跟着降下来了。

以GoogLeNet的3a模块为例,输入的feature map是28×28×192,3a模块中1×1卷积通道为64,3×3卷积通道为128,5×5卷积通道为32,如果是左图结构,那么卷积核参数为1×1×192×64+3×3×192×128+5×5×192×32,而右图对3×3和5×5卷积层前分别加入了通道数为96和16的1×1卷积层,这样卷积核参数就变成了1×1×192×64+(1×1×192×96+3×3×96×128)+(1×1×192×16+5×5×16×32),参数大约减少到原来的三分之一。

同时在并行pooling层后面加入1×1卷积层后也可以降低输出的feature map数量,左图pooling后feature map是不变的,再加卷积层得到的feature map,会使输出的feature map扩大到416,如果每个模块都这样,网络的输出会越来越大。

而右图在pooling后面加了通道为32的1×1卷积,使得输出的feature map数降到了256。GoogLeNet利用1×1的卷积降维后,得到了更为紧凑的网络结构,虽然总共有22层,但是参数数量却只是8层的AlexNet的十二分之一(当然也有很大一部分原因是去掉了全连接层)

ResNet

ResNet同样也利用了1×1卷积,并且是在3×3卷积层的前后都使用了,不仅进行了降维,还进行了升维,使得卷积层的输入和输出的通道数都减小,参数数量进一步减少

3.CNN类型综述

3.1 综述

参考文章链接参考文章链接

在CNN基础篇中介绍的CNN都是串行结构,而在实际应用中,还存在很多具有更复杂结构的 CNN,例如存在分支、存在回溯等等,下面对一些具有复杂结构的CNN进行介绍

不同的网络结构所具有的效果

3.2 基于空间利用的CNN

3.2.1 LeNet

  1. 网络结构

数据集:MNIST

这个网络结构在当时广泛运用于邮政编码的识别,技术革命推动产业革命

3.2.2 AlexNet

• 8层变换,其中有5层卷积和2层全连接隐藏层,以及1个全连接输出层;

• 将sigmoid激活函数改成了更加简单的ReLU激活函数,降低了模型的计算复杂度,模型的训练速度也提升了几倍;

• Max池化,避免平均池化的模糊化效果。同时采用重叠池化,提升特征的丰富性;

• 用Dropout来控制全连接层的模型复杂度:通过Dropout技术在训练过程中将中间层的一些神经元随机置为0,使模型更具有鲁棒性,也减少了全连接层的过拟合;

• 引入数据增强(Data Augmentation),如图像平移、镜像、翻转、裁剪、改变灰度和颜色变化,从而进一步扩大数据集来缓解过拟合。

3.2.3 VGG

使用3 x 3 卷积核 1x1 卷积核 减少了参数的数量,而且也能够使决策函数更具有判别性

3.2.4 Google Net

同一层使用不同类型的卷积核,这样具有不同的感受野,综合了更多的特征,并减少了计算量

LeNet、AlexNet和VGG都是先以由卷积层构成的模块充分抽取空间特征,再以由全连接层构成的模块来输出分类结果。与它们三种模型不同:

GoogLeNet模型由如下的Inception基础块组成,Inception块相当于⼀个有4条线路的子网络,该结构将CNN中常用的卷积(1 × 1 , 3 × 3 , 5 × 5 )、池化操作(3x3)堆叠在一起,一方面增加了网络的宽度,另一方面也增加了网络对尺度的适应性。它通过不同窗口形状的卷积层和最⼤池化层来并行抽取信息,并使用1 × 1 卷积层减少通道数从而降低模型复杂度。它的参数比AlexNet少了12倍,而且GoogleNet的准确率更高。

  1. 网络结构

  1. Inception Model

  1. Code

3.3 基于深度的CNN

3.3.1 Residual Net

1. 为何提出ResNet?

(1)网络层数与梯度传播的关系

(2)梯度消失和梯度爆炸

随着网络层数的增加,反向传播的过程也会变长,如果梯度小于1,在漫长的反向传播过程中,梯度不断连乘,最终在网络的入口附近会得到非常小、接近于0的数,使得网络入口附近的节点没有办法得到更新,我们称之为梯度消失或者梯度弥散。

同理,如果梯度大于1,在漫长的反向传播过程中,梯度不断连乘,最终在网络的入口附近会得到非常大的数,使得网络入口附近的节点得到“不切实际的更新”,我们称之为梯度爆炸。

梯度消失梯度爆炸现象的出现,意味着加深网络层数,不能很好地提高模型的识别准确度,甚至还会导致网络识别能力下降

  1. 残差模块

  1. 启发

  • 朝着某一直觉方向,但是发现实现不了,最重要的是分析清楚原因,点对点解决

  • 一个疑问:为何不往宽度方向发展?

  • 这个在李宏毅的深度学习课程中有讲到,主要原因是 在模型参数量相同的情况下,往宽度发展与往高度发展所具备的函数复杂度,深度更大

3.4 基于多路径的CNN

深度网络的训练颇具挑战性,这也是近来很多深度网络研究的主题。深度 CNN 为复杂任务提供了高效的计算和统计。但是,更深的网络可能会遭遇性能下降或梯度消失/爆炸的问题,而这通常是由增加深度而非过拟合造成的。梯度消失问题不仅会导致更高的测试误差,还会导致更高的训练误差。为了训练更深的网络,多路径或跨层连接的概念被提出。多路径或捷径连接可以通过跳过一些中间层,系统地将一层连接到另一层,以使特定的信息流跨过层。跨层连接将网络划分为几块。这些路径也尝试通过使较低层访问梯度来解决梯度消失问题。为此,使用了不同类型的捷径连接,如零填充、基于投影、dropout 和 1x1 连接等。

基于多路径(Multi-Path based)的CNN有:Highway、ResNet、DenseNet等。

3.5 基于宽度的多连接CNN

2012 至 2015 年,网络架构的重点是深度的力量,以及多通道监管连接在网络正则化中的重要性。然而,网络的宽度和深度一样重要。通过在一层之内并行使用多处理单元,多层感知机获得了在感知机上映射复杂函数的优势。这表明宽度和深度一样是定义学习原则的一个重要参数。

Lu 等人和 Hanin & Sellke 最近表明,带有线性整流激活函数的神经网络要足够宽才能随着深度增加保持通用的近似特性。并且,如果网络的最大宽度不大于输入维度,紧致集上的连续函数类无法被任意深度的网络很好地近似。因此,多层堆叠(增加层)可能不会增加神经网络的表征能力。与深度架构相关的一个重要问题是,有些层或处理单元可能无法学习有用的特征。为了解决这一问题,研究的重点从深度和较窄的架构转移到了较浅和较宽的架构上。

基于宽度的多连接(Width based Multi-Connection)CNN有:WideResNet、Pyramidal Net、Xception、Inception Family等

3.6 基于(通道)特征图开发的CNN

CNN 因其分层学习和自动特征提取能力而闻名于 MV 任务中。特征选择在决定分类、分割和检测模块的性能上起着重要作用。传统特征提取技术中分类模块的性能要受限于特征的单一性。相较于传统技术,CNN使用多阶段特征提取,根据分配的输入来提取不同类型的特征(CNN 中称之为特征图)。但是,一些特征图有很少或者几乎没有目标鉴别作用。巨大的特征集有噪声效应,会导致网络过拟合。这表明,除了网络工程外,特定类别特征图的选取对改进网络的泛化性能至关重要。在这一部分,特征图和通道会交替使用,因为很多研究者已经用通道这个词代替了特征图。

基于(通道)特征图(Feature Map Exploitation based)开发的CNN有:Squeeze and Excitation、Competitive Squeeze and Excitation等。

3.7 基于(输入)通道利用的CNN

图像表征在决定图像处理算法的性能方面起着重要作用。图像的良好表征可以定义来自紧凑代码的图像的突出特征。在不同的研究中,不同类型的传统滤波器被用来提取单一类型图像的不同级别信息。这些不同的表征被用作模型的输入,以提高性能。CNN 是一个很好的特征学习器,它能根据问题自动提取鉴别特征。但是,CNN 的学习依赖于输入表征如果输入中缺乏多样性和类别定义信息,CNN 作为鉴别器的性能就会受到影响。为此,辅助学习器的概念被引入到 CNN 中来提升网络的输入表征。

基于(输入)通道利用(Channel Exploitation based)的CNN有:Channel Boosted CNN using TL等。

3.8 基于注意力的CNN

不同的抽象级别在定义神经网络的鉴别能力方面有着重要的作用。除此之外,选择与上下文相关的特征对于图像定位和识别也很重要。在人类的视觉系统中,这种现象叫做注意力。人类在一次又一次的匆匆一瞥中观察场景并注意与上下文相关的部分。在这个过程中,人类不仅注意选择的区域,而且推理出关于那个位置的物体的不同解释。因此,它有助于人类以更好的方式来抓取视觉结构。类似的解释能力被添加到像 RNN ,LSTM , Transformer这样的神经网络中。上述网络利用注意力模块来生成序列数据,并且根据新样本在先前迭代中的出现来对其加权。不同的研究者把注意力概念加入到 CNN 中来改进表征和克服数据的计算限制问题。注意力概念有助于让 CNN 变得更加智能,使其在杂乱的背景和复杂的场景中也能识别物体。

基于注意力(Attention based)的CNN有:Residual Attention Neural Network、Convolutional Block Attention、Concurrent Squeeze and Excitation,Attention Is All You Need(NLP)等。

3.9 PyTorch-Networks

⭐对于各种CNN模型,已经有人将它们都进行了PyTorch实现: https://github.com/shanglianlm0525/PyTorch-Networks

⭐ 此外,该项目也实现了12种CNN模型:https://github.com/BIGBALLON/CIFAR-ZOO

该系列的卷积神经网络实现包含了9大主题,有:典型网络轻量级网络、目标检测网络、语义分割网络、实例分割网络、人脸检测和识别网络、人体姿态识别网络、注意力机制网络、人像分割网络。

  1. 典型网络(Classical network)

典型的CNN包括:AlexNet、VGG、ResNet、InceptionV1、InceptionV2、InceptionV3、InceptionV4、Inception-ResNet。

  1. 轻量级网络(Light weight)

轻量级网络包括:GhostNet、MobileNets、MobileNetV2、MobileNetV3、ShuffleNet、ShuffleNet V2、SqueezeNet Xception MixNet GhostNet。

MobileNet 由谷歌在 2017 年提出,是一款专注于在移动设备和嵌入式设备上的轻量级CNN神经网络,并迅速衍生出v1 v2 v3 三个版本;相比于传统CNN网络,在准确率小幅降低的前提下,大大减小模型参数和运算量。

其主要思想不再是提高模型的深度和宽度,而是改变卷积的方式,把标准卷积层换成深度可分离卷积,即把卷积分为深度卷积逐点卷积两个步骤,在保证模型准确率的前提下,大大降低了模型的运算量。改进前、后的卷积过程对比如下:

  1. 目标检测网络(Object Detection)

目标检测网络包括:SSDR-CNN(2013年)、Fast R-CNN(2015年)、Faster R-CNN(2015年),YOLO、YOLOv2、YOLOv3、FCOS、FPN、RetinaNet Objects as Points、FSAF、CenterNet FoveaBox。

以 YOLO 系列为例,YOLO(You Only Look Once)是一种基于深度神经网络的对象识别和定位算法,其最大的特点是运行速度很快,可以用于实时系统。

  1. 语义分割网络(Semantic Segmentation)

语义分割网络包括:FCN、Fast-SCNN、LEDNet、LRNNet、FisheyeMODNet。

以 FCN 为例,FCN 诞生于 2014 的语义分割模型先驱,主要贡献为在语义分割问题中推广使用端对端卷积神经网络,使用反卷积进行上采样。FCN 模型非常简单,里面全部是由卷积构成的,所以被称为全卷积网络,同时由于全卷积的特殊形式,因此可以接受任意大小的输入。

  1. 实例分割网络(Instance Segmentation)

实例分割网络包括:PolarMask。

  1. 人脸检测和识别网络(commit VarGFaceNet)

人脸检测和识别网络包括:FaceBoxes、LFFD、VarGFaceNet。

  1. 人体姿态识别网络(Human Pose Estimation)

人体姿态识别网络包括:Stacked Hourglass、Networks Simple Baselines、LPN。

  1. 注意力机制网络(Attention)

注意力机制网络包括:SE Net、scSE、NL Net、GCNet、CBAM、SCNet

  1. 人像分割网络(Portrait Segmentation)

人像分割网络包括:SINet。

4. CNN的局限

虽然CNN所具有的这些特点使其已被广泛应用于各种领域中,但其优势并不意味着目前存在的网络没有瑕疵。

如何有效地训练层级很深的深度网络模型仍旧是一个有待研究的问题。尽管图像分类任务能够受益于层级较深的卷积网络,但一些方法还是不能很好地处理遮挡或者运动模糊等问题。

作者:ComePFC原文地址:https://blog.csdn.net/weixin_45621688/article/details/128869258

%s 个评论

要回复文章请先登录注册