基于pytorch的lstm时间回归预测(附全部代码)

本文针对新手详细解释了如何使用PyTorch实现LSTM进行时间序列回归预测,包括时间序列拆分、LSTM网络理解以及训练流程。通过实例强调了正确使用LSTM进行多特征预测的关键点,并提供了相关代码示例。
摘要由CSDN通过智能技术生成

首先说明作者是神经网络纯新手,虽然之前用过神经网络的代码,但基本上都是各种copy,只搞清楚了input_size和output_size,这两天因为工作需要要跑一个lstm的回归预测,在网上找的教程都不太清楚,对新手不是很友好,对新手友好的好像好多都是错的,自己也想了很久才想明白lstm回归预测到低是什么情况,跟大家分享一下,如果有错误也希望大家能指正。

首先是lstm的一张图,引自LSTM神经网络输入输出究竟是怎样的?,建议看本文章之前先找几个教程把lstm搞懂,我个人觉得lstm懂了的标志就是下面这张图你看懂了。

preview

首先,厘清一下本文所针对的任务,多特征的时间序列回归预测,再说直白一点,数据长成这个样子

 简单来说就是n*m的ndarray,n表示时间序列的长度,m表示每一个时间点的feature,我图中的数据来自LSTM入门例子:根据前9年的数据预测后3年的客流(PyTorch实现),准确来说,这个数据也不是来自于这个作者,是一个经典的“航空客流预测”任务。这个作者应该是个机器学习的大佬,这篇文章很值得一读,但是估计新手也读不太懂,我纯新手反正一开始是没搞懂,但是非常不建议去看这篇文章的原版,因为原版完全是个错误例子。

因为是小白向我就不先说错误例子怎么做的了,只说一个最关键的点,“航空客流预测”任务中,时间序列很短只有100多个长度,完全可以一次性放进长度为100多的lstm里面训练,但是通常的时间回归预测任务里面,时间长度很多,势必要分成很多个定长的序列,然后再送进去训练。这一点也是最误解我的,我想了半天都想不通time_step到低去哪了,事实上分成训练集之后的时间序列数据本身长度就是那个time_step。(当然也可以不定长,事

以下是一个使用PyTorch进行LSTM回归预测的示例代码: ``` python import torch import torch.nn as nn import numpy as np import matplotlib.pyplot as plt # 构造数据 time_steps = np.linspace(0, np.pi, 100) data = np.sin(time_steps) data = data.reshape(-1, 1) # 定义超参数 input_size = 1 hidden_size = 32 output_size = 1 lr = 0.01 num_epochs = 200 # 定义LSTM模型 class LSTM(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(LSTM, self).__init__() self.hidden_size = hidden_size self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): h0 = torch.zeros(1, x.size(0), self.hidden_size).to(x.device) # 初始化hidden state c0 = torch.zeros(1, x.size(0), self.hidden_size).to(x.device) # 初始化cell state out, _ = self.lstm(x, (h0, c0)) # LSTM层 out = self.fc(out[:, -1, :]) # 全连接层 return out # 实例化模型、定义损失函数和优化器 model = LSTM(input_size, hidden_size, output_size) criterion = nn.MSELoss() optimizer = torch.optim.Adam(model.parameters(), lr=lr) # 训练模型 for epoch in range(num_epochs): inputs = torch.from_numpy(data[:-1, :]).float() labels = torch.from_numpy(data[1:, :]).float() outputs = model(inputs) loss = criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step() if (epoch+1) % 20 == 0: print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item())) # 预测 model.eval() with torch.no_grad(): inputs = torch.from_numpy(data[:-1, :]).float() preds = model(inputs).detach().numpy() # 绘制结果 plt.plot(time_steps[:-1], data[:-1], 'r', label='real') plt.plot(time_steps[:-1], preds, 'b', label='predicted') plt.legend() plt.show() ``` 这个示例代码使用的是一个单层的LSTM模型,输入维度为1,隐藏维度为32,输出维度为1,用于对一个正弦函数进行回归预测。在训练过程中,使用MSELoss作为损失函数,Adam作为优化器。最后,使用模型对数据进行预测,并将结果与真实值进行对比。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值