ValueError optimizer got an empty parameter list,Linear 层放进普通 list 导致优化器拿不到参数的原因

报错 ValueError: optimizer got an empty parameter list 的核心原因:PyTorch 的普通 Python list 不会自动注册网络参数。你把 nn.Linear 放到 [] 里,这些层只是普通对象,不属于模型的可训练参数,model.parameters() 扫不到它们,传给优化器的参数列表是空的。PyTorch 专门提供 nn.ModuleList、nn.Sequential 来管理子模块,而不是原生 list。

一、错误示例(复现问题)

import torch

import torch.nn as nn

net = nn.Module()

net.layers = [nn.Linear(10,20), nn.Linear(20,5)] ❌ 普通 list

opt = torch.optim.Adam(net.parameters())

这里 net.layers 是普通列表,里面的 Linear 不会被递归注册,net.parameters() 返回空。

二、两种正确容器对比

容器是否注册参数适用场景
list(普通 python 列表)❌ 不注册仅存放对象,PyTorch 不识别为网络子模块
nn.ModuleList✅ 自动注册一串层,需要手动循环 forward,灵活性高
nn.Sequential✅ 自动注册串行堆叠,自动按顺序前向传播

三、推荐写法

方案 1:nn.ModuleList(需要自己循环 forward)

class MyNet(nn.Module):

def __init__(self):

super().__init__()

self.layers = nn.ModuleList([

nn.Linear(10,20),

nn.Linear(20,5)

])

def forward(self, x):

for l in self.layers:

x = l(x)

return x

方案 2:nn.Sequential(简单串行,代码更短)

self.layers = nn.Sequential(

nn.Linear(10,20),

nn.Linear(20,5)

)

forward直接 return self.layers(x)

四、容易踩坑的变体

  1. 先创建 list,再赋值给 ModuleList:可以

tmp = [nn.Linear(10,20)]

self.layers = nn.ModuleList(tmp)

  1. 把 ModuleList 放到普通 list 里:依然不行

self.bad = [nn.ModuleList([nn.Linear(10,20)])] ❌ 外层还是普通list

  1. 动态 append:要用 ModuleList 的 append

self.layers = nn.ModuleList()

self.layers.append(nn.Linear(10,20)) ✅

五、快速调试命令

打印所有参数,判断是否为空

print(list(net.parameters()))

打印子模块

print(list(net.children()))

【相关 FAQ】

问题 1:ValueError: optimizer got an empty parameter list,为什么 Linear 放到普通 list 就找不到参数?

回答 1:普通 Python list 不是 PyTorch 的模块容器,不会把子模块注册进模型;model.parameters() 只会遍历已经注册到 Module 树上的子模块,list 里面的 Linear 不会被扫描,优化器拿到空参数列表。

问题 2:nn.ModuleList 和 nn.Sequential 有什么区别?

回答 2:ModuleList 只负责注册参数,不会自动串联前向,forward 里要自己循环;Sequential 会自动按顺序把输入依次传给每一层,适合简单串行网络。

问题 3:我已经用 ModuleList 了,还报空参数,还有什么原因?

回答 3:检查是否把 ModuleList 包在另一个普通 list 里;或者网络层定义在 forward 函数内部(每次前向新建,不会被注册);也可能你实例化层的时候没有放在 __init__ 里。

【参考资料】

PyTorch 官方文档 nn.ModuleList

PyTorch nn.Module 子模块注册机制

【免责声明】

该规则针对 PyTorch;其他框架(TensorFlow 等)逻辑不一样。如果是混合容器、嵌套网络,需要逐层检查 children (),确认模块挂载关系。

本文来自作者[驰粒传讯官]投稿,不代表乌兰科技网立场,如若转载,请注明出处:https://www.wlcbnews.com/rgzn/202611/544.html

赞 (3)

今日大家都在搜的词:

发表回复

本站作者后才能评论

评论列表(4条)

  • 驰粒传讯官
    驰粒传讯官 2026年11月09日

    我是乌兰科技网的签约作者“驰粒传讯官”!

  • 驰粒传讯官
    驰粒传讯官 2026年11月09日

    希望本篇文章《ValueError optimizer got an empty parameter list,Linear 层放进普通 list 导致优化器拿不到参数的原因》能对你有所帮助!

  • 驰粒传讯官
    驰粒传讯官 2026年11月09日

    本站[乌兰科技网]内容主要涵盖:互联网行业的追踪与探索

  • 驰粒传讯官
    驰粒传讯官 2026年11月09日

    本文概览:报错 ValueError: optimizer got an empty parameter list 的核心原因:PyTorch 的普通 Python list 不会自动注册网络参数。你把 nn.Linear 放到 [] 里,这些层只是普通对象,不属于模型的可训练参数,model.parameters() 扫不到它们,传给优化器的参数列表是空的。PyTorch 专门提供 nn.ModuleList、nn.Sequential 来管理子模块,而不是原生 list。

联系我们

联系:143 0457 151

工作时间:周一至周五,9:30-18:30,节假日休息

关注我们