深度学习之循环神经网络

序列模型

输入或者输出中包含有序数据的模型,突出数据的前后序列关系

  • 两大特点
    • 输入(输出)元素之间是具有顺序关系。不同的顺序,得到的结果应该是不同的,比如‘不吃饭’和‘吃饭不’这两个短语的意思是不同的
    • 输入输出不定长。比如文章生成、聊天机器人
  • 序列模型的应用:语音识别;语音翻译;股价预测;行为预测。

循环神经网络(RNN)

在循环神经网络中,前部序列的信息经处理后,作为输入信息传递到后部序列

  • mlp模型与RNN的对比:


RNN中从输入信息到输出信息的权重计算:

其中:x^{1} ....x^{i}作为输入信息;w_{ij}^{} 表示权重;a^{0}....a^{i}表示前部序列的信息

  • 词汇数值化:建立一个词汇-数值一 一对应的字典,然后把输入词汇转换为数值矩阵

数值矩阵是一个n行1列的矩阵:如 a 的对应值是1,则a的数值矩阵为\begin{pmatrix} 1\\ 0\\ 0\\ 0\\ \end{pmatrix}

  • 字典生成的另外一种方式:划分具体的字母跟数字为对应的值,如:\begin{pmatrix} a & : & 1\\ b& : & 2\\ c &: &3 \\ ... & : & ...\\ z& : & 26\\ A& : & 27\\ ... & : &... \\ & & \end{pmatrix}(但字典更小,但对模型要求更高)               
  • 针对RNN模型使用损失函数来求解:

  • RNN常见结构:1.多输入单输出;2.单输入多输出

普通RNN结构缺陷:前部序列信息在传递到后部的同时,信息权重下降,导致重要信息丢失;在求解的过程中梯度消失。

因此需要提高前部特定信息的决策权重

增加记忆细胞C^{i}:相比a^{i},记忆细胞C^{i}重点记录前部序列重要信息,且在传递过程中信息丢失少

两者的比较:


LSTM展开图:

 

忘记门:选择性丢弃a^{i-1}x^{i}不重要的信息

更新门:确定给记忆细胞添加那些信息

输出门:筛选需要输出的信息

循环神经网络的拓展:

  • 双向循环神经网络(BRNN):做判断时,把后部序列信息也考虑

上图的两个红色框为后部序列的信息

  • 深层循环神经网络(DRNN):解决更复杂的序列任务,可以把单层RNN叠起来或者在输出前和普通mlp结构结合使用

实战(一):RNN实现股价预测

任务:基于XX数据,建立RNN模型,预测股价:

1.完成数据预处理,将序列数据转化为可用于RNN输入的数据

2.对新数据yy进行预测,可视化结果

3.存储预测结果,并观察局部预测结果

·模型结构:单层RNN,输出有5个神经元

·每次使用前8个数据预测第9个数据

#提取序列数据
def extract_data(data,slide):
    x = []
    y = []
    for i in range(len(data) - slide):
          x.append([a for a in data[i:i+slide]])
          y.append(data[i+slide])
    x = np.array(x)
    x = x.reshape(x.shape[0],x.shape[1],1)
    return x,y

#建立普通RNN模型:
from keras.models import Sequential
from keras.layers import Dense,SimpleRNN
model = Sequential()
#增加一个RNN层
model.add(SimpleRNN(units=5,input_shape = (X.shape[1],X.shape[2]),acitvation='relu'))
#增加输出层
model.add(Dense(units=1,activation='linear'))
model.compile(optimizer = 'adam',loss='mean_squared_error')

RNN模型的输入数据格式:

input_shape = (samples,time_steps,features)

samples:样本数量(模型根据输入数据自动计算)

time_steps:序列的长度,即用多少个连续样本预测一个输出

features:样本的特征维数([0,0,1]对应为3)


实战(二):LSTM自动生成文本

任务:基于文本数据,建立LSTM模型,预测序列文字:

1.完成数据预处理,将文字序列数据转化为可用于LSTM输入的数据

2.查看文字数据预处理后的数据结构,并进行数据分离操作

3.针对字符输入,预测其对应的后续字符

·模型结构:单层LSTM,输出有20个神经元

·每次使用前20个字符预测第21个字符

#文本加载:
raw_data = open('flare').read()
#移除换行字符'\n'
data = raw_data.replace('\n',' ').replace('\r','')

#字符字典建立:
letters = list(set(data))
#建立数字到字符的索引字典
int_to_char = {a:b for a,b in enumerate(letters)}
## 建立字符到数字的索引字典
char_to_int = {b:a for a,b in enumerate(letters)}

#文本数据预处理:
1.///
2.调用方法X,y = data_preprocessing(data,time_steps,features,char_to_int)
    data:待处理的字符串
    time_steps:序列的长度
    features:样本的特征维数([0,0,1]对应为3)
    char_to_int:字符转数字的字典
    X:转化为one-hot格式的数组
    y:转化为字符对应数值的列表

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰杰批

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值