ImageNet分类:预训练VGG11 Top-5错误率异常偏高问题排查
准确率计算验证
你的计算是正确的,返回结果中Top-5错误率为0.99607,对应Top-5准确率为1 - 0.99607 = 0.393%,Top-1准确率仅为0.102%,远低于torchvision预训练VGG11的公开基准水平(正常Top-1准确率约69%,Top-5准确率约89%),说明预测流程存在明确错误。
你收到的服务器返回原始内容如下:
Error: 0.99607 (top-5) 0.99898 (top-1) Per-class error (classes 1-1000): 1 1 1 1 1 1 ...
可能的出错环节
你已确认测试图像按字母顺序加载,排除样本顺序错配的前提下,结合你提供的实现代码,问题大概率出在以下环节,按概率从高到低排序:
- 类别索引映射不匹配:这是导致错误率接近100%的最核心原因。
datasets.ImageFolder会自动按照数据集子文件夹名称的字母顺序,从0开始分配类别标签,但ImageNet官方评估服务器使用的1000类标签是按照固定WordNet ID映射排序的,和文件夹名字母序完全不一致。你输出的预测类别编号和服务器端的真值编号无法对应,自然会得到几乎全错的结果。 - 预处理逻辑隐性错误:你当前写的Resize(256)+CenterCrop(224)+标准化的流程本身和预训练权重适配的处理逻辑一致,但如果Resize调用时未匹配预训练使用的插值方式、或者图像加载时出现通道顺序错位(比如误把PIL读取的RGB图转成BGR),也会导致预测结果异常,但这类问题一般不会让错误率高到接近100%。
- 输出索引偏移:部分旧版本torchvision的预训练VGG11权重对应的类别顺序,和官方ImageNet评估列表存在1位索引差,但这类问题只会让准确率小幅下降,不会出现几乎全错的情况。
参考实现代码
你提供的代码如下:
vgg11 = models.vgg11(pretrained=True) vgg11.to(torch.device("cuda")) vgg11.eval() normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) test_loader = torch.utils.data.DataLoader(datasets.ImageFolder("test_dataset", transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), normalize ])), batch_size=32, shuffle=False) fp = open("predictions.txt", "w") for a, b in tqdm(test_loader): preds = vgg11(a.cuda()) _, preds = torch.topk(preds, k=5, dim=1) preds = preds.cpu().detach().numpy() for i in range(len(preds)): fp.write(" ".join(str(j) for j in preds[i])+"\n") fp.close()
排查建议
优先核对类别映射关系:先选取数张类别明确的ImageNet验证集图片做本地预测,确认模型输出的类别编号和评估服务器要求的编号规则一致,修正映射关系后准确率会立刻回到正常区间。
内容的提问来源于stack exchange,提问作者Atif Hassan
相关产品推荐
相关产品推荐

