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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 03:09:54