PyTorch中forward()方法张量尺寸处理:LSTM输出长度优化问询
让LSTM直接输出指定长度序列的优化方案
针对你提出的问题——用窗口大小20的输入训练LSTM,希望直接输出长度为10的张量而非事后裁剪,这里提供几种实用方案,同时解决你担心的训练效率问题:
方案1:提前截取LSTM输出,减少后续计算
你当前的实现是先让LSTM输出20步序列,经过全连接层后再裁剪到10步,这会浪费全连接层对多余10步的计算。更高效的方式是先截取LSTM的输出,再传入全连接层:
def forward(self, x): x, _ = self.lstm(x) # 输出形状:[batch_size, 20, hidden_size] # 根据需求选择取前10步或最后10步,这里以最后10步为例 x = x[:, -10:, :] x = self.linear(x) # 仅处理10步的张量,计算量减半 return x
这种方式完全不需要修改LSTM本身,只是调整了数据处理顺序,就能直接降低计算开销,提升训练速度。
方案2:用Encoder-Decoder结构生成目标长度序列
如果你的任务是用20步输入的信息生成10步的新序列(比如长序列输入预测短序列输出),那更合理的方式是采用Encoder-Decoder架构,让LSTM直接生成10步输出:
def forward(self, x): # Encoder阶段:处理20步输入,获取最终的隐藏状态 _, (h_n, c_n) = self.lstm(x) # h_n/c_n形状:[num_layers, batch_size, hidden_size] # Decoder阶段:基于隐藏状态生成10步输出 batch_size = x.size(0) feature_dim = x.size(2) # 初始化Decoder的起始输入(可根据任务调整,比如用零张量或特殊token) decoder_input = torch.zeros(batch_size, 1, feature_dim, device=x.device) outputs = [] for _ in range(10): # 用当前隐藏状态和输入生成下一步输出 step_out, (h_n, c_n) = self.lstm(decoder_input, (h_n, c_n)) outputs.append(step_out) # 自回归场景下,可将当前输出作为下一轮输入;非自回归则保持初始输入即可 decoder_input = step_out # 拼接10步输出,得到目标形状的张量 x = torch.cat(outputs, dim=1) # 形状:[batch_size, 10, hidden_size] x = self.linear(x) return x
这种方式下,LSTM全程只生成你需要的10步序列,没有多余计算,完全符合“直接输出[:, :10, :]张量”的需求。
关于训练速度的补充说明
你之前的实现确实存在冗余计算:全连接层要处理20步的张量,后续裁剪又丢弃一半结果。方案1能直接减少50%的全连接层计算量,方案2则从根源上避免了多余的序列处理,两种方案都能有效提升训练效率。
内容的提问来源于stack exchange,提问作者chm
相关产品推荐
相关产品推荐

