PyTorch实战:常用卷积神经网络搭建结构速览

目录

前言

常用卷积神经网络

1.AlexNet

2.VGGNet

3.GoogLeNet

4.ResNet

总览

 


前言

PyTorch可以说是三大主流框架中最适合初学者学习的了,相较于其他主流框架,PyTorch的简单易用性使其成为初学者们的首选。这样我想要强调的一点是,框架可以类比为编程语言,仅为我们实现项目效果的工具,也就是我们造车使用的轮子,我们重点需要的是理解如何使用Torch去实现功能而不要过度在意轮子是要怎么做出来的,那样会牵扯我们太多学习时间。以后就出一系列专门细解深度学习框架的文章,但是那是较后期我们对深度学习的理论知识和实践操作都比较熟悉才好开始学习,现阶段我们最需要的是学会如何使用这些工具。

深度学习的内容不是那么好掌握的,包含大量的数学理论知识以及大量的计算公式原理需要推理。且如果不进行实际操作很难够理解我们写的代码究极在神经网络计算框架中代表什么作用。不过我会尽可能将知识简化,转换为我们比较熟悉的内容,我将尽力让大家了解并熟悉神经网络框架,保证能够理解通畅以及推演顺利的条件之下,尽量不使用过多的数学公式和专业理论知识。以一篇文章快速了解并实现该算法,以效率最高的方式熟练这些知识。


博主专注数据建模四年,参与过大大小小数十来次数学建模,理解各类模型原理以及每种模型的建模流程和各类题目分析方法。此专栏的目的就是为了让零基础快速使用各类数学模型、机器学习和深度学习以及代码,每一篇文章都包含实战项目以及可运行代码。博主紧跟各类数模比赛,每场数模竞赛博主都会将最新的思路和代码写进此专栏以及详细思路和完全代码。希望有需求的小伙伴不要错过笔者精心打造的专栏:

一文速学-数学建模常用模型icon-default.png?t=N7T8https://blog.csdn.net/master_hunter/category_10967944.html


常用卷积神经网络

上篇文章我十分详细讲述了卷积神经网络的特点以及运算和结构搭建。强烈推荐读者多看几遍,以后搭建论文神经网络或者是面试卷积神经网络细节部分都能够有所联想记忆。那么根据上篇文章的学习,我们已经拥有了搭建卷积神经网络的能力,也就是拥有了造车的能力,可以根据数据和图片搭建自己想要的卷积神经网络,但是想要搭建一些已经验证能力的卷积神经网络还是有一定差距的。本篇文章主要带大家再次熟悉一下卷积神经网络的搭建过程,想靠一篇文章来学会卷积神经网络显然是异想天开的,我们需要更多的实践去使用才能掌握。

文章分为两部分,第一部分主要对常用的卷积神经网络简述介绍,第二部分将参考论文详细搭建每个卷积神经网络并且完成数据集的分类。

1.AlexNet

AlexNet是一个经典的卷积神经网络,它在2012年的ImageNet图像分类挑战中取得了第一名。ImageNet是自2010年以来,每年举办一次的全球性图片分类比赛。自从该竞赛举办开始,业界便视其为深度学习标准数据集。后续很多优秀的神经网络模型都是由此比赛诞生。

AlexNet出现后打破了原来众多学者的认知,它首次证明了学习到的特征可以超越手工设计的特征,从而越来越多的人开始重新审视深度学习算法并加入到研究的浪潮中。

有兴趣的可以阅读论文:

《ImageNet Classification with Deep Convolutional Neural Networks》icon-default.png?t=N7T8http://www.cs.toronto.edu/~fritz/absps/imagenet.pdf

AlexNet是一个相对较深的神经网络,相比于以前的网络结构,它引入了更多的卷积层和全连接层。这使得网络可以学习更加复杂、抽象的特征,从而提升了图像分类的性能。

  • ReLU激活函数:在AlexNet中,使用了ReLU(Rectified Linear Unit)作为激活函数,相比于传统的Sigmoid函数,ReLU能够更好地解决梯度消失的问题,加速了网络的收敛速度。
  • 局部响应归一化(LRN)层:引入了LRN层,它在激活函数之前对神经元的输出进行归一化,使得响应相对较大的神经元被抑制,从而提升了网络的泛化能力。
  • Dropout正则化:在全连接层之间引入了Dropout层,这有助于防止过拟合,提升了网络的泛化能力。
  • 大尺寸卷积核和重叠池化:AlexNet使用了较大的卷积核和重叠的池化层,这使得网络能够捕捉到更大范围内的特征,并减小了特征图的大小。
  • 数据增强和多尺度训练: 在训练阶段,AlexNet使用了数据增强技术,包括随机裁剪、水平翻转等,以及在不同尺度下训练多个模型,从而提升了网络的鲁棒性和性能。

