在 Pytorch 中为自定义 NN 模块定义命名参数

use*_*004 4 parameters customization module neural-network pytorch

这个问题是关于如何在 Pytorch 中正确定义自定义层的参数。我想知道如何使参数最终被命名为参数

class My_layer(torch.nn.Module):
    def __init__(self):
        self.mu = torch.nn.Parameter(torch.tensor([[0.0],[1.0]]))
Run Code Online (Sandbox Code Playgroud)

这样,当我打印如下参数时,p.name 不为空。

my_layer = My_Layer()
for p in my_layer.parameters():
     print(p.name, p.data, p.requires_grad)
Run Code Online (Sandbox Code Playgroud)

jod*_*dag 7

您正在正确注册参数,但您应该使用nn.Module.named_parameters而不是nn.Module.parameters访问名称。当前您正在尝试访问Parameter.name,这可能不是您想要的。和name的属性似乎没有记录,但据我所知,它们引用类的内部属性,不能在外部修改。ParameterTensor_C._TensorBase

每次您将 a 分配Parameter给模块的属性时,它都会注册一个名称(这发生在nn.Module.__setattr__ 此处)。参数始终采用与属性本身相同的名称,因此"mu"在本例中也是如此。要迭代所有参数及其关联名称,请使用nn.Module.named_parameters. 例如,

my_layer = My_Layer()
for n, p in my_layer.named_parameters():
    print('Parameter name:', n)
    print(p.data)
    print('requires_grad:', p.requires_grad)
Run Code Online (Sandbox Code Playgroud)

打印

Parameter name: mu
tensor([[0.],
        [1.]])
requires_grad: True
Run Code Online (Sandbox Code Playgroud)

  • 我无法解释为什么 API 的设计者会这样命名这些方法。不幸的是,这个名字有歧义。我同意“named_pa​​rameters”似乎暗示某些参数未命名,但它实际上返回与“parameters”相同的内容,但也只是返回它们的名称(如文档中所示)。 (3认同)