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
相关产品推荐
相关产品推荐

