pytorch lstm训练例子,pytorch lstm 预测
本文主要介绍PyTorch构建LSTM,实现多变量、多步的时间序列负荷预测。有需要的朋友可以借鉴一下,希望能有所帮助。祝大家进步很大,早日升职加薪。
00-1010i。前言二。数据处理。LSTM模式四。训练和预测v .源代码和数据
目录
在前两篇文章中,PyTorch构建LSTM实现时间序列预测(负荷预测)和PyTorch构建LSTM实现多元时间序列预测(负荷预测),我们分别用LSTM实现单变量单步长时间序列预测和多元单步长时间序列预测。
本文主要考虑利用PyTorch建立LSTM,实现多变量多步时间序列预测。
系列文章:
PyTorch构建双向LSTM实现时序负荷预测
PyTorch建成LSTM实现多变量时序负荷预测
PyTorch深度学习LSTM从输入到线性输出
PyTorch建设LSTM实现时序负荷预测
I. 前言
数据集是某个地区某段时间的电力负荷数据。除了负载,还包括温度、湿度等信息。
本文根据前24次的负荷和当时的环境变量,预测后4次的负荷(步长可调)。
定义加载数据(文件名):
全局最大值、最小值
df=PD . read _ CSV(OS . path . dirname(OS . getcwd())/data/new _ data/ file _ name,encoding=gbk )
columns=df.columns
df.fillna(df.mean(),inplace=True)
MAX=np.max(df[columns[1]])
MIN=NP . MIN(df[列[1]])
df[columns[1]]=(df[columns[1]]-MIN)/(MAX-MIN)
返回df
类MyDataset(数据集):
def __init__(self,data):
self.data=数据
def __getitem__(self,item):
返回自身数据[项目]
def __len__(self):
返回len(自身数据)
定义nn_seq(文件名,B,编号):
打印(数据处理.)
数据=加载数据(文件名)
load=data[data.columns[1]]
load=load.tolist()
data=data.values.tolist()
序列=[]
对于范围(0,len(data) - 24 - num,num):内的I
train_seq=[]
train_label=[]
对于范围(I,I ^ 24):内的j
x=[load[j]]
对于范围(2,8):中的c
x.append(data[j][c])
训练序列追加(x)
对于范围(i 24,i 24编号):内的j
train_label.append(load[j])
train_seq=火炬。浮动处理器(训练序列)
train_label=火炬。FloatTensor(train_label)。视图(-1)
序列追加((train_seq,train_label))
#打印(序列[-1])
DTR=seq[0: int(len(seq)* 0.7)]
DTE=seq[int(len(seq)* 0.7): len(seq)]
train_len=int(len(Dtr)/B) * B
test_len=int(len(Dte)/B) * B
Dtr,Dte=D
tr[:train_len], Dte[:test_len]
train = MyDataset(Dtr)
test = MyDataset(Dte)
Dtr = DataLoader(dataset=train, batch_size=B, shuffle=False, num_workers=0)
Dte = DataLoader(dataset=test, batch_size=B, shuffle=False, num_workers=0)
return Dtr, Dte
其中num表示需要预测的步长,如num=4表示预测接下来4个时刻的负荷。
任意输出其中一条数据:
(tensor([[0.5830, 1.0000, 0.9091, 0.6957, 0.8333, 0.4884, 0.5122],[0.6215, 1.0000, 0.9091, 0.7391, 0.8333, 0.4884, 0.5122],
[0.5954, 1.0000, 0.9091, 0.7826, 0.8333, 0.4884, 0.5122],
[0.5391, 1.0000, 0.9091, 0.8261, 0.8333, 0.4884, 0.5122],
[0.5351, 1.0000, 0.9091, 0.8696, 0.8333, 0.4884, 0.5122],
[0.5169, 1.0000, 0.9091, 0.9130, 0.8333, 0.4884, 0.5122],
[0.4694, 1.0000, 0.9091, 0.9565, 0.8333, 0.4884, 0.5122],
[0.4489, 1.0000, 0.9091, 1.0000, 0.8333, 0.4884, 0.5122],
[0.4885, 1.0000, 0.9091, 0.0000, 1.0000, 0.3256, 0.3902],
[0.4612, 1.0000, 0.9091, 0.0435, 1.0000, 0.3256, 0.3902],
[0.4229, 1.0000, 0.9091, 0.0870, 1.0000, 0.3256, 0.3902],
[0.4173, 1.0000, 0.9091, 0.1304, 1.0000, 0.3256, 0.3902],
[0.4503, 1.0000, 0.9091, 0.1739, 1.0000, 0.3256, 0.3902],
[0.4502, 1.0000, 0.9091, 0.2174, 1.0000, 0.3256, 0.3902],
[0.5426, 1.0000, 0.9091, 0.2609, 1.0000, 0.3256, 0.3902],
[0.5579, 1.0000, 0.9091, 0.3043, 1.0000, 0.3256, 0.3902],
[0.6035, 1.0000, 0.9091, 0.3478, 1.0000, 0.3256, 0.3902],
[0.6540, 1.0000, 0.9091, 0.3913, 1.0000, 0.3256, 0.3902],
[0.6181, 1.0000, 0.9091, 0.4348, 1.0000, 0.3256, 0.3902],
[0.6334, 1.0000, 0.9091, 0.4783, 1.0000, 0.3256, 0.3902],
[0.6297, 1.0000, 0.9091, 0.5217, 1.0000, 0.3256, 0.3902],
[0.5610, 1.0000, 0.9091, 0.5652, 1.0000, 0.3256, 0.3902],
[0.5957, 1.0000, 0.9091, 0.6087, 1.0000, 0.3256, 0.3902],
[0.6427, 1.0000, 0.9091, 0.6522, 1.0000, 0.3256, 0.3902]]), tensor([0.6360, 0.6996, 0.6889, 0.6434]))
数据格式为(X, Y)。其中X一共24行,表示前24个时刻的负荷值和该时刻的环境变量。Y一共四个值,表示需要预测的四个负荷值。需要注意的是,此时input_size=7,output_size=4。
III. LSTM模型
这里采用了深入理解PyTorch中LSTM的输入和输出(从input输入到Linear输出)中的模型:
class LSTM(nn.Module):def __init__(self, input_size, hidden_size, num_layers, output_size, batch_size):
super().__init__()
self.input_size = input_size
self.hidden_size = hidden_size
self.num_layers = num_layers
self.output_size = output_size
self.num_directions = 1
self.batch_size = batch_size
self.lstm = nn.LSTM(self.input_size, self.hidden_size, self.num_layers, batch_first=True)
self.linear = nn.Linear(self.hidden_size, self.output_size)
def forward(self, input_seq):
h_0 = torch.randn(self.num_directions * self.num_layers, self.batch_size, self.hidden_size).to(device)
c_0 = torch.randn(self.num_directions * self.num_layers, self.batch_size, self.hidden_size).to(device)
# print(input_seq.size())
seq_len = input_seq.shape[1]
# input(batch_size, seq_len, input_size)
input_seq = input_seq.view(self.batch_size, seq_len, self.input_size)
# output(batch_size, seq_len, num_directions * hidden_size)
output, _ = self.lstm(input_seq, (h_0, c_0))
# print(output.size=, output.size())
# print(self.batch_size * seq_len, self.hidden_size)
output = output.contiguous().view(self.batch_size * seq_len, self.hidden_size) # (5 * 30, 64)
pred = self.linear(output) # pred()
# print(pred=, pred.shape)
pred = pred.view(self.batch_size, seq_len, -1)
pred = pred[:, -1, :]
return pred
IV. 训练和预测
训练和预测代码和前几篇都差不多,只是需要注意input_size和output_size的大小。
训练了100轮,预测接下来四个时刻的负荷值,MAPE为7.53%:
V. 源码及数据
源码及数据我放在了GitHub上,LSTM-Load-Forecasting
以上就是PyTorch搭建LSTM实现多变量多步长时序负荷预测的详细内容,更多关于LSTM多变量多步长时序负荷预测的资料请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。