发布于2026-07-19 阅读(0)
扫一扫,手机访问

def forward(self, x):
layers = nn.ModuleList([nn.Linear(10, 5), nn.ReLU()]) # ❌ 错!每次 forward 都新建,不注册、无参数
return layers[1](layers[0](x))
正确写法:
class MyNet(nn.Module):
def __init__(self):
super().__init__()
self.blocks = nn.ModuleList([
nn.Linear(10, 20),
nn.ReLU(),
nn.Linear(20, 1)
])
def forward(self, x):
for layer in self.blocks:
x = layer(x)
return x
- 不能用 `+=` 或 `+` 拼接两个 `ModuleList`(会返回普通 `list`);要用 `.extend()`
- 支持 `for i, m in enumerate(module_list):`,但不支持字典式遍历(如 `.items()`)
- 如果模块顺序不固定、需按名调用(比如多分支结构),优先考虑 `ModuleDict`
self.heads = nn.ModuleDict({
"age": nn.Sequential(nn.Linear(128, 64), nn.ReLU(), nn.Linear(64, 1)),
"gender": nn.Sequential(nn.Linear(128, 32), nn.ReLU(), nn.Linear(32, 2))
})
def forward(self, x, task="age"):
return self.heads[task](x) # ✅ 自动找到对应模块并执行
- key 必须是合法标识符(不能含空格、破折号等),否则初始化时报 `TypeError`
- `self.heads.keys()` 返回的是 `torch.nn.modules.container.ModuleDictKeys`,不是普通 `list`,要转成 `list(self.heads.keys())` 才能迭代
- 不能用 `.update()` 增量添加(会静默失败);新增必须显式赋值,如 `self.heads["ethnicity"] = ...`
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8