You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

自定义多尺寸多格式图片测试模型时遇张量尺寸不匹配RuntimeError

问题分析与解决方案

看起来你遇到了两个典型的自定义图片测试阶段的尺寸不匹配问题,咱们一步步拆解解决:

第一个报错:张量堆叠失败(stack expects each tensor to be equal size

这个错误的核心原因是你用ImageFolder加载的自定义图片尺寸不一致(比如有的是[3, 288, 352],有的是[3, 256, 256]),而PyTorch的DataLoader默认会尝试把一个batch内的所有图片张量堆叠成统一形状的批量张量,尺寸不统一就会触发这个报错。之前用CIFAR数据集没问题,是因为CIFAR的所有图片都是固定的32×32尺寸。

解决办法:

统一所有输入图片的尺寸,在transform流程里添加Resize操作,把图片缩放到你训练模型时使用的输入尺寸(比如CIFAR的32×32):

transform = transforms.Compose([
    transforms.Resize((32, 32)),  # 替换成你训练时的输入尺寸,比如模型针对32×32训练就写这个
    transforms.ToTensor()
])
testset = datasets.ImageFolder(root="/home/khawar/Desktop/End-to-End_IEEE-TVSCT/test/", transform=transform)

如果必须保留图片原始尺寸,可以设置DataLoaderbatch_size=1,同时自定义collate_fn跳过张量堆叠,但这种方式效率较低,且可能触发第二个错误,更推荐统一尺寸的方案。

第二个报错:模型前向传播维度不匹配(size of tensor a (256) must match the size of tensor b (32)

这个错误是因为你的模型是针对固定尺寸的输入(比如CIFAR的32×32)训练的,模型内部的卷积、池化或全连接层的参数都是基于这个尺寸设计的。现在输入大尺寸图片(比如256×256),经过模型层处理后,张量的维度和后续层的预期维度不匹配,就会触发冲突。

解决办法:

  1. 最直接的方案:按照上面的方式,把所有测试图片缩放到训练时的输入尺寸,模型就能正常处理了。
  2. 如果需要支持任意尺寸图片:你需要修改模型结构,替换依赖固定输入尺寸的层:
    • 把固定输出尺寸的池化层(比如nn.MaxPool2d(2, 2))替换成自适应池化层nn.AdaptiveAvgPool2d((H, W)),其中H和W是后续层需要的尺寸;
    • 如果模型包含全连接层,建议去掉全连接层,改用全局平均池化(nn.AdaptiveAvgPool2d(1))再接输出层,这样就能适配任意输入尺寸。

额外代码优化建议

  • 加载模型时建议加上map_location参数,避免在无GPU环境下报错:
    model.load_state_dict(torch.load('./checkpoint/model.pth', map_location='cuda' if CUDA else 'cpu'))
    
  • 后续如果改用DataLoader,注意设置合理的batch参数:
    from torch.utils.data import DataLoader
    testloader = DataLoader(testset, batch_size=1, shuffle=False)  # 统一尺寸后可设更大batch
    # 函数内遍历testloader而非testset
    for i, (data, _) in enumerate(testloader):
        # 后续逻辑
    

内容的提问来源于stack exchange,提问作者Khawar Islam

火山引擎 最新活动