pytorch parameter,pytorch parameters

  pytorch parameter,pytorch parameters

  本文主要介绍PyTorch中torch.nn.Parameter()的相关信息,包括基本应用、实用技巧、原理和机制等。文章通过实例非常详细的介绍了一下,有需要的可以参考一下。

  00-1010神经网络实验前言分析。ViT中的参数()其他说明参考:摘要

  

目录

  今天我们来谈谈PyTorch中的函数torch.nn.Parameter()。刚看到的时候大概能明白功能的用途,但具体实现原理的细节也是一头雾水。参考了几篇博文,做了几个实验,就很清楚了。在记录这些的同时,希望给后人一个参考。请留言讨论。

  

前言

  先看它的名字,parameter,中文意思是参数。我们知道,用PyTorch训练神经网络,本质上就是训练一个函数,这个函数输入一个数据(比如CV中的一个图像),输出一个预测(比如这个图像中的物体属于哪一类)。在我们给出这个函数的结构(如卷积、全连接等)之后。),我们能学到的就是这个函数的参数。我们设计一个损失函数,配合梯度下降法,让我们学习到的函数(神经网络)尽可能准确地完成预测任务。

  通常我们的参数是一些常见结构中的计算参数(卷积、全连接等。).而当我们的网络有一些其他的设计时,就会需要一些对整个网络的训练同样重要的附加参数进行学习和更新,最终得到最优值。经典的例子有注意机制中的权重参数,视觉转换器中的类标记和位置嵌入等。

  而这里的torch.nn.Parameter()可以很好的适应这种应用场景。

  以下是这篇博客的摘要。我觉得挺清楚的。这里有一段引言:

  首先,这个函数可以理解为一个类型转换函数,将一个不可追踪的类型张量转换为一个可训练的类型参数,并将这个参数绑定到这个模块上(net.parameter()中有这个绑定的参数,所以在参数优化的时候可以进行优化)。所以经过类型转换后,这个self.v就成为了模型的一部分,成为了模型中可以根据训练而改变的参数。使用该函数的目的是让一些变量在学习的过程中不断修改自己的值,达到最优化。

  

分析

  看完这个分析,我们来看看在Vision Transformer中的用法:

  .

  self.pos_embedding=nn。参数(torch.randn(1,num_patches 1,dim))

  self.cls_token=nn。参数(torch.randn(1,1,dim))

  .

  我们知道在ViT中,正嵌入和类令牌是需要用网络训练学习的两个参数,但它们不属于FC、MLP、MSA等运算。这个时候nn。Parameter()可用于将这个随机初始化的张量注册为可学习的参数parameter。

  以确保这两个参数确实被添加到net中。Parameters(),作者稍微修改一下源代码,明确指定这两个参数的初始值为0.98,打印出迭代器网。参数()。

  .

  self.pos_embedding=nn。参数(torch.ones(1,num_patches 1,dim) * 0.98)

  self.cls_token=nn。参数(torch.ones(1,1,dim) * 0.98)

  .

  实例化一个ViT模型并打印网络。参数():

  net_vit=ViT(

  image_size=256

  补丁大小=32,

  数量类=1000,

  dim=1024,

  深度=6,

  人头=16,

  mlp_dim=2048,

  辍学=0.1,

  emb_dropout=0.1

  )

  对于net_vit.parameters()中的para :

  优先(priority的缩写)

  nt(para.data)

  

  输出结果中可以看到,最前两行就是我们显式指定为0.98的两个参数pos_embedding和cls_token:

  

