加载CNN模型时遇load_state_dict参数缺失错误,求解决方法
解决PyTorch模型加载时的
load_state_dict()参数缺失错误 问题根源
你加载模型时的核心错误是没有实例化模型对象,直接用类名ConvNet调用了实例方法load_state_dict()。load_state_dict是PyTorch模型实例的方法,必须在类的实例上调用,而不是类本身。
另外,你的模型定义还有一个隐藏问题:forward方法的缩进错误,它现在定义在ConvNet类外面,这会导致模型无法正常执行前向传播,需要把forward方法缩进,放在ConvNet类内部。
修正步骤
修正模型定义的缩进问题
调整forward方法的缩进,使其成为ConvNet类的成员方法,同时修正注释和展平维度的细节:class ConvNet(nn.Module): def __init__(self): super(ConvNet, self).__init__() self.conv1 = nn.Conv2d(in_channels=2, out_channels=4, kernel_size=4) self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(4, 8, 4) self.fc1 = nn.Linear(8 * 6 * 6, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 1) def forward(self, x): # -> n, 2, 32, 32(输入通道为2,修正注释错误) x = self.pool(F.relu(self.conv1(x))) x = self.pool(F.relu(self.conv2(x))) x = x.flatten(start_dim=1) # 指定start_dim=1,避免批量维度被展平 x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x修正模型加载代码
先实例化模型对象,再调用load_state_dict方法:import torch from src.data import CarBonnetSource from src.model import ConvNet # 1. 实例化模型 model = ConvNet() # 2. 加载预训练权重(若测试环境与训练环境设备不同,需指定map_location) # 例:训练用GPU、测试用CPU时,改为torch.load(filepath, map_location=torch.device('cpu')) model.load_state_dict(torch.load(filepath)) # 3. 设置模型为评估模式 model.eval()
额外说明
- 你保存模型时使用
torch.save(model.state_dict(), filepath)是推荐方式,仅保存模型权重,加载时需先实例化对应结构的模型。 - 若加载时出现设备不匹配错误,务必在
torch.load中添加map_location参数指定目标设备。
内容的提问来源于stack exchange,提问作者Urvesh
相关产品推荐
相关产品推荐

