序列模型
输入或者输出中包含有序数据的模型,突出数据的前后序列关系
- 两大特点
- 输入(输出)元素之间是具有顺序关系。不同的顺序,得到的结果应该是不同的,比如‘不吃饭’和‘吃饭不’这两个短语的意思是不同的
- 输入输出不定长。比如文章生成、聊天机器人
- 序列模型的应用:语音识别;语音翻译;股价预测;行为预测。
循环神经网络(RNN)
在循环神经网络中,前部序列的信息经处理后,作为输入信息传递到后部序列
- mlp模型与RNN的对比:
RNN中从输入信息到输出信息的权重计算:
其中:作为输入信息;
表示权重;
表示前部序列的信息
- 词汇数值化:建立一个词汇-数值一 一对应的字典,然后把输入词汇转换为数值矩阵
数值矩阵是一个n行1列的矩阵:如 a 的对应值是1,则a的数值矩阵为
- 字典生成的另外一种方式:划分具体的字母跟数字为对应的值,如:
(但字典更小,但对模型要求更高)
- 针对RNN模型使用损失函数来求解:
- RNN常见结构:1.多输入单输出;2.单输入多输出
普通RNN结构缺陷:前部序列信息在传递到后部的同时,信息权重下降,导致重要信息丢失;在求解的过程中梯度消失。
因此需要提高前部特定信息的决策权重
- 长短期记忆网络(LSTM)(通俗理解LSTM)
增加记忆细胞:相比
,记忆细胞
重点记录前部序列重要信息,且在传递过程中信息丢失少
两者的比较:
LSTM展开图:
忘记门:选择性丢弃
与
不重要的信息
更新门:确定给记忆细胞添加那些信息
输出门:筛选需要输出的信息
循环神经网络的拓展:
- 双向循环神经网络(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:转化为字符对应数值的列表