在 pytorch 中使用 ._parameters 内部方法的问题

Issue using ._parameters internal method in pytorch

我正在尝试使用内部 ._parameters 方法访问模型参数。当我如下定义模型时,我得到模型参数没有任何问题

model = nn.Linear(10, 10)
print(model._parameters)

但是,当我使用此方法获取定义为 class 的模型的参数时,我得到一个空的 OrderedDict()

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.fc = nn.Linear(10, 10)

    def forward(self, x):
        return self.fc(x)

model = MyModel()
print(model._parameters)

是否可以使用 ._parameters 解决此问题?

注意:我知道使用内部方法是不受欢迎的。

nn.Module: tensors stored inside _parameters, buffers inside _buffers, and modules inside _modules中有三种类型的对象。这三个都是私有的(由 _ 前缀表示),因此它们不打算由最终用户使用。

private nn.Module 属性 _parameters 是一个 OrderedDict 包含模块的参数(“参数”如 nn.Parameters,而不是 nn.Modules)。这就是为什么它在您的示例中为空的原因。请查看以下模块:

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.p = nn.Parameter(torch.rand(10))

    def forward(self, x):
        return self.fc(x)

>>> model = MyModel()

>>> print(model._parameters)
OrderedDict([('p', Parameter containing:
tensor([8.5576e-01, 1.4343e-01, 3.2866e-04, 9.4876e-01, 4.4837e-01, 9.7725e-02,
        2.7249e-01, 6.7258e-01, 5.6823e-01, 4.0484e-01], requires_grad=True))])

I understand that using internal methods are frowned upon.

不要使用_parameters。对于此用例,您应该改为使用适当的 API,即 nn.Module.parameters:

for p in model.parameters():
    print(p)

MyModel class 中的每个线性层都是一个模块,可以使用 _modules 访问。因此,您可以使用以下方式访问模型的参数:

for module_key in model._modules.keys():
    for param_key in model._modules[module_key]._parameters:

        p = model._modules[module_key]._parameters[param_key]