AlexNet的网络结构:

PyTorch实战:常用卷积神经网络搭建结构速览_第1张图片

PyTorch实战:常用卷积神经网络搭建结构速览_第2张图片  从上图看,在网络设计上其实并非如上图所示,上图包含了GPU通信的部分。这是由当时GPU内存的限制引起的,作者使用两块GPU进行计算,因此分为了上下两部分。但是,以目前GPU的处理能力,单GPU足够了,因此其结构图可以如下所示:

 PyTorch实战:常用卷积神经网络搭建结构速览_第3张图片

2.VGGNet

VGGNet(Visual Geometry Group Network)是由牛津大学视觉几何组(Visual Geometry Group)提出的深度卷积神经网络架构,它在2014年的ImageNet图像分类挑战中取得了优异的成绩。VGGNet之所以著名,一方面是因为其简洁而高效的网络结构,另一方面是因为它通过深度堆叠的方式展示了深度卷积神经网络的强大能力。

VGGNet探索了卷积神经网络的深度与其性能之间的关系,成功地构筑了16~19层深的卷积神经网络,证明了增加网络的深度能够在一定程度上影响网络最终的性能,使错误率大幅下降,同时拓展性又很强,迁移到其它图片数据上的泛化性也非常好。到目前为止,VGG仍然被用来提取图像特征。

  • 网络结构:VGGNet主要由卷积层和全连接层组成,整个网络采用了相对较小(3x3)的卷积核,以及较小的池化窗口(2x2的最大池化),从而保持了网络结构的简洁性。
  • 深度和宽度: VGGNet的主要特点是通过深度和宽度的增加来提升网络性能。它通过不断加深网络结构,使得特征图能够在不同层次上学到越来越抽象的特征。同时,VGGNet采用了相对较大的卷积核,这使得网络具有更大的感受野,能够捕捉到更广阔的上下文信息。
  • 卷积层的堆叠: VGGNet通过多次堆叠相同大小的卷积层和池化层,从而逐步减小特征图的大小,增加通道数,提升网络对图像特征的抽象能力。
  • 全连接层: 在卷积层之后,VGGNet采用了多层的全连接层来实现分类任务。这些全连接层将高维的特征图映射到最终的类别得分。
  • ReLU激活函数: 在每个卷积层和全连接层之后都采用了ReLU作为激活函数,这有助于缓解梯度消失的问题,提升网络的收敛速度。
  • Dropout正则化: VGGNet在全连接层之间引入了Dropout层,以防止过拟合。
  • Batch Normalization: 虽然VGGNet并没有采用Batch Normalization(BN)层,但后续的一些网络结构会在卷积层后面添加BN层来加速训练。

我们来看看VGGNet的网络结构:

PyTorch实战:常用卷积神经网络搭建结构速览_第4张图片

VGGNet包含两种结构,分别为16层和19层。VGGNet结构中,所有卷积层的kernel都只有3*3。VGGNet中连续使用3组3*3kernel的原因是它与使用1个7*7kernel产生的效果相同,然而更深的网络结构还会学习到更复杂的非线性关系,从而使得模型的效果更好。该操作带来的另一个好处是参数数量的减少,因为对于一个包含了C个kernel的卷积层来说,原来的参数个数为7*7*C,而新的参数个数为3*(3*3*C)。

PyTorch实战:常用卷积神经网络搭建结构速览_第5张图片

 VGG16Net网络结构:

PyTorch实战:常用卷积神经网络搭建结构速览_第6张图片

内存消耗主要来自早期的卷积,而参数量的激增则发生在后期的全连接层。

VGGNet的优点:

  1. 简单明了的结构: VGGNet的结构非常简单直观,由连续的卷积层和池化层组成,使得网络结构易于理解。

  2. 便于迁移学习: VGGNet的结构可以很容易地应用于其他任务,也使得它成为了迁移学习的一个良好基础。

  3. 较少的超参数: 相对于GoogLeNet,VGGNet的超参数较少,因此更容易调整和训练。

VGGNet的缺点:

  1. 较大的参数数量: 由于采用了大量的卷积层,导致VGGNet的参数数量较大,训练和推理过程需要更多的计算资源。

  2. 容易出现过拟合: 由于参数量较大,需要更多的数据来避免过拟合问题。

3.GoogLeNet

