在 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.Parameter
s,而不是 nn.Module
s)。这就是为什么它在您的示例中为空的原因。请查看以下模块:
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]
我正在尝试使用内部 ._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.Parameter
s,而不是 nn.Module
s)。这就是为什么它在您的示例中为空的原因。请查看以下模块:
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]