孪生网络单图测试报错: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())
关键修改点说明
- 添加batch维度:
unsqueeze(0)给单张图片张量新增一个维度,让它符合网络输入的4维要求。 - 设置评估模式:
net.eval()会关闭dropout、批量归一化等仅在训练时生效的层,确保测试结果稳定。 - 移除Variable:PyTorch 0.4版本之后,张量已经集成了自动求导功能,不需要再用
Variable包装。
内容的提问来源于stack exchange,提问作者Артем Дачевский
相关产品推荐
相关产品推荐

