使用预训练InceptionV3进行图像分类时遭遇输入尺寸不匹配错误
解决InceptionV3预训练模型特征提取时的尺寸不匹配错误
咱们来拆解你遇到的RuntimeError: size mismatch问题,主要有几个核心问题需要修正:
1. 模型定义的笔误与结构错误
你代码里的pretrained_features是未定义的变量,这明显是个笔误,应该指代前面的pretrained_model。但更关键的是,直接通过children()[:-1]截取InceptionV3的结构并不合适——InceptionV3的网络结构比较特殊,简单用nn.Sequential包裹并截断会破坏特征输出逻辑,导致后续全连接层(fc)接收到的张量维度完全不匹配。
正确的特征提取模型定义
我们可以先关闭InceptionV3的辅助分类器(避免训练模式下返回双输出),再精准提取到全连接层之前的特征提取部分:
import torch import torch.nn as nn import torchvision.models as models # 加载预训练InceptionV3,关闭辅助分类器避免双输出 inceptionV3 = models.inception_v3(pretrained=True, aux_logits=False) # 提取特征提取主干:去掉最后的全连接层(fc) pretrained_model = nn.Sequential(*list(inceptionV3.children())[:-1]) # 冻结预训练参数 for param in pretrained_model.parameters(): param.requires_grad = False
这样定义的pretrained_model,输入torch.Size([256, 3, 299, 299])的张量后,会输出torch.Size([256, 2048, 1, 1])的特征图,你只需要再加一步展平操作,就能得到适配后续分类层的特征向量:
out_features = pretrained_model(inputs) # 展平特征图为二维张量 out_features = torch.flatten(out_features, 1)
2. Transforms中的弃用函数问题
你用的transforms.Scale在新版torchvision中已经被弃用了,建议替换为transforms.Resize,避免后续版本兼容性问题:
from torchvision import transforms data_transforms = transforms.Compose([ transforms.Resize((299,299)), # 替换Scale为Resize transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ])
3. 额外注意事项
- 如果你在训练模式下使用InceptionV3,务必确保
aux_logits=False,否则模型会返回主输出和辅助输出两个张量,同样会导致后续处理出错。 - 如果你想更精准地控制特征提取范围,可以直接调用InceptionV3的子模块(比如
inceptionV3.Mixed_5b、inceptionV3.Mixed_7c等)来拼接主干网络,结构会更清晰。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

