lstm pytorch实例实现,pytorch lstm预测
本文主要介绍PyTorch构建双向LSTM实现时间序列负荷预测。有需要的朋友可以参考一下,希望能有所帮助。祝大家进步很大,早日升职加薪。
00-1010i。前言二。原则输入输出批量_先输出提取III。训练和预测。源代码和数据
目录
前面的文章都介绍了单向LSTM。这篇文章讲的是双向LSTM。
系列文章:
PyTorch构建LSTM实现多变量多步长时序负荷预测
PyTorch建成LSTM实现多变量时序负荷预测
PyTorch深度学习LSTM从输入到线性输出
PyTorch建设LSTM实现时序负荷预测
I. 前言
LSTM的输入和输出在《PyTorch》对LSTM的输入和输出的深入理解(从输入输入到线性输出)中已经有详细的描述。
关于神经网络的参数。LSTM在官方文件中给出的解释是:
总共有七个参数,其中只有前三个是必需的。由于PyTorch的DataLoader被广泛用于形成批量数据,batch_first也很重要。LSTM的两个常见应用场景是文本处理和时间序列预测,下面我将从这两个方面详细讲解每个参数。
Input_size:在文本处理中,因为一个单词不能参与运算,所以我们要通过Word2Vec来嵌入这个单词,把每个单词表示成一个向量。这时input_size=embedding_size。比如每个句子有五个单词,每个单词用一个100维的向量表示,所以这里input _ size=100在时间序列预测中,比如负荷预测,每个负荷都是一个单独的值,可以直接参与计算,所以不需要把每个负荷都表示成一个向量。此时,input_size=1。但如果用多元预测,比如我们用前24小时每个时刻的【负荷、风速、温度、压力、湿度、天气、节假日信息】来预测下一时刻的负荷,那么此时input_size=7。Hidden_size:隐藏层节点的数量。你可以随意设置。Num_layers:层数。Nn。LSTMCell与nn比较。默认情况下,LSTM的层数为1。Batch_first:默认值为False,其含义稍后描述。
II. 原理
关于LSTM的投入,官方文件给出了如下定义:
如你所见,输入由两部分组成:输入,(初始隐藏状态h_0,初始单元状态c_0)
其中输入:
输入(序列长度,批量大小,输入大小)
Seq_len:在文本处理中,如果一个句子有7个单词,那么seq _ len=7;在时间序列预测中,假设我们用前24小时的负荷来预测下一时刻的负荷,那么seq_len=24。Batch_size:输入LSTM一次的样品数量。在文本处理中,可以一次输入很多句子;在时间序列预测中,还可以一次输入多条数据。Input_size:见上。(h_0,c_0):
h_0(方向数*层数,批量大小,隐藏大小)
c_0(方向数*层数,批量大小,隐藏大小)
h0和c0的形状相同。
Num_directions:如果是双向LSTM,那么num _ directions=2;否则,数量方向=1。Num_layers:见上一篇文章。Batch_size:见上一篇文章。Hidden_size:见上一篇文章。
class="maodian">
Outputs
关于LSTM的输出,官方文档给出的定义为:
可以看到,输出也由两部分组成:otput、(隐状态h_n,单元状态c_n)
其中output的shape为:
output(seq_len, batch_size, num_directions * hidden_size)
h_n和c_n的shape保持不变,参数解释见前文。
batch_first
如果在初始化LSTM时令batch_first=True,那么input和output的shape将由:
input(seq_len, batch_size, input_size)
变为:
input(batch_size, seq_len, input_size)
即batch_size提前。
输出提取
假设最后我们得到了output(batch_size, seq_len, 2 * hidden_size),我们需要将其输入到线性层,有以下两种方法可以参考:
(1)直接输入
和单向一样,我们可以将output直接输入到Linear。在单向LSTM中:
self.linear = nn.Linear(self.hidden_size, self.output_size)
而在双向LSTM中:
self.linear = nn.Linear(2 * self.hidden_size, self.output_size)
模型:
class BiLSTM(nn.Module):
(2)处理后再输入
在LSTM中,经过线性层后的output的shape为(batch_size, seq_len, output_size)。假设我们用前24个小时(1 to 24)预测后2个小时的负荷(25 to 26),那么seq_len=24, output_size=2。根据LSTM的原理,最终的输出中包含了所有位置的预测值,也就是((2 3), (3 4), (4 5)…(25 26))。很显然我们只需要最后一个预测值,即output[:, -1, :]。
而在双向LSTM中,一开始output(batch_size, seq_len, 2 * hidden_size),这里面包含了所有位置的两个方向的输出。简单来说,output[0]为序列从左往右第一个隐藏层状态输出和序列从右往左最后一个隐藏层状态输出的拼接;output[-1]为序列从左往右最后一个隐藏层状态输出和序列从右往左第一个隐藏层状态输出的拼接。
如果我们想要同时利用前向和后向的输出,我们可以将它们从中间切割,然后求平均。比如output的shape为(30, 24, 2 * 64),我们将其变成(30, 24, 2, 64),然后在dim=2上求平均,得到一个shape为(30, 24, 64)的输出,此时就与单向LSTM的输出一致了。
具体处理方法:
output = output.contiguous().view(self.batch_size, seq_len, self.num_directions, self.hidden_size)
模型代码:
class BiLSTM(nn.Module):
III. 训练和预测
数据处理、训练以及预测同前面几篇文章。
这里对单步长多变量的预测进行对比,在其他条件保持一致的情况下,得到的实验结果如下所示:
方法LSTMBiLSTM(1)BiLSTM(2)MAPE7.439.299.29
可以看到,仅针对我所使用的数据而言,单向LSTM的效果更好。对于前面提到的两种方法,貌似差异不大。
IV. 源码及数据
源码及数据我放在了GitHub上,LSTM-Load-Forecasting
以上就是PyTorch搭建双向LSTM实现时间序列负荷预测的详细内容,更多关于双向LSTM时序负荷预测的资料请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。