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

孪生网络单图测试报错:3D tensors expect 2 values for padding 求助

解决孪生网络单张测试时的AssertionError: 3D tensors expect 2 values for padding问题

这个错误的根源很清晰:你的测试输入少了批量(batch)维度,导致网络的卷积/池化层无法正确处理padding参数。

问题分析

孪生网络在训练时接收的是4维张量(形状为 [batch_size, channels, height, width]),但你单张测试时生成的图片张量是3维的([channels, height, width])。网络里的卷积层(比如nn.Conv2d)需要4维输入来识别高度、宽度维度对应的padding参数,3维张量会让PyTorch对维度数量产生误解,从而抛出这个断言错误。

修复后的测试代码

直接给单张图片张量添加batch维度即可,用unsqueeze(0)方法在最前面插入一个维度(批量大小设为1),同时我也帮你更新了一些PyTorch的旧写法:

if __name__=='__main__':
    net = SiameseNetwork().cuda()
    net.load_state_dict(torch.load("model.pt"))
    net.eval()  # 必须设置为评估模式,关闭训练专属层(如dropout)
    
    img0 = Image.open(os.path.join('data', 'faces', 'testing', 's5', '2.png'))
    img1 = Image.open(os.path.join('data', 'faces', 'testing', 's5', '1.png'))
    img0 = img0.convert("L")
    img1 = img1.convert("L")
    img0 = PIL.ImageOps.invert(img0)
    img1 = PIL.ImageOps.invert(img1)
    
    transform=transforms.Compose([transforms.Resize((100,100)), transforms.ToTensor() ])
    # 添加batch维度:从[C, H, W]变为[1, C, H, W]
    img0 = transform(img0).unsqueeze(0)
    img1 = transform(img1).unsqueeze(0)
    
    img0 = img0.cuda()
    img1 = img1.cuda()
    
    # PyTorch 0.4+无需再用Variable包装张量
    output1, output2 = net(img0, img1)
    euclidean_distance = F.pairwise_distance(output1, output2)
    # 用item()获取单个标量值更直观
    print(euclidean_distance.cpu().item())

关键修改点说明

  1. 添加batch维度:unsqueeze(0)给单张图片张量新增一个维度,让它符合网络输入的4维要求。
  2. 设置评估模式:net.eval()会关闭dropout、批量归一化等仅在训练时生效的层,确保测试结果稳定。
  3. 移除Variable:PyTorch 0.4版本之后,张量已经集成了自动求导功能,不需要再用Variable包装。

内容的提问来源于stack exchange,提问作者Артем Дачевский

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 07:27:38