GoogLeNet,也被称为Inception V1,是谷歌团队在2014年提出的一个深度卷积神经网络架构,它在当年的ImageNet图像分类挑战中取得了领先地位。GoogLeNet的主要特点是采用了一种称为“Inception模块”的网络结构,通过多层次的特征抽取和组合,使得网络可以同时在不同尺度上提取特征,从而获得了非常强大的分类性能。

  • Inception模块: GoogLeNet最大的特点就是采用了Inception模块,这是一种具有多个并行卷积操作的模块。这样的设计可以让网络同时学习到不同尺度和抽象级别的特征,从而提升了网络对图像的理解能力。
  • 多尺度的特征提取: Inception模块通过使用不同大小的卷积核(1x1、3x3、5x5)和最大池化层来处理输入特征图,然后将它们合并在一起。这样可以让网络在不同尺度上获取信息,从而捕获到更丰富的图像特征。
  • 1x1卷积核的作用: 1x1卷积核被称为逐点卷积(pointwise convolution),它可以用来降低通道数或者增加通道数。这使得网络能够在保持计算量相对较小的情况下,增加了网络的复杂性和表达能力。
  • 全局平均池化: GoogLeNet不使用全连接层,而是采用了全局平均池化层,将特征图的每个通道的特征值求平均,然后直接连接到分类器中。这样的设计可以降低网络的参数量,减少过拟合的可能性。
  • 辅助分类器: 除了主分类器外,GoogLeNet在中间层引入了两个辅助分类器。这两个辅助分类器在训练过程中会加入总损失中,有助于减轻梯度消失问题,加速网络的收敛。
  • Inception的多次堆叠: GoogLeNet通过多次堆叠Inception模块,构建了一个深度的网络结构,从而获得了强大的特征抽取能力。
  • Dropout和Batch Normalization: GoogLeNet在全连接层之间采用了Dropout层来防止过拟合,并在卷积层之后使用了Batch Normalization来加速训练。

GoogLeNet最初的想法很简单,就是若想要得到更好的预测效果,就要增加网络的复杂度,即从两个角度出发:网络深度和网络宽度。但是二者都需要付出一定的代价,首先更复杂的网络意味着更多的参数,就算是ILSVRC这种包含了1000类标签的数据也很容易过拟合。

再者是更复杂的网络会带来更大的计算资源的消耗,而且当kernel个数设计不合理时导致kernel中的参数没有被完全利用(多数权重都趋近于0)时,会导致大量计算资源的浪费。

GoogLeNet引入了inception结构来解决这个问题,其中涉及了大量的数学推导和原理,感兴趣的推荐阅读:Going Deeper with Convolutionsicon-default.png?t=N7T8https://arxiv.org/abs/1409.4842这里不作详解,不然都得另开篇文章,内容太多了。除了inception结构,GoogLetNet的另外一个特点是主干网络部分全部使用卷积网络,仅仅在最终分类部分使用全连接层。

PyTorch实战:常用卷积神经网络搭建结构速览_第7张图片

GoogLeNet和VGGNet是两种非常成功的深度卷积神经网络架构,它们各自有着不同的优缺点:

GoogLeNet的优点:

  1. 更高的效率: GoogLeNet相比于VGGNet在同等性能下,拥有更少的参数量。这使得它在相同计算资源下,可以处理更大规模的任务。

  2. 更深的网络结构: GoogLeNet通过巧妙的Inception模块设计,使得可以构建非常深的网络,而不容易出现梯度消失或爆炸的问题。

  3. 多尺度特征提取: Inception模块可以同时在不同尺度上提取特征,使得网络能够捕获到丰富的图像信息。

  4. 全局平均池化: 使用全局平均池化代替全连接层,可以大幅减少参数数量,降低过拟合的风险。

GoogLeNet的缺点:

  1. 相对复杂的网络结构: 由于Inception模块的设计相对复杂,导致GoogLeNet的网络结构不太容易理解。

  2. 训练时间较长: 由于网络深度较大,训练GoogLeNet需要相对更长的时间。

  3. 难以可视化和解释: 由于网络结构的复杂性,GoogLeNet的内部工作原理相对难以可视化和解释,使得难以理解网络的决策过程。

GoogLeNet相对于VGGNet在网络结构设计上更加灵活和高效,适用于大规模任务。而VGGNet在结构上更为简单直观,容易理解和调整,适用于中小规模的任务,也便于迁移学习。选择合适的网络取决于任务的具体需求、计算资源和数据规模等因素。

4.ResNet

