【问题标题】:How to declare a scalar as a parameter in pytorch?如何在pytorch中声明一个标量作为参数?
【发布时间】:2019-11-28 23:29:37
【问题描述】:

我是 pytorch 的新手。我想知道如何将标量声明为参数。我想知道以下两种方式有什么区别?

x = torch.randn(1,1, requires_grad=True)

和

tensor = torch.randn(1,1)
x = Variable(tensor, requires_grad=True)

【问题讨论】:

    标签: python pytorch


    【解决方案1】:

    根据pytorch官方文档here,

    Variable API 已被弃用:变量不再需要使用带有张量的 autograd。 Autograd 自动支持将 requires_grad 设置为 True 的张量。

    • Variable(tensor) 和 Variable(tensor, requires_grad) 仍按预期工作,但它们返回的是张量而不是变量。

    • var.data 和 tensor.data 是一回事。

    • var.backward()、var.detach()、var.register_hook() 等方法现在适用于具有相同方法名称的张量。

    此外,现在可以使用torch.randn()、torch.zeros()、torch.ones() 等工厂方法以及以下其他方法创建带有requires_grad=True 的张量:

    autograd_tensor = torch.randn((2, 3, 4), requires_grad=True)
    

    【讨论】:

      【解决方案2】:

      Variable 已弃用,如果要声明新参数, 你应该使用torch.nn.Parameter()。 您可以像这样简单地使用它:

      some_weights = torch.nn.Parameter(torch.rand(3, 2))
      bias = torch.nn.Parameter(torch.ones(2)) 
      

      您也可以看看this answer,它很好地了解了如何使用nn.Parameter()。

      【讨论】:

      • 感谢您的回复。我可以再问一个问题吗?我想为我的 CNN 创建一个自定义过滤器。这个过滤器有 20 个通道,内核大小为 5*5,内核的每个位置都是两个参数的函数。因此,我使用 torch.randn(1, requires_grad=True) 声明了这两个参数,然后编写了一个函数以将这两个参数作为参数来生成内核。我使用 torch.zeros(20, 5, 5) 初始化过滤器,然后将内核值分配给 20 个通道中的每一个。这是正确的方法吗?我担心自动梯度计算。
      • 请发布一个新问题。还要提供一个伪代码或您编写的实际代码,以便一切更清楚。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-29
      相关资源
      最近更新 更多