PyTorch双向LSTM输入尺寸与特征数量匹配精度异常问题咨询
结论:你的假设不成立
双向LSTM的工作机制澄清
PyTorch的nn.LSTM的input_size参数仅指代单个时间步、单个样本的输入特征维度,和是否开启双向模式完全无关。
双向模式的逻辑是在隐层层面实现的:框架会初始化两套完全独立的LSTM权重,一套按原序列顺序正向计算,一套按序列倒序反向计算,两套网络接收的输入完全一致,都是你传入的原始序列,不需要输入维度做任何翻倍处理。两个方向计算完成后,仅会对每个时间步的输出隐状态做拼接,因此最终输出的特征维度是2 * hidden_size,全程不会修改输入要求的维度。
你可以用以下代码验证这个逻辑,运行不会报错,也符合官方定义的计算规则:
import torch import torch.nn as nn # 假设原始单步特征维度为10,批次大小32,序列长度20 batch_input = torch.randn(32, 20, 10) # 双向LSTM input_size直接设为原始特征维度10,完全可以正常运行 bi_lstm = nn.LSTM( input_size=10, hidden_size=20, bidirectional=True, batch_first=True ) output, _ = bi_lstm(batch_input) # 输出最后一维是2*hidden_size=40,仅为隐状态拼接的结果 print(output.shape) # 输出:torch.Size([32, 20, 40])
你观察到精度提升的真实原因
你将input_size设置为原始特征数的两倍还能正常运行,说明你在输入LSTM之前一定增加了一层线性投影层,把原始D维特征映射到了2D维。这一步操作相当于给模型增加了可学习的输入特征变换能力,提升了模型整体的表达容量,自然会带来精度提升,和双向LSTM的机制没有任何关联。
验证方法
你可以做两组对照实验验证上述结论:
- 第一组:将双向LSTM替换为单向LSTM,同样在输入前加线性层把D维特征升到2D,保持
input_size=2D,你会观察到精度也会出现相近幅度的提升 - 第二组:保持双向LSTM的
input_size和原始特征数一致,将hidden_size翻倍,你同样会观察到精度提升,本质都是模型参数量增加、表达能力增强带来的效果
内容的提问来源于stack exchange,提问作者PapeK24
相关产品推荐
相关产品推荐

