PyTorch中Conv2d输入尺寸错误:输入[16,3,120,120]却报错[16,1280]
问题原因与解决方法
报错本质
这个错误说明你的模型中存在一个conv2d层,当前传入它的是形状为[16, 1280]的2D张量(批量数+特征数),但卷积层要求输入必须带空间维度:要么是单样本的3D张量[通道数, 高度, 宽度],要么是批量的4D张量[批量数, 通道数, 高度, 宽度]。
问题根源
预训练EfficientNet-B1的结构逻辑是:
features模块(特征提取部分)输出4D特征图[B, 1280, H', W']- 经过全局平均池化(
avgpool)压缩为2D张量[B, 1280] - 最后由
classifier模块(原结构是Dropout+Linear)输出分类结果
你修改分类器时,大概率错误地在全局池化之后加入了卷积层——而池化后的张量已经丢失了空间维度,自然无法满足卷积层的输入要求。
正确修改方案
方案1:仅替换最后的全连接层(最常用)
直接把原分类器的全连接层改成12类即可,不需要加卷积层:
from torchvision import models import torch.nn as nn # 加载预训练模型 model = models.efficientnet_b1(pretrained=True) # 可选:冻结特征提取层,只训练分类器 for param in model.features.parameters(): param.requires_grad = False # 替换分类器:原classifier是Sequential(Dropout(0.2), Linear(1280, 1000)) model.classifier = nn.Sequential( nn.Dropout(0.2), nn.Linear(1280, 12) # 输出维度改为12类 )
方案2:若需在特征提取后加卷积层
如果必须加入卷积操作,要把卷积层放在全局池化之前(即features模块之后),这样输入到卷积层的还是带空间维度的4D特征图:
from torchvision import models import torch.nn as nn model = models.efficientnet_b1(pretrained=True) # 在features模块末尾添加卷积层 model.features.add_module('extra_conv', nn.Conv2d(1280, 512, kernel_size=1)) # 调整后续池化和分类器(因为通道数从1280变成了512) model.avgpool = nn.AdaptiveAvgPool2d(1) model.classifier = nn.Sequential( nn.Dropout(0.2), nn.Linear(512, 12) )
额外检查
如果是自定义了forward方法,确认没有提前将4D特征图扁平化后,又传入卷积层的逻辑。
内容的提问来源于stack exchange,提问作者Kartellboss
相关产品推荐
相关产品推荐

