调用经典架构并基于经典自建模型

 1 调用经典架构   

       大多数时候,我们不会从0去创造我们的自己的架构,而是在经典架构中挑选一个适合的架构或适合的思路,并在经典架构上依据数据的需要对架构进行自定义和修改(当然了,我们只能够调用我们已经学过、并且掌握原理的架构,否则我们在修改的时候将无从下手)。在PyTorch中,基本所有经典架构都已经被实现了,所以我们可以直接从PyTorch中“调库”来进行使用。遗憾的是,直接调出来的大部分库是无法满足我们自己需求的,但我们还是可以调用PyTorch中的架构类来作为我们自己架构的基础。

       PyTorch框架中有一个非常重要且好用的包:torchvision,该包主要由3个子包组成,分别是:torchvision.datasets、torchvision.models、torchvision.transforms。从torchvision中调用完整的模型架构,这些架构都位于“CV常用模型”模块torchvision.models里。在torchvision.models里。在torchvision.models中,架构/模型被分为4大类型:分类语义分割目标检测/实例分割以及关键点检测视频分类。对于每种类型的架构,models中都包含了至少一个实现架构本身的父类(呈现为“驼峰式‘命名)以及一个包含预训练功能的子类(全部小写)。对于拥有不同深度、不同结构的架构而言,可能还包含多个子类。(父类与子类:根本骨架与基本实现的关系

调用经典架构并基于经典自建模型_第1张图片

调用经典架构并基于经典自建模型_第2张图片

调用经典架构并基于经典自建模型_第3张图片       对于只有一个架构、不存在不同深度的AlexNet来说,两个类调出的结构是一样的

m.AlexNet()     #查看需要填写的参数是什么?

m.alexnet()      #将AlexNet父类的功能包含在里面,不允许对原始架构进行参数输入,但是可以进行预训练

调用经典架构并基于经典自建模型_第4张图片调用经典架构并基于经典自建模型_第5张图片

       对于残差网络来说,父类是实现具体架构的类,子类是已经填写好必填参数的类

m.ResNet()          #可以从这个类中实现各种不同深度的结构

m.resnet152()      #具体的深度和参数都已锁定,可以在这个类上执行预训练

调用经典架构并基于经典自建模型_第6张图片调用经典架构并基于经典自建模型_第7张图片

       在实际使用模型时,我们几乎总是直接调用小写的类来进行使用,除非我们想大规模修改内部架构。如下所示,调用类的方式非常简单:

调用经典架构并基于经典自建模型_第8张图片调用经典架构并基于经典自建模型_第9张图片

 调用经典架构并基于经典自建模型_第10张图片

       由于网络架构不同,因此不同的架构类并不共享属性或方法,我们需要自己对架构进行检查后再进行调用。我们可以根据自己的需要修改部分层的超参数设置。 

      如果我们想要修改经典架构,我们必须逐层修改。而卷积网路的一层可能对后续的所有层都 产生影响,因此我们常常只会对网络的输入、输出层进行微调,并不会修改架构的中间层。然而,大部 分时候完全套用经典架构都不能满足我们建模的需求,因此我们需要基于经典架构构建我们自己的架构。 

2 基于经典架构自建架构

       几乎现代经典架构都是基于ImageNet数据集224x224的尺寸、1000分类构建起来的,因此几乎所有的经典架构都会有5次下采样(池化层或步长为2的卷积层)。当我们的数据集足够大时,我们会优先考虑使用经典架构在数据集上跑一跑,但当我们的图像尺寸较小时,我们不一定需要将图像拓展到224x224的尺寸以适应经典架构(的确可以使用transform.Resize这么做,但是放大转换后预测效果不一定会很好)。这样不仅会让算力要求提升、计算时间变长,还不一定能够获得很好的效果。如果可能的话,在较小的图片上,我们希望能够尽量保持原状以控制整体计算量。

       对卷积架构来说,改变特征图的输入输出数量的行为只与一两个层有关,要改变特征图尺寸的行为则会影响整个架构。因此,我们一般会从经典架构中”抽取“一部分来进行使用,也有很小的可能会从0建立起自己的新架构。假设我们现在使用的是类似于Fashion-MNIST尺寸的,28x28的数据集,在这样的数据集上,我们可能执行下采样的机会只有2次,一次是从28x28降维到14x14,另一次是从14x14降维到 7x7。这样的数据集并不是非常适合几千万、上亿参数的经典架构们。在这种情况下, torchvision.models下自带的架构就不能灵活满足需求,因此我们往往不会直接使用自带架构,而是在自带架构的基础上进行架构重构。

如下是一个基于VGG和残差网络自建架构的例子:

       我们可能有许多不同的建立架构的思路。最常见的方式是按照VGG的方式对网络进行加深,另一种则是使用经典网络中的块(例如残差网络中经典的残差单元、GoogLeNet中的inception等结构)来加深网络。经验证明,在inception和残差单元之前增加一些普通卷积层会有好处,因此在这里我先使用VGG的思路,再使用残差单元。大家可以自由组合自己偏爱的结构。 

调用经典架构并基于经典自建模型_第11张图片调用经典架构并基于经典自建模型_第12张图片调用经典架构并基于经典自建模型_第13张图片

调用经典架构并基于经典自建模型_第14张图片

 

 

 

       

你可能感兴趣的:(架构,深度学习,pytorch)