Python----循环神经网络(BiLSTM:双向长短时记忆网络)

article/2025/6/7 14:50:38

一、LSTM 与 BiLSTM对比

1.1、LSTM

        LSTM(长短期记忆网络) 是一种改进的循环神经网络(RNN),专门解决传统RNN难以学习长期依赖的问题。它通过遗忘门、输入门和输出门来控制信息的流动,保留重要信息并丢弃无关内容,从而有效处理长序列数据。LSTM的核心是细胞状态,它像一条传送带,允许信息在不同时间步之间稳定传递,避免梯度消失或爆炸,适用于时间序列预测、语音识别等任务。

1.2、BiLSTM 

        BiLSTM(双向长短期记忆网络) 在LSTM的基础上增加反向处理层,同时捕捉过去和未来的上下文信息。前向LSTM按时间顺序处理序列,后向LSTM逆序处理,最终结合两个方向的输出,增强模型对全局上下文的理解。BiLSTM在自然语言处理任务(如机器翻译、命名实体识别)中表现优异,但计算成本更高。它特别适合需要双向信息交互的场景,如语义理解、情感分析等。 

        BiLSTM结构包含两个方向的LSTM网络:一个正向(forward)LSTM和一 个反向(backward)LSTM。

        这两个方向的LSTM在模型训练过程中分别处理输入序列,最后的隐藏状态 由这两个方向的LSTM拼接而成。这样的结构使得模型能够同时考虑到输入 序列中每个位置的过去和未来信息,更全面地捕捉序列中的上下文信息。

        如下面这个情感分类的例子,正向的LSTM按照从左到右的顺序处理“我”、 “爱”、“你”,反向的LSTM按照从右到左的顺序处理“你”、“爱”、“我”,然后 将两个LSTM的最后一个隐藏层拼接起来再经过softmax等处理得到分类结果。

        举一个例子,如一句话“我今天很开心,因为我考试考了 100 分”要做情感 分类,LSTM只能从左到右的看,因此在看到“很开心”这个关键词时它获得 的只有上文的信息,而BiLSTM是双向的因此也能看到“因为我考试考了 100 分”这一部分,而这一部分对应最终结果是否准确有很大的帮助。 

特征LSTMBiLSTM
方向性单向(仅过去信息)双向(过去和未来信息)
计算复杂度较低较高(约2倍)
典型应用时间序列预测、语言模型文本分类、序列标注、机器翻译
内存需求较少较多

13、优势 

BiLSTM相对于单向LSTM具有以下优势:

        能够捕捉到输入序列中每个位置的过去和未来信息,更全面地捕捉序列 中的上下文信息。

        可以更好地处理长距离的依赖关系。

        在许多自然语言处理任务中都取得了良好的效果。

二、库函数-LSTM

torch.nn.LSTM(input_size, hidden_size, num_layers=1, bias=True, batch_first=False, dropout=0.0, bidirectional=False, proj_size=0, device=None, dtype=None)

LSTM — PyTorch 2.7 documentation

参数描述
input_size输入 x 中预期特征的数量
hidden_size处于隐藏状态 h 的特征数量
num_layers循环层数。例如,设置意味着将两个 LSTM 堆叠在一起以形成一个堆叠的 LSTM。 第二个 LSTM 接收第一个 LSTM 的输出,并且 计算最终结果。默认值:1num_layers=2
bias偏置如果 ,则层不使用 b_ih 和 b_hh 的偏差权重。 违约:FalseTrue
batch_first 如果 ,则提供输入和输出张量 作为 (batch, seq, feature) 而不是 (seq, batch, feature)。 请注意,这不适用于隐藏状态或单元格状态。请参阅 Inputs/Outputs 部分了解详细信息。违约:TrueFalse
dropout 如果为非零,则在每个 除最后一层外的 LSTM 层,其 dropout 概率等于 。默认值:0dropout
bidirectional

如果 ,则变为双向 LSTM。违约:TrueFalse

 

  • weight_ih_l[k]_reverse – 类似于 weight_ih_l[k] 的相反方向。 仅当 时存在。bidirectional=True

  • weight_hh_l[k]_reverse – 类似于 weight_hh_l[k] 的相反方向。 仅当 时存在。bidirectional=True

  • bias_ih_l[k]_reverse – 类似于 bias_ih_l[k] 的相反方向。 仅当 时存在。bidirectional=True

  • bias_hh_l[k]_reverse – 类似于 bias_hh_l[k] 的相反方向。 仅当 时存在。bidirectional=True

proj_size

如果 ,将使用 LSTM 和相应大小的投影。默认值:0> 0

import torch
import numpy as np
from torch import nn# 1.字符输入
text = "In Beijing Sarah bought a basket of apples In Guangzhou Sarah bought a basket of bananas"torch.manual_seed(1)# 3.数据集划分
input_seq = [text[:-1]]
output_seq = [text[1:]]
print("input_seq:", input_seq)
# print("output_seq:", output_seq)# 4.数据编码:one-hot
chars = set(text)
chars = sorted(chars)
# print("chars:", chars)
# {" ":0, "a":1 }
char2int = {char: ind for ind, char in enumerate(chars)}
# print("char2int:", char2int)
# {0:" ", 1: "a"}
int2char = dict(enumerate(chars))# 将字符转成数字编码
input_seq = [[char2int[char] for char in seq] for seq in input_seq]
# print("input_seq:", input_seq)
output_seq = [[char2int[char] for char in seq] for seq in output_seq]# one-hot 编码,pytorch的RNN的输入张量的填充
def one_hot_encode(seq, bs, seq_len, size):features = np.zeros((bs, seq_len, size), dtype=np.float32)for i in range(bs):for u in range(seq_len):features[i, u, seq[i][u]] = 1.0return torch.tensor(features, dtype=torch.float32)input_seq = one_hot_encode(input_seq, 1, len(text)-1, len(chars))
output_seq = torch.tensor(output_seq, dtype=torch.long).view(-1)
print("output_seq:", output_seq)# 5.定义前向模型
class Model(nn.Module):def __init__(self, input_size, hidden_size, out_size):super(Model, self).__init__()self.hidden_size = hidden_sizeself.bilstm1 = nn.LSTM(input_size, hidden_size, num_layers=1, batch_first=True, bidirectional=True)self.fc1 = nn.Linear(hidden_size * 2, out_size)def forward(self, x):out, hidden = self.bilstm1(x)x = out.contiguous().view(-1, self.hidden_size * 2)x = self.fc1(x)return x, hiddenmodel = Model(len(chars), 32, len(chars))# 6.定义损失函数和优化器
cri = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)# 7.开始迭代
epochs = 1000
for epoch in range(1, epochs+1):output, hidden = model(input_seq)loss = cri(output, output_seq)optimizer.zero_grad()loss.backward()optimizer.step()# 8.显示频率设置if epoch == 0 or epoch % 50 == 0:print(f"Epoch [{epoch}/{epochs}], Loss {loss:.4f}")# print("input_seq.shape:", input_seq.shape)
# print("hidden.shape:", hidden.shape)
# print("output.shape:", output.shape)
# print("input_w:", model.rnn1.weight_ih_l0.shape)# 预测下面几个字符
input_text = "In Beijing Sarah bought a basket of"  # re
to_be_pre_len = 20for i in range(to_be_pre_len):chars = [char for char in input_text]# print(chars)character = np.array([[char2int[c] for c in chars]])character = one_hot_encode(character, 1, character.shape[1], 23)character = torch.tensor(character, dtype=torch.float32)out, hidden = model(character)char_index = torch.argmax(out[-1]).item()input_text += int2char[char_index]
print("预测到的:", input_text)

 


http://www.hkcw.cn/article/qNtQkQmTio.shtml

相关文章

工作自动化——工作自动提炼--智能编程——仙盟创梦IDE

工作自动化中的自动提炼、自动比对代码生成日志,为软件开发与项目管理带来诸多好处。 自动提炼能从复杂代码中精准提取关键信息,节省人工梳理时间,开发人员可快速把握核心逻辑,加速项目熟悉进程。自动比对代码则及时发现版本间差异…

运行shell脚本时报错/bin/bash^M: 解释器错误: 没有那个文件或目录

Windows的换行符为\r\n,而linux换行符为\n。先查看一下文件是什么格式的 :set ff --查询一下格式是什么 由于使用nodepad新建的脚本,首选项中格式设置成了windows,上传到linux中报错。 解决方法 1、nodepad中【设置》首选项】修改为unix&am…

6. 基础IO

0.背景 a.访问一个文件,都必须先把对应的文件打开(打开文件就是把它从磁盘加载到内存中) b.如果一个文件,压根就没有被打开,那么它就在磁盘上 c.谁来打开??用户通过bash,启动进程…

碰一碰发视频-源码系统开发技术分享

#碰一碰营销系统# #碰一碰系统# #碰一碰发视频# 架构设计哲学&#xff1a;近场通信的优雅平衡 一、核心通信技术选型 1. 双模协同传输引擎 技术协议栈延迟控制适用场景NFCISO 14443-A<100ms精准触发场景BLE 5.0GATT Profile300-500ms中距传输场景 工程决策依据&…

动态规划之网格图模型(二)

文章目录 动态规划之网格图模型&#xff08;二&#xff09;LeetCode 931. 下降路径最小和思路Golang 代码 LeetCode 2684. 矩阵中移动的最大次数思路Golang 代码 LeetCode 2304. 网格中的最小路径代价思路Golang 代码 LeetCode 1289. 下降路径最小和 II思路Golang 代码 LeetCod…

QUIC——UDP实现可靠性传输

首先我们要知道TCP存在什么样的痛点问题 TCP的升级很困难TCP建立连接的延迟网络迁移需要重新建立连接TCP存在队头阻塞问题 QUIC就是为了解决以上的问题而诞生了, 下面我会介绍QUIC的一些特性和原理 QUIC对比TCP优势: 握手建连更快 QUIC内部包含了TLS, 它在自己的帧会携带TL…

PyTorch——线性层及其他层介绍(6)

线性层 前面1,1,1是你想要的&#xff0c;后面我们不知道这个值是多少&#xff0c;取-1让Python自己计算 import torch import torchvision from torch import nn from torch.nn import Linear from torch.utils.data import DataLoader# 加载CIFAR-10测试数据集并转换为Tensor格…

bilibili批量取消关注

目录 如何使用 ​编辑 代码 如何使用 使用谷歌浏览器&#xff0c;通过F12打开调式面板&#xff0c;找到下面的位置&#xff1a; 代码 /*** 批量取消关注脚本* 自动遍历多页内容并取消所有关注*/// 配置常量 const CONFIG {CLICK_DELAY: 250, // 点击间隔时间&#…

7.RV1126-OPENCV cvtColor 和 putText

一.cvtColor 1.作用 cvtColor 是 OPENCV 里面颜色转换的转换函数。能够实现 RGB 图像转换成灰度图、灰度图转换成 RGB 图像、RGB 转换成 HSV 等等 2.API CV_EXPORTS_W void cvtColor( InputArray src, OutputArray dst, int code, int dstCn 0 ); 第一个参数&#xff1a;…

研发型企业如何面对源代码保密问题

在当今数字化时代&#xff0c;研发团队面临着数据安全和工作效率的双重挑战。技术成果和源代码不仅是企业的核心资产&#xff0c;更是企业竞争力的基石。然而&#xff0c;数据泄露的风险无处不在&#xff0c;从内部员工的无意失误到外部攻击者的恶意窃取&#xff0c;都可能给企…