在ResNet提出之前,所有的神经网络都是通过卷积层和池化层的叠加组成的。
人们认为卷积层和池化层的层数越多,获取到的图片特征信息越全,学习效果也就越好。但是在实际的试验中发现,随着卷积层和池化层的叠加,不但没有出现学习效果越来越好的情况,反而两种问题:

  • 1.梯度消失和梯度爆炸
    • 梯度消失:若每一层的误差梯度小于1,反向传播时,网络越深,梯度越趋近于0
    • 梯度爆炸:若每一层的误差梯度大于1,反向传播时,网络越深,梯度越来越大
  • 2.退化问题
    • 随着层数的增加,预测效果反而越来越差。

PyTorch实战:常用卷积神经网络搭建结构速览_第8张图片

因此ResNet网络的主要特点和设计思想:

  • 残差块(Residual Block): ResNet引入了残差块的概念,通过在网络中添加了“跳跃连接”(skip connection),使得网络可以直接学习残差(即原始输入与学习到的特征之间的差异),而不是直接学习原始特征。这样可以更容易地训练非常深的网络。
  • 跳跃连接: 残差块中的跳跃连接允许信息在不同层之间直接传递,而不会受到梯度消失或爆炸的影响。这种设计保证了信息在网络中的流动,使得可以训练非常深的网络。
  • Identity Mapping: 在残差块中,如果输入的特征维度与输出的特征维度相同,那么可以直接将输入特征传递给输出,形成一个恒等映射(identity mapping)。这样可以避免了在高维空间中进行不必要的非线性变换,减少了网络的复杂度。
  • Bottleneck 结构: 为了减少计算量和参数数量,ResNet使用了“瓶颈结构”(bottleneck structure)来代替简单的卷积层,它包括了一个1x1卷积层、一个3x3卷积层和一个1x1卷积层,分别用于降维、卷积、升维,从而减少了计算量。
  • 全局平均池化(Global Average Pooling): 在网络的最后一层使用了全局平均池化,将特征图的每个通道的所有值取平均,得到一个与通道数量相同的特征向量,作为最终的预测。
  • Identity Shortcut 和 Projection Shortcut: ResNet根据输入输出的维度是否一致,分别使用了两种不同的跳跃连接方式,即Identity Shortcut(维度一致)和Projection Shortcut(维度不一致),保证了信息的顺利传递。

ResNet的设计思想在于引入了残差学习,通过跳跃连接解决了深度网络训练过程中的梯度问题。ResNet论文提出通过数据的预处理以及在网络中使用 BN(Batch Normalization)层来解决。为了解决深层网络中的退化问题,可以人为地让神经网络某些层跳过下一层神经元的连接,隔层相连,弱化每层之间的强联系。这种神经网络被称为 残差网络 (ResNets)。ResNet论文提出了 residual结构(残差结构)来减轻退化问题,下图是使用residual结构的卷积网络,可以看到随着网络的不断加深,效果并没有变差,而是变的更好了。

PyTorch实战:常用卷积神经网络搭建结构速览_第9张图片

 除了残差结果以外,ResNet还沿用了前人的一些可以提升网络性能的效果和设计,如堆叠式残差结构,每个残差模块又由多个小尺度kernel组成,整个ResNet除最后用于分类的全连接层以外都是全卷积的,这大大提升了计算速度。ResNet网络深度有34、50、101、152等多种,50层以上的ResNet也借鉴了类似GoogLeNet的思想,在细节上使用了bottleneck的设计方式。普通卷积层与残差卷基层:

PyTorch实战:常用卷积神经网络搭建结构速览_第10张图片

 ResNet网络结构缩略图:

PyTorch实战:常用卷积神经网络搭建结构速览_第11张图片


总览

至此我们已经介绍了4种基础的网络结构和设计网络时涉及的主要思想。在ResNet之后,还有很多新的网络结构不断出现,但主要思想大体上都是基于以上4种类型做的一些改进,入Inception-v4的主要思想便是ResNet+Inception。

我们再来看看不同网络结构可以达到的算法精度以及其内存消耗情况:

PyTorch实战:常用卷积神经网络搭建结构速览_第12张图片

如与其他模型相比,VGGNet占用最多的计算量并且消耗最大的内存,GoogLeNet是刚刚介绍的四个模型中计算量和内存消耗最小的模型,然而AlexNet虽然计算量不高,但也会占用较大内存且精度不高,而不同大小的ResNet模型性能差异也较大,具体情况需要根据应用场景选择合适的模型。

你可能感兴趣的:(python,pytorch,cnn,神经网络,人工智能)