RNN层及时间序列预测

2024-03-18 11:08
文章标签 时间 预测 序列 rnn 层及

本文主要是介绍RNN层及时间序列预测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

    • 1.RNN层
      • 循环神经网络介绍
      • RNN层原理
      • RNN的缺点
      • 实现一个RNN(多层或单层)
    • 2.时间序列预测

1.RNN层

循环神经网络介绍

循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network)循环神经网络具有记忆性、参数共享并且图灵完备(Turing completeness),因此在对序列的非线性特征进行学习时具有一定优势。循环神经网络在自然语言处理(Natural Language Processing, NLP),例如语音识别、语言建模、机器翻译等领域有应用,也被用于各类时间序列预报。引入了卷积神经网络(Convolutional Neural Network,CNN)构筑的循环神经网络可以处理包含序列输入的计算机视觉问题。

需要处理序列数据 (一串相互依赖的数据流)的场景就需要使用 RNN 来解决

典型的集中序列数据:

  1. 文章里的文字内容
  2. 语音里的音频内容
  3. 股票市场中的价格走势
  4. ……

RNN层原理

RNN 之所以能够有效的处理序列数据,主要是基于他的比较特殊的运行原理。下面给大家介绍一下 RNN 的基本运行原理。

在这里插入图片描述
如果用以上的方式,去预测包含五个单词的一句话的态度,比如这句话是电影评价,通过hate以及boring大致可以看出是这位观众的态度是negative。因为有五个W,b,这五个单词之间没有任何相关性,这对于一句话来说显然是不合理的。我们对其加以改进

在这里插入图片描述
如果我们将五个W,b变为相同的W和b,便能使每个单词都能影响W和b,考虑到顺序性,让上一次单词的作用影响到之后的单词,循环神经网络就发挥了他的作用

在这里插入图片描述
为什么称之为循环神经网络呢,因为从上图看起来,这个网络是在向右传递,但我们可以将他看作是下面这张图,如图:
在这里插入图片描述
h0一般初始化为全零,每当进入一个feature,循环神经网络就循环一次,产生下一个h,一般来说需要加上tanh激活函数,每次循环产生的h都能输出(如果这是一层的RNN),若是多层,则输出到下一层
在这里插入图片描述
下面我们来看看如何进行梯度推导,进而理解训练的过程
在这里插入图片描述
WI是Wih,WR是Whh,Et是最后的输出loss

RNN的缺点

RNN的缺点也比较明显:

  1. RNN 有短期记忆问题,无法处理很长的输入序列
  2. 训练 RNN 需要投入极大的成本

实现一个RNN(多层或单层)

下面借助pytorch实现RNN

from torch import nn
import torch# 1层的RNN一次性进入
rnn = nn.RNN(input_size=100, hidden_size=20, num_layers=1)  # 这里是一层RNN
print(rnn._parameters.keys())  # 网络中的变量为W和b,即以下四个
print(rnn.weight_ih_l0.shape, rnn.weight_hh_l0.shape,rnn.bias_ih_l0.shape, rnn.bias_hh_l0.shape,)
x = torch.randn(10, 3, 100)
h0 = torch.zeros(1, 3, 20)
out, ht = rnn(x, h0)
print(out.shape, ht.shape)
# 1层的RNN分批次进入
cell1 = nn.RNNCell(100,20,)
h1 = torch.zeros(3,20)  # batchsize是3
for xt in x:h1 = cell1(xt,h1)
print(h1.shape)
# 2层的RNN分批次进入
cell1 = nn.RNNCell(100, 30)
h1 = torch.zeros(3, 30)
cell2 = nn.RNNCell(30, 20)
h2 = torch.zeros(3, 20)
for xt in x:h1 = cell1(xt, h1)h2 = cell2(h1, h2)
print(h2.shape)

2.时间序列预测

num_time_steps = 50
input_size = 1
hidden_size = 16
output_size = 1
lr = 0.01class Net(nn.Module):def __init__(self, ):super(Net, self).__init__()self.rnn = nn.RNN(input_size=input_size,hidden_size=hidden_size,num_layers=1,batch_first=True,)for p in self.rnn.parameters():nn.init.normal_(p, mean=0.0, std=0.001)self.linear = nn.Linear(hidden_size, output_size)def forward(self, x, hidden_prev):out, hidden_prev = self.rnn(x, hidden_prev)# [b, seq, h]out = out.view(-1, hidden_size)out = self.linear(out)out = out.unsqueeze(dim=0)return out, hidden_prev

train和test

model = Net()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr)hidden_prev = torch.zeros(1, 1, hidden_size)for iter in range(6000):start = np.random.randint(3, size=1)[0]time_steps = np.linspace(start, start + 10, num_time_steps)data = np.sin(time_steps)data = data.reshape(num_time_steps, 1)x = torch.tensor(data[:-1]).float().view(1, num_time_steps - 1, 1)y = torch.tensor(data[1:]).float().view(1, num_time_steps - 1, 1)output, hidden_prev = model(x, hidden_prev)hidden_prev = hidden_prev.detach()loss = criterion(output, y)optimizer.zero_grad()loss.backward()optimizer.step()if iter % 100 == 0:print("Iteration: {} loss {}".format(iter, loss.item()))start = np.random.randint(3, size=1)[0]
time_steps = np.linspace(start, start + 10, num_time_steps)
data = np.sin(time_steps)
data = data.reshape(num_time_steps, 1)
x = torch.tensor(data[:-1]).float().view(1, num_time_steps - 1, 1)
y = torch.tensor(data[1:]).float().view(1, num_time_steps - 1, 1)predictions = []
input = x[:, 0, :]
for _ in range(x.shape[1]):input = input.view(1, 1, 1)(pred, hidden_prev) = model(input, hidden_prev)input = predpredictions.append(pred.detach().numpy().ravel()[0])x = x.data.numpy().ravel()
y = y.data.numpy()
plt.scatter(time_steps[:-1], x.ravel(), s=90)
plt.plot(time_steps[:-1], x.ravel())plt.scatter(time_steps[1:], predictions)
plt.show()

在这里插入图片描述

这篇关于RNN层及时间序列预测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/822142

相关文章

如何利用Java获取当天的开始和结束时间

《如何利用Java获取当天的开始和结束时间》:本文主要介绍如何使用Java8的LocalDate和LocalDateTime类获取指定日期的开始和结束时间,展示了如何通过这些类进行日期和时间的处... 目录前言1. Java日期时间API概述2. 获取当天的开始和结束时间代码解析运行结果3. 总结前言在J

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依

Go Mongox轻松实现MongoDB的时间字段自动填充

《GoMongox轻松实现MongoDB的时间字段自动填充》这篇文章主要为大家详细介绍了Go语言如何使用mongox库,在插入和更新数据时自动填充时间字段,从而提升开发效率并减少重复代码,需要的可以... 目录前言时间字段填充规则Mongox 的安装使用 Mongox 进行插入操作使用 Mongox 进行更

对postgresql日期和时间的比较

《对postgresql日期和时间的比较》文章介绍了在数据库中处理日期和时间类型时的一些注意事项,包括如何将字符串转换为日期或时间类型,以及在比较时自动转换的情况,作者建议在使用数据库时,根据具体情况... 目录PostgreSQL日期和时间比较DB里保存到时分秒,需要和年月日比较db里存储date或者ti

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit