You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch中正确创建nn.Linear列表的方法及相关问题求助

嘿,这俩问题本质上都是因为你用了普通Python列表来存放Linear层——PyTorch没法自动管理普通列表里的Module实例,才会出现设备不匹配和打印不出来的情况。给你两个完美匹配需求的解决办法:

首选方案:用nn.ModuleList替代普通列表

这是PyTorch专门为存放Module设计的容器,会被模型自动注册,不管是设备迁移还是模型打印都能正常工作,而且完全保留你要的N个单独结果。

1. 修改初始化代码

把原来的普通列表换成nn.ModuleList:

self.list_1 = nn.ModuleList()
for i in range(N):
    self.list_1.append(nn.Linear(self.x, 1, bias=mlp_bias))

这样就再也不用手动给每个Linear层加.cuda()了!当你调用model.cuda()时,PyTorch会递归把nn.ModuleList里的所有层都移到GPU上,和直接赋值的self.nn = nn.Linear(...)一样省心。

2. Forward方法完全兼容原逻辑

你原来在forward里通过self.list_1[i]调用每个层、收集单独结果再拼接的代码完全不用改,比如:

def forward(self, input):
    individual_outputs = []
    for layer in self.list_1:
        individual_outputs.append(layer(input))
    # 按需求拼接,比如最后一维拼接成一个张量
    concatenated = torch.cat(individual_outputs, dim=-1)
    # 如果你需要返回单独结果,也可以把individual_outputs一起返回
    return concatenated, individual_outputs

这样既保留了每个层的单独输出,也能得到拼接后的结果。

3. 解决你的两个痛点

  • 设备迁移问题:nn.ModuleList属于PyTorch的Module体系,模型调用cuda()/cpu()时,会自动遍历并迁移里面所有层的参数,不会再出现张量设备不匹配的报错。
  • 模型打印问题:当你print(model)时,nn.ModuleList里的所有Linear层都会被正常打印出来,能清晰看到每个层的结构和参数信息。

备选方案:用nn.ModuleDict(需要给层命名时用)

如果想给每个Linear层起个明确的名字(比如layer_0、layer_1),可以用nn.ModuleDict,效果和nn.ModuleList一样:

self.layer_dict = nn.ModuleDict()
for i in range(N):
    self.layer_dict[f'layer_{i}'] = nn.Linear(self.x, 1, bias=mlp_bias)

调用时可以通过self.layer_dict['layer_0']指定某个层,或者遍历self.layer_dict.values()来处理所有层,同样能解决设备和打印的问题。

内容的提问来源于stack exchange,提问作者Mickey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:22:19