ResNet18图像预测时报IndexError: list index out of range错误求助
错误原因
你触发IndexError: list index out of range的核心原因是模型输出的预测索引值超出了class_names列表的长度范围,具体有3个直接导致问题的代码错误:
- 你直接使用了torchvision默认的ResNet18模型,默认全连接层输出维度是1000(对应ImageNet的1000个类别),而你自定义的
class_names只有20个元素,索引范围是019,模型输出的预测值大概率落在20999区间,自然无法匹配列表索引。 - 你完全没有加载训练好的模型权重,代码里写的
torch.save(model.state_dict, MODEL)是完全错误的操作:这行代码会把刚初始化的随机权重的ResNet18的状态字典方法直接覆盖你路径下的训练好的权重文件,你当前运行的模型是随机初始化的,输出结果完全不可控。 - 你直接将张量类型的
preds用作列表索引,没有转成Python整数类型,即使索引值在范围内也可能触发取值异常。
代码修复步骤
- 调整模型全连接层输出维度匹配你的类别数,替换原模型初始化部分的代码:
model = models.resnet18() # 修改全连接层输出为20类 model.fc = torch.nn.Linear(model.fc.in_features, len(class_names)) # 正确加载训练好的权重,注意不要写反save和load model.load_state_dict(torch.load(MODEL)) model.to(device) # 要把模型也加载到对应设备上 model.eval()
- 预测取值时将张量转成整数:
_, preds = torch.max(outputs, 1) # 转成int再取索引 label = class_names[preds.item()]
模型输出索引值校验方法
你可以在取分类标签前加以下校验逻辑,避免索引越界:
_, preds = torch.max(outputs, 1) # 校验1:打印输出维度,确认全连接层配置正确 print("模型输出维度:", outputs.shape) # 正常应该是 (1, 20) # 校验2:打印预测值和合法索引范围 pred_idx = preds.item() print(f"预测索引值:{pred_idx},合法索引范围:0~{len(class_names)-1}") # 校验3:加判断逻辑避免报错 if 0 <= pred_idx < len(class_names): label = class_names[pred_idx] else: label = "未知类别" print(f"警告:预测索引{pred_idx}超出合法范围")
内容的提问来源于stack exchange,提问作者Khawar Islam
相关产品推荐
相关产品推荐

