深度学习实战02:RNN

参考资料:
SimpleRNN Model

遇到时序类数据时可以考虑运用RNN以及其改进模型

1 RNN

1.1 循环核

  每个循环核里有多个记忆体,对应图中的多个小圆柱。
   h t = t a n h ( x t W x h + h t − 1 W h h + b h ) h_{t}=tanh(x_{t}W_{xh}+h_{t-1}W_{hh}+bh) ht=tanh(xtWxh+ht1Whh+bh) W x h 、 W h h W_{xh}、W_{hh} WxhWhh为权重矩阵, b h bh bh为偏置, ( x t (x_{t} (xt为当前时刻的输入特征, h t − 1 h_{t-1} ht1记忆体上个时刻存储的状态信息,tanh为激活函数。
   y t = s o f t m a x ( h t W h y + b y ) y_{t}=softmax(h_{t}W_{hy}+by) yt=softmax(htWhy+by) W h y W_{hy} Why为权重矩阵, b y by by为偏置,softmax为激活函数。我们可以设定记忆体的个数从而改变记忆容量,当记忆体个数被指定 x t 、 y t x_{t}、y_{t} xtyt的维度也被指定了。在前向传播时,记忆体内存储的状态信息 h 𝑡 h_{𝑡} ht在每个时刻都被刷新,而三个参数矩阵 W x h 、 W h h 、 W h y W_{xh}、W_{hh}、W_{hy} WxhWhhWhy和两个偏置项𝑏ℎ、 𝑏𝑏自始至终都是固定不变的。在反向传播时,三个参数矩阵和两个偏置项由梯度下降法更新。
在这里插入图片描述

1.2 循环核按时间步展开

  每个时刻记忆体状态信息h𝑡被刷新,记忆体周围的参数矩阵和两个偏置项是固定不变的,我们训练优化的就是这些参数矩阵。训练完成后,使用效果最好的参数矩阵执行前向传播,然后输出预测结果。

在这里插入图片描述

1.3 循环计算层:向输出方向生长

  每个循环核构成一层循环计算层,循环计算层的层数是向输出方向增长的,左图的网络有一个循环核,构成了一层循环计算层;中图的网络有两个循环核,构成了两层循环计算层;右图的网络有三个循环核,构成了三层循环计算层。其中,三个网络中每个循环核中记忆体的个数可以根据我们的需求任意指定。
在这里插入图片描述

1.4 RNN in Tensorflow2.0

tf.keras.layers.SimpleRNN(神经元个数
						,activation=‘激活函数’
						,return_sequences=是否每个时刻输出ℎ𝑡到下一层
						  False 返回最后时刻,True 返回全部时刻,当下一层依然是RNN 层,通常为 True,如果后面是 Dense 层,为False)

输入维度: 三维张量(输入样本数, 循环核时间展开步数, 每个时间步输入特征个数)
在这里插入图片描述
  左图一共要送入 RNN 层两组数据,每组数据经过一个时间步就会得到输出结果,每个时间步送入三个数值,则输入循环层的数据维度就是[2, 1, 3];右图输入只有一组数据,分四个时间步送入循环层,每个时间步送入两个数值 ,则输入循环层的数据维度就是 [1,4, 2]。

输出维度: 当 return_sequence=True,三维张量(输入样本数, 循环核时间展开步数,本层的神经元个数);当 return_sequenc=False,二维张量(输入样本数,本层的神经元个数)

1.5 RNN的计算过程

1.5.1 单步长

在这里插入图片描述

1.5.2 多步长

在这里插入图片描述

1.6 实践:RNN预测股票

import tushare as ts
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import Dropout, Dense, SimpleRNN
import matplotlib.pyplot as plt
import os
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error, mean_absolute_error
import math
df1 = ts.get_k_data('600519', ktype='D', start='2010-04-26', end='2021-06-26')
datapath1 = "./SH600519.csv"
df1.to_csv(datapath1)
data = pd.read_csv('SH600519.csv')
training_set = data.iloc[0:2426 - 300, 2:3].values 

test_set = data.iloc[2426 - 300:, 2:3].values  # 后300天的开盘价作为测试集

#归一化
sc = MinMaxScaler(feature_range=(0, 1))
train = sc.fit_transform(training_set)
test = sc.transform(test_set)
x_train = []
y_train = []
for i in range(60,len(train)):
    x_train.append(train[i-60:i,0]) #选前60天作为特征
    y_train.append(train[i,0]) #第61天作为标签

#打乱训练集
np.random.seed(60)
np.random.shuffle(x_train)
np.random.seed(60)
np.random.shuffle(y_train)

# 将训练集由list格式变为array格式
x_train, y_train = np.array(x_train), np.array(y_train)

# 使x_train符合RNN输入要求:[送入样本数, 循环核时间展开步数, 每个时间步输入特征个数]
x_train = x_train.reshape((x_train.shape[0],60,1))

#对测试集进行同样的处理
x_test = []
y_test = []
for i in range(60,len(test)):
    x_test.append(test[i-60:i,0]) #选前60天作为特征
    y_test.append(test[i,0]) #第61天作为标签
x_test,y_test =np.array(x_test),np.array(y_test)
x_test = x_test.reshape((x_test.shape[0],60,1))
model= tf.keras.Sequential([
    SimpleRNN(80,return_sequences=True),
    Dropout(0.2),
    SimpleRNN(100),
    Dropout(0.2),
    Dense(1)
])

model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
             loss = 'mean_squared_error')

model.fit(x_train,y_train
         ,batch_size=64
         ,epochs=50
         ,validation_data=(x_test,y_test)
         ,validation_freq=1)
#预测
pre = model.predict(x_test)
#对预测数据进行还原
pre_true = sc.inverse_transform(pre)

#对真实值进行还原
true = sc.inverse_transform(test[60:])
# 画出真实数据和预测数据的对比曲线
plt.plot(true, color='red', label='MaoTai Stock Price')
plt.plot(pre_true, color='blue', label='Predicted MaoTai Stock Price')
plt.title('MaoTai Stock Price Prediction')
plt.xlabel('Time')
plt.ylabel('MaoTai Stock Price')
plt.legend()
plt.show()

2 LSTM

  RNN存在的一个问题是如果时间步长太长,会存在梯度消失和梯度爆炸,LSTM和GRU可以解决RNN梯度消失的问题

2.1 公式解读

  以看书为例,假如我们现在看到了45页,我们记住的内容是1页到45页的长期记忆Ct。这个Ct两部分构成,一个是1到44页的长期记忆Ct-1,但是我们不能全部记住,所以会乘上遗忘门,这个乘积项就表示留存在我们脑中的对过去的记忆,另一部分是我们归纳出的新知识C~,它由我们现在正在看的第45页内容xt和第44页的短期记忆ht-1构成。
  接下来,如果我们想把我们学到的知识(当前的长期记忆𝐶𝑡)复述给朋友,我们不可能一字不落的讲出来,所以𝐶𝑡需要经过输出门筛选后才成为了输出ℎ𝑡。

2.2 LSTM in Tensorflow2.0

tf.keras.layers.LSTM(神经元个数,return_sequences=是否返回输出)

3 GRU

LSTM的简化版,将遗忘门和输入门合二为一为更新门

3.1 公式

3.2 GRU in Tensorflow2.0

tf.keras.layers.GRU(神经元个数,return_sequences=是否返回输出)

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值