tensor([[[0.9800, 0.9800, 0.9800, ..., 0.9800, 0.9800, 0.9800],
[0.9800, 0.9800, 0.9800, ..., 0.9800, 0.9800, 0.9800],
[0.9800, 0.9800, 0.9800, ..., 0.9800, 0.9800, 0.9800],
...,
[0.9800, 0.9800, 0.9800, ..., 0.9800, 0.9800, 0.9800],
[0.9800, 0.9800, 0.9800, ..., 0.9800, 0.9800, 0.9800],
[0.9800, 0.9800, 0.9800, ..., 0.9800, 0.9800, 0.9800]]])
tensor([[[0.9800, 0.9800, 0.9800, ..., 0.9800, 0.9800, 0.9800]]])
tensor([[-0.0026, -0.0064, 0.0111, ..., 0.0091, -0.0041, -0.0060],
[ 0.0003, 0.0115, 0.0059, ..., -0.0052, -0.0056, 0.0010],
[ 0.0079, 0.0016, -0.0094, ..., 0.0174, 0.0065, 0.0001],
...,
[-0.0110, -0.0137, 0.0102, ..., 0.0145, -0.0105, -0.0167],
[-0.0116, -0.0147, 0.0030, ..., 0.0087, 0.0022, 0.0108],
[-0.0079, 0.0033, -0.0087, ..., -0.0174, 0.0103, 0.0021]])
...
...

  

  这就可以确定nn.Parameter()添加的参数确实是被添加到了Parameters列表中,会被送入优化器中随训练一起学习更新。

  

from torch.optim import Adam

  opt = Adam(net_vit.parameters(), learning_rate=0.001)

  

  

  

其他解释

  以下是国外StackOverflow的一个大佬的解读,笔者自行翻译并放在这里供大家参考,想查看原文的同学请戳这里。

  我们知道Tensor相当于是一个高维度的矩阵,它是Variable类的子类。Variable和Parameter之间的差异体现在与Module关联时。当Parameter作为model的属性与module相关联时,它会被自动添加到Parameters列表中,并且可以使用net.Parameters()迭代器进行访问。

  最初在Torch中,一个Variable(例如可以是某个中间state)也会在赋值时被添加为模型的Parameter。在某些实例中,需要缓存变量,而不是将它们添加到Parameters列表中。

  文档中提到的一种情况是RNN,在这种情况下,您需要保存最后一个hidden state,这样就不必一次又一次地传递它。需要缓存一个Variable,而不是让它自动注册为模型的Parameter,这就是为什么我们有一个显式的方法将参数注册到我们的模型,即nn.Parameter类。

  举个例子:

  

import torch

  import torch.nn as nn

  from torch.optim import Adam

  class NN_Network(nn.Module):

   def __init__(self,in_dim,hid,out_dim):

   super(NN_Network, self).__init__()

   self.linear1 = nn.Linear(in_dim,hid)

   self.linear2 = nn.Linear(hid,out_dim)

   self.linear1.weight = torch.nn.Parameter(torch.zeros(in_dim,hid))

   self.linear1.bias = torch.nn.Parameter(torch.ones(hid))

   self.linear2.weight = torch.nn.Parameter(torch.zeros(in_dim,hid))

   self.linear2.bias = torch.nn.Parameter(torch.ones(hid))

   def forward(self, input_array):

   h = self.linear1(input_array)

   y_pred = self.linear2(h)

   return y_pred

  in_d = 5

  hidn = 2

  out_d = 3

  net = NN_Network(in_d, hidn, out_d)

  

  然后检查一下这个模型的Parameters列表:

  

for param in net.parameters():

   print(type(param.data), param.size())

  """ Output

  <class torch.FloatTensor> torch.Size([5, 2])

  <class torch.FloatTensor> torch.Size([2])

  <class torch.FloatTensor> torch.Size([5, 2])

  <class torch.FloatTensor> torch.Size([2])

  """

  

  可以轻易地送入到优化器中:

  

opt = Adam(net.parameters(), learning_rate=0.001)

  

  另外,请注意Parameter的require_grad会自动设定。

  各位读者有疑惑或异议的地方,欢迎留言讨论。

  

  

参考:

  https://www.jb51.net/article/238632.htm

  https://stackoverflow.com/questions/50935345/understanding-torch-nn-parameter

  

  

总结

  到此这篇关于PyTorch中torch.nn.Parameter()的文章就介绍到这了,更多相关PyTorch中torch.nn.Parameter()内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!

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

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