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

PyTorch搭建LSTM遇RuntimeError:输入特征数与input_size不匹配求助

解决LSTM输入维度不匹配及精度问题

问题根源分析

  • 输入维度错误:设置input_size=7后,你通过xTrain = xTrain[:, :, None]将输入张量形状从[batch_size, 7]修改为[batch_size, 7, 1]。而LSTM在batch_first=True时要求输入格式为[batch_size, seq_len, input_size],此时输入最后一维为1,与设定的input_size=7不匹配,直接触发报错。
  • 精度低下原因:当input_size=1时,模型仅能接收1个特征输入,你原本的7个时间特征被丢弃了6个,无法学习到完整的时间模式,自然导致预测精度极低。

代码修正方案

1. 核心调整点

  • 修正输入张量维度,使其符合LSTM的[batch_size, seq_len, input_size]格式(这里每个样本是单时间步的7个特征,所以seq_len=1,input_size=7)。
  • 移除标签张量多余的维度,保持与模型输出维度一致。

2. 完整修正代码

import torch
import torch.nn as nn
from torch.autograd import Variable
import numpy as np

n_feature = feature_train.shape[1]  # number of columns in input matrix
class LSTM(nn.Module):
    def __init__(self, num_classes, input_size, hidden_size, num_layers):
        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 = 1  # 单时间步
        
        self.lstm = nn.LSTM(input_size=input_size, 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

num_epochs = 40  # 建议增加训练轮次
learning_rate = 0.001  # 调小学习率更稳定
input_size = 7
hidden_size = 30
num_layers = 1

num_outputs = 2

lstm = LSTM(num_outputs, input_size, hidden_size, num_layers)

criterion = torch.nn.MSELoss()    # mean-squared error for regression
optimizer = torch.optim.Adam(lstm.parameters(), lr=learning_rate)

# convert to tensor
xTrain = torch.tensor(np.array(feature_train), dtype=torch.float)
xTrain = xTrain.unsqueeze(1)  # 调整为 [batch_size, 1, 7]
yTrain = torch.tensor(np.array(label_train).reshape(-1,2), dtype=torch.float)

xTrainValidation = torch.tensor(np.array(feature_validation), dtype=torch.float)
xTrainValidation = xTrainValidation.unsqueeze(1)
yTrainValidation = torch.tensor(np.array(label_validation).reshape(-1,2), dtype=torch.float)

# Train the model
for epoch in range(num_epochs):
    outputs = lstm(xTrain)
    optimizer.zero_grad()

    loss = criterion(outputs, yTrain)
    
    loss.backward()
    optimizer.step()
    
    # 加入验证集监控
    with torch.no_grad():
        val_outputs = lstm(xTrainValidation)
        val_loss = criterion(val_outputs, yTrainValidation)
    print(f"Epoch: {epoch}, Train Loss: {loss.item():.5f}, Val Loss: {val_loss.item():.5f}")
    torch.save(lstm, 'saved_model.pth')

额外优化建议

  • 数据归一化:时、分、秒等特征数值范围差异大,建议用StandardScaler或MinMaxScaler对输入特征做归一化,能大幅提升模型收敛速度和精度。
  • 调整网络结构:可尝试增加LSTM层数或隐藏层神经元数量,增强模型拟合能力。
  • 早停机制:添加验证集损失监控,当验证损失连续多轮不下降时停止训练,避免过拟合。

内容的提问来源于stack exchange,提问作者NoxiNox

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 07:09:19