PyTorch LSTM 单步、多步时间预测

PyTorch LSTM 单步、多步时间预测

多维输入、多维输出;单步预测、多步滚动预测

python 复制代码
import torch
import torch.nn as nn
import torch.optim as optim

class LSTMModel(nn.Module):
    def __init__(self, input_dim, hidden_dim, num_layers, output_dim):
        super(LSTMModel, self).__init__()
        self.hidden_dim = hidden_dim
        self.num_layers = num_layers
        self.lstm = nn.LSTM(input_dim, hidden_dim, num_layers, batch_first=True)
        self.fc = nn.Linear(hidden_dim, output_dim)

    def forward(self, x):
        h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_dim).to(x.device)
        c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_dim).to(x.device)
        out, _ = self.lstm(x, (h0, c0))
        out = self.fc(out[:, -1, :])
        return out

# 超参数
input_dim = 400
hidden_dim = 64
num_layers = 2
output_dim = 1
num_epochs = 100
learning_rate = 0.001
batch_size = 32

# 初始化模型、损失函数和优化器
model = LSTMModel(input_dim, hidden_dim, num_layers, output_dim)
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)

# 示例训练代码(假设已经定义了train_loader)
for epoch in range(num_epochs):
    for i, (inputs, labels) in enumerate(train_loader):
        model.train()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        if (i+1) % 100 == 0:
            print(f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{len(train_loader)}], Loss: {loss.item():.4f}')

# 保存模型
torch.save(model.state_dict(), 'lstm_model_single_step.pth')

# 多步预测函数
def multi_step_predict(model, input_seq, future_steps):
    model.eval()  # 切换到评估模式
    predictions = []

    input_seq = input_seq.unsqueeze(0)  # 增加batch维度,shape变为 (1, seq_len, input_dim)

    for _ in range(future_steps):
        with torch.no_grad():  # 禁用梯度计算
            pred = model(input_seq)  # 预测下一个时间步
        predictions.append(pred.item())  # 存储预测值

        # 更新输入序列,将预测值添加到末尾,并移除最早的一个时间步
        input_seq = torch.cat((input_seq[:, 1:, :], pred.unsqueeze(0).unsqueeze(2)), dim=1)

    return predictions

# 示例调用
initial_input_seq = torch.randn(1, 155, 400)  # 假设这是的初始输入
future_steps = 10
predictions = multi_step_predict(model, initial_input_seq, future_steps)
print(predictions)
相关推荐
王哈哈^_^35 分钟前
【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·pyqt
写代码的小阿帆42 分钟前
pytorch实现深度神经网络DNN与卷积神经网络CNN
pytorch·cnn·dnn
是瑶瑶子啦1 小时前
【深度学习】论文笔记:空间变换网络(Spatial Transformer Networks)
论文阅读·人工智能·深度学习·视觉检测·空间变换
wangyue42 小时前
c# 深度模型入门
深度学习
川石课堂软件测试2 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
985小水博一枚呀3 小时前
【深度学习滑坡制图|论文解读3】基于融合CNN-Transformer网络和深度迁移学习的遥感影像滑坡制图方法
人工智能·深度学习·神经网络·cnn·transformer
985小水博一枚呀3 小时前
【深度学习滑坡制图|论文解读2】基于融合CNN-Transformer网络和深度迁移学习的遥感影像滑坡制图方法
人工智能·深度学习·神经网络·cnn·transformer·迁移学习
深度学习实战训练营4 小时前
基于CNN-RNN的影像报告生成
人工智能·深度学习
孙同学要努力11 小时前
全连接神经网络案例——手写数字识别
人工智能·深度学习·神经网络
丕羽12 小时前
【Pytorch】基本语法
人工智能·pytorch·python