使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)

  

本文介绍了如何在pytorch下搭建AlexNet,使用了两种方法,一种是直接加载预训练模型,并根据自己的需要微调(将最后一层全连接层输出由1000改为10),另一种是手动搭建。

  

构建模型类的时候需要继承自torch.nn。模块类,要自己重写__ \ _ \ ___init__ \ _ \ ___方法和正向传递时向前的方法,这里我自己的理解是,搭建网络写在__ \ _ \ ___init__ \ _ \ ___中,每次正向传递需要计算的部分写在前进中,例如把矩阵压平之类的。

  

<强>加载预训练alexnet之后,可以打印出来查看模型的结构及信息:

  

使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)

        模型=models.alexnet (pretrained=True)   打印(模型)      

分为两个部分,特点及分类器,后续搭建模型时可以也写成这两部分,并且从打印出来的模型信息中也可以看出每一层的引用方式,便于修改,例如模型。分类器[1]指的就是线性的(in_features=9216, out_features=4096,偏见=True)这层。

  

下面放出完整的搭建代码:

        进口火炬。神经网络是神经网络   从torchvision导入模型      类BuildAlexNet (nn.Module):   def __init__(自我、model_type n_output):   超级(BuildAlexNet自我). __init__ ()   自我。model_type=model_type   如果model_type==扒啊?   模型=models.alexnet (pretrained=True)   自我。特点=model.features   fc1=nn。线性(9216、4096)   fc1。偏见=model.classifier [1] .bias   fc1。重量=model.classifier [1] .weight      fc2=nn。线性(4096、4096)   fc2。偏见=model.classifier [4] .bias   fc2。重量=model.classifier [4] .weight      自我。分类器=nn.Sequential (   nn.Dropout (),   fc1,   nn.ReLU(原地=True),   nn.Dropout (),   fc2,   nn.ReLU(原地=True),   神经网络。线性(4096年,n_output))   #或者直接修改为   # model.classifier [6]==nn.Linear(4096年,n_output)   #自我。分类器=model.classifier   如果model_type==靶隆?   自我。特点=nn.Sequential (   神经网络。4 Conv2d(64, 11日,2),   神经网络。ReLU(原地=True),   神经网络。MaxPool2d (3 2 0),   神经网络。Conv2d (64、192、5、1、2),   nn.ReLU(原地=True),   神经网络。MaxPool2d (3 2 0),   神经网络。Conv2d (192、384、3、1、1),   神经网络。ReLU(原地=True),   神经网络。Conv2d (384、256、3、1、1),   nn.ReLU(原地=True),   神经网络。MaxPool2d (3 2 0))   自我。分类器=nn.Sequential (   nn.Dropout (),   神经网络。线性(9216、4096),   nn.ReLU(原地=True),   nn.Dropout (),   神经网络。线性(4096、4096),   nn.ReLU(原地=True),   神经网络。线性(4096年,n_output))      def向前(自我,x):   x=self.features (x)   x=x.view (x.size (0) 1)=self.classifier (x)   返回了   之前      

微调预训练模型的思路为:直接保留原模型的功能部分,重写分类器部分。在分类器部分中,我们实际需要修改的只有最后一层全连接层,之前的两个全连接层不需要修改,所以重写的时候需要把这两层的预训练权重和偏移保留下来,也可以像注释掉的两行代码里那样直接引用最后一层全连接层进行修改。

  

网络搭好之后可以小小的测试一下以检验维度是否正确。

        进口numpy np   从火炬。autograd导入变量   进口火炬      if __name__==癬_main__”:   model_type='前'   n_output=10   alexnet=BuildAlexNet (model_type n_output)   打印(alexnet)      x=np.random.rand (3224224)   x=x.astype (np.float32)   x_ts=torch.from_numpy (x)   x_in=变量(x_ts)   y=alexnet (x_in)   之前      

这里如果不加“x=x.astype (np.float32)”的话会报一个类型错误,感觉有点奇怪。

  

输出y.data.numpy()可得10维输出,表明网络搭建正确。

  

以上这篇使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)