pytorch resize函数,pytorch实现resnet50

  pytorch resize函数,pytorch实现resnet50

  本文主要介绍pytorch常用函数的定义和resnet模型的修改实例。有需要的朋友可以借鉴一下,希望能有所帮助。祝你进步很大,早日升职加薪。

  00-1010模型定义常用函数使用神经网络。Parameter()来设计新图层nn . sequential nn . modulelist()nn . module prediction()nn . flatten模型修改案例修改模型图层添加外部输入

  

目录

  

模型定义常用函数

  进口火炬

  从火炬进口nn

  类MyLinear(nn。模块):

  def __init__(自身,输入特征,输出特征):

  超级()。__init__()

  自重=nn。参数(torch.randn(in_features,out_features))

  self.bias=nn参数(torch.randn(out_features))

  定义转发(自身,输入):

  返回(输入@自身重量)自身偏差

  

利用nn.Parameter()设计新的层

  一个有序容器,神经网络模块会按照传入构造函数的顺序添加到计算图中进行执行,以神经网络模块为元素的有序字典也可以作为传入参数。顺序适用于快速验证结果,易于阅读。但是,顺序的使用也会使模型定义失去灵活性。例如,当需要在模型中间添加外部输入时,它不适合顺序实现。

  net=nn。顺序(

  ( fc1 ,MyLinear(4,3)),

  (‘act’,nn。ReLU()),

  ( fc2 ,MyLinear(3,1))

  )

  

nn.Sequential

  该列表接收属于nn的子模块(或层)的表。模块类)作为输入,然后它还可以像list一样执行追加和扩展操作。同时,子模块或层的权重将被自动添加到网络中。

  net=nn。ModuleList([nn。线性(784,256),nn。ReLU()])

  Net.append (nn.linear (256,10)) # #追加操作类似于List

  Print(net[-1]) #索引访问like列表

  打印(网络)

  线性(输入特征=256,输出特征=10,偏差=真)

  模块列表(

  (0):线性(输入特征=784,输出特征=256,偏差=真)

  (1): ReLU()

  (2):线性(输入特征=256,输出特征=10,偏差=真)

  )

  需要注意的是nn。ModuleList没有定义网络,它只是将不同的模块存储在一起。

  ModuleList列表中元素的顺序并不代表它们在网络中的真实位置顺序,只有在forward函数指定了各层的顺序后,模型的定义才算完成。

  具体实现可以用for循环来完成:

  班级模型(nn。模块):

  def __init__(self,):

  超级()。__init__()

  self.modulelist=.

  .

  定义向前(自身,x):

  用于self.modulelist:中的层

  x=层(x)

  返回x

  

nn.ModuleList()

  国防部;摩登派青年

  uleDict和ModuleList的作用类似,只是ModuleDict能够更方便地为神经网络的层添加名称。

  

net = nn.ModuleDict({

   linear: nn.Linear(784, 256),

   act: nn.ReLU(),

  })

  net[output] = nn.Linear(256, 10) # 添加

  print(net[linear]) # 访问

  print(net.output)

  print(net)

  

  

Linear(in_features=784, out_features=256, bias=True)

  Linear(in_features=256, out_features=10, bias=True)

  ModuleDict(

   (act): ReLU()

   (linear): Linear(in_features=784, out_features=256, bias=True)

   (output): Linear(in_features=256, out_features=10, bias=True)

  )

  

  ModuleList和ModuleDict在某个完全相同的层需要重复出现多次时,非常方便实现,可以一行顶多行;当我们需要之前层的信息的时候,比如 ResNets 中的残差计算,当前层的结果需要和之前层中的结果进行融合,一般使用 ModuleList/ModuleDict 比较方便。

  

  

nn.Flatten

  展平输入的张量: 28x28 -> 784

  

input = torch.randn(32, 1, 5, 5)

  m = nn.Sequential(

   nn.Conv2d(1, 32, 5, 1, 1),

   nn.Flatten()

  )

  output = m(input)

  output.size()

  

  

  

模型修改案例

  有了上面的一些常用方法,我们可以修改现有的一些开源模型,这里通过介绍修改模型层、添加额外输入的案例来帮助我们更好地理解。

  

  

修改模型层

  以pytorch官方视觉库torchvision预定义好的模型ResNet50为例,探索如何修改模型的某一层或者某几层。

  我们先看看模型的定义:

  

import torchvision.models as models

  net = models.resnet50()

  print(net)

  

  

ResNet(

   (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)

   (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

   (relu): ReLU(inplace=True)

   (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)

   (layer1): Sequential(

   (0): Bottleneck(

   (conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)

  ..............

   (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))

   (fc): Linear(in_features=2048, out_features=1000, bias=True)

  )

  

  为了适配ImageNet,fc层输出是1000,若需要用这个resnet模型去做一个10分类的问题,就应该修改模型的fc层,将其输出节点数替换为10。另外,我们觉得一层全连接层可能太少了,想再加一层。

  可以做如下修改:

  

from collections import OrderedDict

  classifier = nn.Sequential(OrderedDict([(fc1, nn.Linear(2048, 128)),

   (relu1, nn.ReLU()),

   (dropout1,nn.Dropout(0.5)),

   (fc2, nn.Linear(128, 10)),

   (output, nn.Softmax(dim=1))

   ]))

  net.fc = classifier # 将模型(net)最后名称为“fc”的层替换成了我们自己定义的名称为“classifier”的结构

  

  

  

添加外部输入

  有时候在模型训练中,除了已有模型的输入之外,还需要输入额外的信息。比如在CNN网络中,我们除了输入图像,还需要同时输入图像对应的其他信息,这时候就需要在已有的CNN网络中添加额外的输入变量。

  基本思路是:将原模型添加输入位置前的部分作为一个整体,同时在forward中定义好原模型不变的部分、添加的输入和后续层之间的连接关系,从而完成模型的修改。

  我们以torchvision的resnet50模型为基础,任务还是10分类任务。不同点在于,我们希望利用已有的模型结构,在倒数第二层增加一个额外的输入变量add_variable来辅助预测。

  具体实现如下:

  

class Model(nn.Module):

   def __init__(self, net):

   super(Model, self).__init__()

   self.net = net

   self.relu = nn.ReLU()

   self.dropout = nn.Dropout(0.5)

   self.fc_add = nn.Linear(1001, 10, bias=True)

   self.output = nn.Softmax(dim=1)

   def forward(self, x, add_variable):

   x = self.net(x)

   # add_variable (batch_size, )->(batch_size, 1)

   x = torch.cat((self.dropout(self.relu(x)), add_variable.unsqueeze(1)),1)

   x = self.fc_add(x)

   x = self.output(x)

   return x

  

  修改好的模型结构进行实例化,就可以使用

  

import torchvision.models as models

  net = models.resnet50()

  model = Model(net).cuda()

  # 使用时输入两个inputs

  outputs = model(inputs, add_var)

  

  参考资料:

  Pytorch模型定义与深度学习自查手册

  以上就是pytorch常用函数定义及resnet模型修改实例的详细内容,更多关于pytorch函数resnet模型修改的资料请关注盛行IT软件开发工作室其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: