LSTM和双向LSTM

LSTM和双向LSTM文章目录1.RNN2.LSTM2.1简介2.2细胞状态2.3遗忘门2.4输入门2.5输出门3.双向LSTM(Bi-directionalLSTM)4.keras实现4.1LSTM模型4.2Bi-LSTM模型4.3训练模型4.4预测参考连接:https://www.cnblogs.com/Allen-rg/p/11712703.html1.RNN循环神经网络(RecurrentNeuralNetwork,RNN)是一种处理序列数据的网络。其中xt为t时刻的输入,h

大家好,又见面了,我是你们的朋友全栈君。

参考连接: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基本结构
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]))
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149400.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • Android自动填充短信验证码[通俗易懂]

    Android自动填充短信验证码[通俗易懂]前言短信验证码获取并自动填写现在已经成为一个人性化App的标配了,这篇文章将实现一个短信验证码获取并自动填写的demo。其实就是读取指定号码的短信并提取出验证码,然后赋值给EditText显示。demo效果图:读取短信Android系统在接受到一条短信的时候会发出一条Action为android.provider.Telephony.SMS_RECEIVED的有序广播,因此我们读取短信的…

    2022年7月25日
  • 线性探测再散列

    线性探测再散列哈希表又称散列表。哈希表存储的基本思想是:以数据表中的每个记录的关键字k为自变量,通过一种函数H(k)计算出函数值。把这个值解释为一块连续存储空间(即数组空间)的单元地址(即下标),将该记录存储到这个单元中。在此称该函数H为哈函数或散列函数。按这种方法建立的表称为哈希表或散列表。处理冲突的方法:开放寻址法:Hi=(H(key)+di)MODm,i=1,2,…,k(k<=…

    2022年5月15日
  • 7、 正则化(Regularization)

    7、 正则化(Regularization)7.1过拟合的问题到现在为止,我们已经学习了几种不同的学习算法,包括线性回归和逻辑回归,它们能够有效地解决许多问题,但是当将它们应用到某些特定的机器学习应用时,会遇到过拟合(over-fittin

    2022年7月4日
  • 说一下CAS锁机制?「建议收藏」

    1.CAS(CompareandSwap比较并交换),是一种无锁算法,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其他线程都失败,失败的线程并不会挂起,而是被告知这次竞争中失败,并可以再次尝试。2.CAS算法涉及到三个操作数a.需要读写的内存位置(V)b.进行比较的预期原值(A)c.拟写入的新值(B)3.如果内存位置V的值与预期原值A相匹配,那么处理器会自动将该位置值更新为新值B,否则处理器不做任何操作。java多线程总结篇4——锁机制…

    2022年4月17日
  • 求中位数Python_统计学中位数众数例题

    求中位数Python_统计学中位数众数例题首先需要数据源,这里随便写了一个:nums=[1,2,3,4]求均值和中位数均可以使用numpy库的方法:#均值np.mean(nums)#中位数np.median(nums)求众数方法一:在numpy中没有直接的方法,但是也可以这样实现:importnumpyasnpcounts=np.bincount(nums)#返回众数np.argmax(counts)  …

    2022年9月17日
  • Linux用telnet判断端口是否通

    Linux用telnet判断端口是否通通的[root@1222~]#telnet127.0.0.14531Trying127.0.0.1…Connectedto127.0.0.1.Escapecharacteris’^]’.不通[root@1222~]#telnet127.0.0.14581Trying127.0.0.1…telnet:connecttoaddress127.0.0.1:Connectionrefused退出方式1.输入Ctrl+】键,然后

    2022年10月22日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号