如何修改PyTorch LSTM模型以支持双输入参数(客运量+休息日数)
解决LSTM模型新增输入特征的问题
要让你的PyTorch LSTM接受客运量+休息日两个输入特征,需要从数据预处理、模型结构、训练逻辑三个层面调整,具体步骤如下:
1. 数据预处理:合并双特征序列
首先需要将历史客运量数组cd和休息日数组an按时间步对齐,拼接成每个时间步包含2个特征的输入序列。假设两个数组长度一致,可通过以下方式处理:
import numpy as np import torch # 示例数据 cd = np.array([112, 118, 132, 129, 121, 135, ...]) an = np.array([11, 9, 8, 9, 9, 8, ...]) # 拼接成(样本数, 特征数)的二维数组 combined_data = np.column_stack((cd, an)) # 转换为LSTM需要的序列格式:(batch_size, seq_length, input_size) def create_sequences(data, seq_length): xs, ys = [], [] for i in range(len(data) - seq_length): x = data[i:i+seq_length] y = data[i+seq_length, 0] # 预测目标仍为客运量(第一个特征) xs.append(x) ys.append(y) return np.array(xs), np.array(ys) seq_length = 6 # 替换为你实际使用的序列窗口长度 X, y = create_sequences(combined_data, seq_length) # 转为PyTorch张量 X = torch.tensor(X, dtype=torch.float32) y = torch.tensor(y, dtype=torch.float32).view(-1, 1)
2. 修改LSTM模型结构
核心是将模型的input_size从1改为2(对应新增的休息日特征),同时优化参数传入逻辑避免全局变量依赖:
import torch.nn as nn from torch.autograd import Variable class LSTM(nn.Module): def __init__( self, num_classes, input_size, # 现在传入2 hidden_size, num_layers, seq_length ): super(LSTM, self).__init__() self.num_classes = num_classes self.num_layers = num_layers self.input_size = input_size self.hidden_size = hidden_size self.seq_length = seq_length self.lstm = nn.LSTM( input_size=input_size, # 同步改为2 hidden_size=hidden_size, num_layers=num_layers, batch_first=True ) self.fc = nn.Linear(hidden_size, num_classes) def forward(self, x): # 初始化隐藏层与细胞状态,维度匹配当前输入批次 h_0 = Variable(torch.zeros(self.num_layers, x.size(0), self.hidden_size)) c_0 = Variable(torch.zeros(self.num_layers, x.size(0), self.hidden_size)) ula, (h_out, _) = self.lstm(x, (h_0, c_0)) h_out = h_out.view(-1, self.hidden_size) out = self.fc(h_out) return out
3. 模型初始化与训练适配
初始化模型时指定input_size=2,确保输入张量形状符合要求:
# 模型参数设置 num_classes = 1 # 预测单值(客运量) input_size = 2 # 双特征输入 hidden_size = 50 num_layers = 1 seq_length = 6 model = LSTM(num_classes, input_size, hidden_size, num_layers, seq_length) # 后续损失函数、优化器、训练循环无需改动,只需确保喂入的X是(batch_size, seq_length, 2)形状即可
常见失败原因排查
你之前修改未成功,大概率是以下问题之一:
- 未将
input_size从1改为2,导致LSTM输入维度不匹配 - 数据拼接时维度错误,输入序列形状不符合
(batch_size, seq_length, 2) - 训练时仍喂入单特征张量,未替换为合并后的双特征数据
内容的提问来源于stack exchange,提问作者Roma N
相关产品推荐
相关产品推荐

