原帖给 Inception 输入单张 CHW 图像,在旧版 Conv2d 接口处失败:
RuntimeError: Expected 4-dimensional input for 4-dimensional weight 32 3 3, but got 3-dimensional input of size [3, 224, 224] instead
三个颜色通道不等于三个样本
原题 data 的 [3,224,224] 表示一张彩色图像,旧模型调用要求把样本数显式放到最前面。加 batch 维后得到 [1,3,224,224],不是把通道拆成三张灰度图。现代单个 Conv2d 支持范围变化,也不等于整套旧 Inception 接口可以省略 batch。
这条堆栈要求的是 [N,C,H,W]。原来的 [3,224,224] 只有通道、高、宽,缺少 batch 维。先在 model(data) 前确认实际对象:
print("josh050608")
print("data:", data.shape, data.dtype, data.device)
print("first parameter:", next(model.parameters()).dtype, next(model.parameters()).device)
如果确认为单张 CHW 图片,用 unsqueeze 增加批次轴:
import torch
batch = data.unsqueeze(0)
parameter = next(model.parameters())
batch = batch.to(device=parameter.device, dtype=parameter.dtype)
model.eval()
with torch.no_grad():
output = model(batch)
不要用 view 把颜色轴重新解释成 batch。若 data 本来已经是 [N,C,H,W],不应再 unsqueeze。现代某些 Conv2d API 允许无 batch 输入,但原题使用的旧版本与整套网络仍需按其接口处理。
原帖写的是 models.inception_v3(),这本身没有表示已加载预训练权重;若需要预训练模型,还要按所用 torchvision 版本选择权重与配套预处理。标准 Inception 权重常见输入规格与 224 不同,应以所选权重说明为准,不能将“加 batch 维”当成预处理已经正确。
验证前向输出的第一维为 1,且类别通道符合任务。训练时还要注意 Inception 的辅助输出结构,不能把整个返回对象直接当作单个 logits 张量。
用小网络验证加维位置和输出批次
下面是合成单图到批次的 CPU 验证,不加载 Inception 权重:
import torch
from torch import nn
image = torch.randn(3, 16, 16)
network = nn.Sequential(nn.Conv2d(3, 4, 3, padding=1), nn.ReLU(),
nn.AdaptiveAvgPool2d(1), nn.Flatten(), nn.Linear(4, 2))
batch = image.unsqueeze(0)
assert batch.shape == (1, 3, 16, 16)
network.eval()
with torch.no_grad():
logits = network(batch)
assert logits.shape == (1, 2)
assert logits.argmax(dim=1).shape == (1,)
print("image/batch/output:", image.shape, batch.shape, logits.shape)
真实流程应在单张图片的 transform 完成后加维;若使用 DataLoader,它通常已经添加 batch 维,不要再次 unsqueeze。输入若是 HWC 数组,应先按图像预处理转成 CHW,再加 batch,而不是把任意三维数组都视为 CHW。
原帖未明确加载预训练权重,models.inception_v3() 本身不能证明具有预训练参数。需要预训练时,按目标 torchvision 版本选择权重与配套尺寸、归一化;加 batch 只解决当前形状错误,不验证模型质量或全部预处理。
验收时输出的第 0 维应为 1,类别维满足任务;预测后再取这一张的类别。若模型在训练模式返回辅助输出,应按对应返回结构提取主 logits 和辅助项,不把返回对象整体传给只接收 Tensor 的代码。
参考:原始求助帖;技术依据:Conv2d(2.5)、torchvision 官方兼容表、nn.Module(2.5)。