大家好,又见面了,我是你们的朋友全栈君。
文章目录
参考连接:https://www.cnblogs.com/Allen-rg/p/11712703.html
1. RNN
循环神经网络(Recurrent Neural Network,RNN)是一种处理序列数据的网络。
其中xt为t时刻的输入,ht为t时刻输出,ht-1是上一时刻的的输出序列。t时刻的输出ht与t-1时刻的记忆内容(输出)以及t时刻的输入xt有关。
RNN时一种具有重复结构的网络:tanh层
存在问题:RNN只具有短期的记忆能力。当传输的时间过长时,如t与0相隔很大,则会使得ht已经丧失0时刻x0的信息。主要原因是随着时间间隔的增大,R存在梯度消失使得RNN丧失向远处连接的能力。
**为什么引入LSTM?**因为RNN只具有短期记忆能力,当时间序列过长时,导致信息无法有效传播到远处。因此提出具有短期记忆和长期记忆能力的LSTM避免长期依赖的问题。
2. LSTM
长短期记忆网络(Long Short-Term Memory, LSTM)是一种具有短期和长期记忆能力的网络,用于减轻RNN因为梯度消失只有短期记忆的问题。
2.1 简介
如下图所示,为LSTM重复组件。
LSTM的组成部分包括:细胞状态、遗忘门、输入门和输出门四个部分。其中细胞状态用于保存t时刻的重要信息,三个门来控制细胞状态的存储信息。从而保证消息的有效传递。
2.2 细胞状态
用于保存每一时刻的重要信息。
如上图最上方的横线一直贯穿整个网络,产生每一时刻需要保存的重要信息。重要信息由前一时刻中有用的信息、前一时刻输出信息和当前输入的有用信息共同产生,再传递给下一个时刻,由下一时刻的遗忘门进一步选择需要的信息。
2.3 遗忘门
控制上一层细胞状态Ct-1中需要遗忘的信息。
其中 f t f_t ft是用于产生控制上一层细胞状态需要遗忘的变量,使用sigmoid激活函数使值在(0,1)之间,从而确定 C t − 1 C_{t-1} Ct−1中需要完全遗忘和记住的上一层输出和本时刻输入的内容。
2.4 输入门
处理当前序列位置的输入,确定需要更新的信息更新细胞状态。包含两个部分:一个部分使用sigmoid函数确定输入中的哪些新信息被加入细胞状态;确定了保留的输入新信息后,使用tanh产生新的候选向量,然后将需要保留的信息输入到细胞状态中。
更新细胞状态:当确定了遗忘门和输入门的输出后,便可以将 C t − 1 C_{t-1} Ct−1更新细胞状态为 C t C_t Ct。其中 f t × C t − 1 f_t\times C_{t-1} ft×Ct−1表示需要保留的信息, i t × C t i_t\times C_t it×Ct表示想要新增的信息,两者之和为本序列的细胞状态。
2.5 输出门
最终需要根据细胞状态的内容选择性输出的细胞状态的内容。首先需要使用sigmoid函数来确定哪个部分的内容需要输出,再使用tanh对细胞状态进行处理,再将两部分相乘即可得到希望输出的部分。
3. 双向LSTM(Bi-directional LSTM)
有时候希望预测的输出由前面的输入和后面的输入共同决定,从而提高准确度。Forward层和Backward层共同连接到输出层。
Forward层从1到t时刻正向计算,得到并保存每个时刻的隐藏层的输出向后传播;Backward层从t时刻向1反向传播,得到并保存每个时刻向后隐藏层的输出。最后每个时刻结合Farward和Backward层的相应输出的结果通过激活函数得到最终的结果。
4. keras 实现
4.1 LSTM模型
model = Sequential()
model.add(Embedding(3800, 32, input_length=380))
model.add(Dropout(0.2))
model.add(LSTM(32))
model.add(Dense(256, activation='relu))
model.add(Dropout(0.2))
model.add(Dense(1, activation='sigmoid))
4.2 Bi-LSTM模型
model = Sequential()
model.add(Embedding(3800, 32, input_length=3800))
model.add(Dropout(0.5))
model.add(Bidirectional(LSTM(32, return_sequences=True), merge_mode='concat'))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
4.3 训练模型
es = EarlyStopping(monitor='val_acc', patence=5)
model.compile(loss='binary_crossentropy',optimizer='adam', metrics=['accuracy'])
batchsize = 64
epoches = 20
model.fit(x_train,y_train,
validation_split=0.1,
batch_size=batch_size,
epochs=epochs,
callbacks=[es],
shuffle=True)
4.4 预测
scores = model.evaluate(x_test, y_test)
print('LSTM:test_loss:%f, accuracy:%f' %(scores[0], scores[1]))
print('Bi-LSTM:test_loss:%f, accuracy:%f' %(scores[0], scores[1]))
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/149400.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...