基于LSTM的Siamese模型单样本推理报错:矩阵形状不匹配求助
问题分析
报错RuntimeError: mat1 and mat2 shapes cannot be multiplied (1x513 and 544x1)的核心是特征合并后的维度与线性层输入维度不匹配,根源在于torch.cdist的使用逻辑错误:
- 单样本推理时,
out1和out2形状均为(1, 256)(双向LSTM输出维度为2*128=256) torch.cdist(out1, out2)返回(1,1)(计算两个向量的两两距离),而x3、x4的形状为(1,256)- 合并后总维度为
1+256+256=513,但线性层定义为nn.Linear(544, 1),维度不匹配 - 训练时能运行是因为batch size为32,此时
torch.cdist返回(32,32),合并后总维度为32+256+256=544,刚好匹配线性层,但这是逻辑错误的巧合——Siamese模型应处理成对样本的一对一距离,而非所有样本的两两距离。
修复步骤
- 修正距离计算逻辑:将
torch.cdist(out1, out2)替换为成对样本的距离计算,比如L2距离:
# 替换原x5的计算 x5 = torch.norm(out1 - out2, dim=1, keepdim=True) # 形状为(N,1),N为batch size
如果需要曼哈顿距离,可改用:
x5 = torch.abs(out1 - out2).sum(dim=1, keepdim=True)
- 调整线性层输入维度:合并后的特征维度变为
1+256+256=513,修改线性层定义:
self.dense = nn.Linear(513, 1)
- 单样本推理示例:确保输入添加batch维度(单样本需手动转为
(1, seq_len)):
# 假设model_input和student_input是单样本的token序列(形状为(seq_len,)) model_input = model_input.unsqueeze(0).cuda() # 转为(1, seq_len) student_input = student_input.unsqueeze(0).cuda() with torch.no_grad(): output = Model(model_input, student_input) print(output.item()) # 输出相似度概率
额外说明
- 原训练代码中使用
torch.cdist是逻辑错误,即使能运行,模型学习到的是所有样本两两之间的距离,而非目标的样本对距离,修正后模型逻辑才符合Siamese网络的成对匹配任务要求。 - 推理时必须保证输入存在batch维度,PyTorch模型默认接受批量输入,单样本需手动添加
batch_size=1的维度。
内容的提问来源于stack exchange,提问作者silver key
相关产品推荐
相关产品推荐

