为何torch.nn.Parameter在打印Net对象时未被列出?
为什么torch.nn.Parameter在打印Module时不显示?
这个问题我之前也碰到过,一开始也纳闷为啥明明参数能正常参与反向传播,打印模型的时候却看不到它。其实这是PyTorch对子模块和独立参数的处理逻辑不一样导致的。
核心原因
先拆解你代码里的两个成员变量:
self.layer是nn.Linear的实例,属于nn.Module的子类。PyTorch会自动把它注册为模型的子模块,存入self._modules字典中。当你打印模型时,默认的__repr__方法会遍历这个字典,把所有子模块都列出来,所以你能看到(layer): Linear(...)的输出。self.parameter是nn.Parameter实例,它会被自动注册到模型的self._parameters字典里,但这个字典里的内容默认不会被包含在模型的打印输出中。这就是为啥它能正常参与反向传播(net.parameters()能找到它),但打印模型时看不到的原因。
让参数显示出来的两种方法
方法一:用nn.ParameterList/nn.ParameterDict包裹参数
ParameterList和ParameterDict都是nn.Module的子类,会被当作子模块注册,打印时就会显示出来:
import torch import torch.nn as nn class MyNet(torch.nn.Module): def __init__(self): super(MyNet, self).__init__() self.layer = nn.Linear(10, 10) # 用ParameterList包裹单个参数 self.parameter = nn.ParameterList([nn.Parameter(torch.zeros(10,10, requires_grad=True))]) # 或者用ParameterDict(适合多参数场景) # self.parameter = nn.ParameterDict({'my_param': nn.Parameter(torch.zeros(10,10, requires_grad=True))}) net = MyNet() print(net)
此时输出会包含参数的信息:
MyNet(
(layer): Linear(in_features=10, out_features=10, bias=True)
(parameter): ParameterList(
(0): Parameter containing: [torch.float32 of size 10x10]
)
)
方法二:重写模型的__repr__方法
手动在打印内容里添加参数的信息,自由度更高:
import torch import torch.nn as nn class MyNet(torch.nn.Module): def __init__(self): super(MyNet, self).__init__() self.layer = nn.Linear(10, 10) self.parameter = torch.nn.Parameter(torch.zeros(10,10, requires_grad=True)) def __repr__(self): # 先调用父类的repr获取子模块信息,再追加参数信息 base_repr = super().__repr__() param_repr = f"\n (parameter): Parameter({self.parameter.shape})" return base_repr + param_repr net = MyNet() print(net)
输出会变成:
MyNet(
(layer): Linear(in_features=10, out_features=10, bias=True)
)
(parameter): Parameter(torch.Size([10, 10]))
补充验证
你可以运行print(list(net.parameters())),会发现self.parameter确实在模型的参数集合里,这也是它能正常反向传播的原因——它已经被PyTorch正确注册了,只是默认的打印逻辑没包含它而已。
内容的提问来源于stack exchange,提问作者flawr
相关产品推荐
相关产品推荐

