PyTorch孪生神经网络批量输入尺寸不匹配错误解决求助
问题原因分析
错误核心是特征拼接维度选错了:
- 批量输入时,
output1和output2的形状是[batch_size, 5] - 默认的
torch.cat会在样本维度(第0维)拼接,得到[2*batch_size, 5]的张量 - 但后续全连接层
self.fc第一层是nn.Linear(10,5),要求每个样本的特征是10维,自然就出现尺寸不匹配的报错
修复方案
1. 修正拼接维度
在forward方法里,给torch.cat加上dim=1参数,把每个样本的两个特征在特征维度拼接,这样得到的张量形状是[batch_size, 10],刚好匹配全连接层的输入要求:
def forward(self, input1, input2): output1 = self.forward_once(input1) output2 = self.forward_once(input2) # 关键修改:指定dim=1在特征维度拼接 combinedOutput = torch.cat((output1, output2), dim=1) output = self.fc(combinedOutput) return output
2. 批量数据输入的正确姿势
你的DataLoader需要返回成对的输入数据,每个batch的结构应该是(input_batch1, input_batch2, label_batch):
input_batch1/input_batch2:形状[batch_size, 30](对应你的输入特征维度)label_batch:形状[batch_size, 1](二分类标签,0或1表示样本对是否相似)
训练循环的示例代码:
for input1, input2, labels in dataloader: optimizer.zero_grad() outputs = model(input1, input2) # Sigmoid输出是浮点型,标签要转成float匹配 loss = criterion(outputs, labels.float()) loss.backward() optimizer.step()
验证修改
用随机批量数据测试是否正常:
model = MySiameseNet() # 生成batch_size=10的随机输入 input1 = torch.randn(10, 30) input2 = torch.randn(10, 30) output = model(input1, input2) print(output.shape) # 应该输出torch.Size([10, 1]),符合预期
内容的提问来源于stack exchange,提问作者Edison
相关产品推荐
相关产品推荐

