PyTorch多输入模型输入输出特征定义及维度错误排查
问题解答
先针对你的模型维度疑问和报错问题逐一解答:
1. ResNet50全连接层与分支维度的关系
ResNet50原模型的最后全连接层Linear(in_features=2048, out_features=1000)是用于ImageNet分类的输出层,但你代码中通过list(models.resnet50().children())[:-1]已经去掉了这个全连接层,保留的是特征提取部分(到平均池化层为止),这部分输出的特征维度是torch.Size([1,2048,1,1]),展平后为2048维。
self.landmark_features的最后输出维度不需要强制设为1000,这个维度可以根据任务需求自由调整,和原ResNet的分类输出维度无绑定关系。self.combined_features的第一层Linear的in_features必须等于图像分支展平后的维度 + 关键点分支输出的维度,而非固定为1000。
2. 关键点分支第一层输入维度的正确性
关键点输入尺寸为[1,96],代表每个样本的特征是96维,所以self.landmark_features第一层Linear(in_features=96)的设置是完全正确的——Linear层的in_features必须和输入特征维度严格匹配。
3. 维度错误(1x3048 vs 1000x512)的原因
报错里的3048是图像分支展平维度 + 关键点分支输出维度的总和:
- 图像分支经
self.image_features后输出为torch.Size([1,2048,1,1]),通过a.view(a.size(0), -1)展平后变成[1,2048] - 关键点分支经
self.landmark_features后输出为[1,1000] - 两者拼接后维度为
1*(2048+1000)=1*3048
而你设置的self.combined_features第一层是Linear(1000,512),它期望输入维度为1000,但实际输入是3048,维度不匹配导致矩阵乘法报错。
修复方案
只需把self.combined_features的第一层Linear的in_features改为3048即可:
self.combined_features = nn.Sequential( nn.Linear(3048, 512), # 修改为图像分支+关键点分支的总维度:2048+1000=3048 nn.ReLU(), nn.Linear(512, 32), nn.ReLU(), nn.Linear(32,1))
你也可以调整self.landmark_features的最后输出维度(比如改为2048),只要保证拼接后的总维度和combined_features第一层的in_features一致即可。
内容的提问来源于stack exchange,提问作者A_Inb
相关产品推荐
相关产品推荐

