You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 20:55:58