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

基于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模型应处理成对样本的一对一距离,而非所有样本的两两距离。
修复步骤
  1. 修正距离计算逻辑:将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. 调整线性层输入维度:合并后的特征维度变为1+256+256=513,修改线性层定义:
self.dense = nn.Linear(513, 1)
  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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 04:06:32