BeeWorks:私有化即时通讯,筑牢企业信息安全防线

在数字化时代&#xff0c;即时通讯已成为企业日常运营中不可或缺的工具。然而&#xff0c;数据安全问题一直是企业使用即时通讯服务时的重要考量因素。BeeWorks即时通讯系统以其私有化部署模式&#xff0c;为企业提供了一个安全、可靠、自主可控的沟通平台。 私有化部署&#…

akka实践之应用的扩展性问题和actor模型

如何解决应用的扩展性问题 当一个应用需要处理海量并发请求时&#xff0c;传统的开发模式往往显得力不从心&#xff0c;为什么应用需要扩展性&#xff1f; 需求增长: 用户量激增&#xff0c;数据量爆炸式增长。资源限制: 服务器、带宽、存储等资源有限。复杂性增加: 代码逻辑…

Starrocks Full GC日志分析

GC日志样例&#xff1a; [2025-06-03T07:36:06.1770800] GC(227) Pause Full (G1 Evacuation Pause) [2025-06-03T07:36:06.1960800] GC(227) Phase 1: Mark live objects [2025-06-03T07:36:06.9480800] GC(227) Cleaned string and symbol table, strings: 47009 processed,…

mapbox高阶,生成并加载等时图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️Fill面图层样式1.4 ☘️symbol符号图层…

防火墙在OSI模型中的层级工作(2025)

1. 物理层&#xff08;L1&#xff09;& 数据链路层&#xff08;L2&#xff09; 传统防火墙&#xff1a;通常不处理L1/L2&#xff08;由交换机/网卡负责&#xff09;。 现代演进&#xff1a; MAC地址过滤&#xff1a;部分防火墙支持基于MAC地址的粗粒度策略&#xff08;如禁…

帝可得 - 运营管理APP

Android模拟器 本项目的App客户端部分已经由前端团队进行开发完成&#xff0c;并且以apk的方式提供出来&#xff0c;供我们测试使用&#xff0c;如果要运行apk&#xff0c;需要先安装安卓的模拟器。 可以选择国内的安卓模拟器产品&#xff0c;比如&#xff1a;网易mumu、雷电…

关于list集合排序的常见方法

目录 1、list.sort() 2、Collections.sort() 3、Stream.sorted() 4、进阶排序技巧 4.1 空值安全处理 4.2 多字段组合排序 4.3. 逆序 5、性能优化建议 5.1 并行流加速 5.2 原地排序 6、最佳实践 7、注意事项 前言 Java中对于集合的排序操作&#xff0c;分别为list.s…

自然语言处理(NLP)的系统学习路径规划

文章目录 一、基础准备阶段&#xff08;1-2个月&#xff09;1. 数学基础2. 编程基础3. 语言学基础 二、核心技术阶段&#xff08;3-4个月&#xff09;1. 经典NLP技术2. 深度学习模型3. 预训练模型入门 三、进阶实战阶段&#xff08;2-3个月&#xff09;1. 热门任务实战2. 大模型…

CSS3美化页面元素

1. 字体 <span>标签 字体样式⭐ 字体类型&#xff08;font-family&#xff09; 字体大小&#xff08;font-size&#xff09; 字体风格&#xff08;font-style&#xff09; 字体粗细&#xff08;font-weight&#xff09; 字体属性&#xff08;font&#xff09; 2. 文本 文…

便签软件哪个好用,最好用的免费便签软件介绍

在快节奏的工作和生活中&#xff0c;一款好用的便签软件能帮助我们高效记录灵感、管理待办事项&#xff0c;甚至成为个人生产力系统的核心工具。2025年&#xff0c;市面上涌现了许多优秀的免费便签软件&#xff0c;它们各具特色&#xff0c;能满足不同用户的需求。便签软件哪个…