PyTorch中model.parameters()返回空列表致优化器报错求助
解决PyTorch中
ValueError: optimizer got an empty parameter list错误 核心问题
你的img2latent类将构造函数错误地写成了__int__,而Python类的构造函数必须是__init__。这个拼写错误导致:
- 父类
nn.Module的初始化逻辑未执行,PyTorch无法自动将self.fc1、self.fc2这类子模块注册为可训练参数 - 类实例化时,网络层根本没被创建,最终
fullmodel.parameters()返回空列表
修正后的代码
import torch from torch import nn class img2latent(nn.Module): # 修正构造函数名称:__init__ 而非 __int__ def __init__(self): super(img2latent, self).__init__() self.neuralDim = len(X_train[0]) self.latentDim = len(Y_train[0]) self.hiddenDim = self.neuralDim self.fc1 = nn.Linear(self.neuralDim, self.hiddenDim) self.fc2 = nn.Linear(self.hiddenDim, self.latentDim) # 初始化权重,确保张量与模型设备匹配 self.fc1.weight.data.fill_(1) self.fc1.bias.data.fill_(0) # 将ridge的参数转换为PyTorch张量并移到对应设备 self.fc2.weight.data = torch.tensor(ridge.coef_, dtype=torch.float32).to(device) self.fc2.bias.data = torch.tensor(ridge.intercept_, dtype=torch.float32).to(device) def forward(self, x): x = self.fc1(x) x = torch.relu(x) x = self.fc2(x) return x def train_loop(model, loss_fn, optimizer): model.train() pred = model(X_train) loss = loss_fn(pred, Y_train) optimizer.zero_grad() loss.backward() optimizer.step() return loss.item() fullmodel = img2latent() fullmodel = fullmodel.to(device) loss_fn = nn.MSELoss() optimizer = torch.optim.Adam(fullmodel.parameters(), lr=0.01, weight_decay=0.01) for t in range(1000): loss_val = train_loop(fullmodel, loss_fn, optimizer) if t % 100 == 0: print(t, f"{loss_val:0.2f}", end='\t') # 预测训练集 latent pred = fullmodel(X_train)
额外注意事项
- 初始化
fc2的权重时,要确保ridge.coef_和ridge.intercept_被转换为PyTorch张量,并且和模型所在设备(CPU/GPU)一致,避免后续计算时出现设备不匹配错误 - 训练循环中不要用
loss同时指代损失函数和损失值,容易引发变量覆盖问题,这里改成了loss_fn和loss_val
内容的提问来源于stack exchange,提问作者Sudhanshu Bharadwaj
相关产品推荐
相关产品推荐

