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

一、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.pswp.cn/news/908092.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

U盘挂载Linux

在 只能使用 Telnet 的情况下,如果希望通过 U盘 传输文件到 Linux 系统,可以按照以下步骤操作: 📌 前提条件 U盘已插入 Linux 主机的 USB 接口。Linux 主机支持自动挂载 U盘(大多数现代发行版默认支持)。T…

QuickBASIC QB64 支持 64 位系统和跨平台Linux/MAC OS

QuickBASIC 的现代继任者 QB64 已发展成为一个功能强大的开源项目,支持 64 位系统和跨平台开发。以下是详细介绍: 项目首页 - QB64pe:The QB64 Phoenix Edition Repository - GitCode https://gitcode.com/gh_mirrors/qb/QB64pe 1. QB64 概述 官网&am…

【C++高级主题】命令空间(五):类、命名空间和作用域

目录 一、实参相关的查找(ADL):函数调用的 “智能搜索” 1.1 ADL 的核心规则 1.2 ADL 的触发条件 1.3 ADL 的典型应用场景 1.4 ADL 的潜在风险与规避 二、隐式友元声明:类与命名空间的 “私密通道” 2.1 友元声明的基本规则…

免费开源Umi-OCR,离线使用,批量精准!

Umi-OCR(Windows端) Umi-OCR 是一款在 GitHub 上开源的免费 OCR 识别软件,它最大的亮点就是免费、开源、支持批量处理,而且识别准确度很高。这款软件不需要联网就能用,非常值得推荐! 在 OCR 识别功能方面&…

深入剖析 Docker 容器化原理与实战应用,开启技术新征程!

文章目录 前言一、为什么 是Docker ?二、Docker 容器化原理分析2.1 镜像(Image)2.2 容器(Container)2.3 仓库(Registry) 三、Docker 容器化实践3.1 Docker安装3.2 创建一个 Docker 镜像3.3 运行…

黑马程序员TypeScript课程笔记—class篇

class的基本使用 class的构造函数(实现实例属性的初始化) 在使用构造函数的时候,小括号的后面不要指定类型,否则就会报错,因为构造函数没有返回值 class实例方法 class继承(extends) class继承…

PDF.js无法显示数字签名

问题 pdfjs加载pdf文件时无法显示数字签名 PDF.js 从 v2.9.359 版本开始正式支持数字签名的渲染与显示,此前版本需通过修改源代码实现基础兼容。 建议升级pdfjs组件大于等于v2.9.359 pdfjs历史版本:https://github.com/mozilla/pdf.js/releases pdfjs…

解决VS Code误报Java问题的终极方法

使用vscode写java,发现很多Problems,如下图,实际上并没有问题,是误报,怎么解决? 解决方案:disable下面这个插件,它和vscode-java插件冲突了导致。

【WPF】从普通 ItemsControl 到支持筛选的 ItemsControl:深入掌握 CollectionViewSource 用法

✨ 从普通 ItemsControl 到支持筛选的 ItemsControl:深入掌握 CollectionViewSource 用法 在日常 WPF 开发中,我们经常需要对数据进行筛选、排序、分组等操作,而原生的 ItemsControl 并不直接支持这些功能。本文将介绍如何通过 CollectionVi…

Mybatis Plus JSqlParser解析sql语句及JSqlParser安装步骤

MyBatis Plus与JSqlParser:SQL语句解析与实战指南 在现代Java开发中,SQL解析和动态SQL生成是数据库操作中不可或缺的一部分。MyBatis Plus作为MyBatis的增强工具,通过JSqlParser库实现了对SQL语句的深度解析和修改能力。本文将详细介绍如何在…

学习路之PHP--easyswoole使用视图和模板

学习路之PHP--easyswoole使用视图和模板 一、安装依赖插件二、 实现渲染引擎三、注册渲染引擎四、测试调用写的模板五、优化六、最后补充 一、安装依赖插件 composer require easyswoole/template:1.1.* composer require topthink/think-template相关版本: "…

设计模式——享元设计模式(结构型)

摘要 享元设计模式是一种结构型设计模式,旨在通过共享对象减少内存占用和提升性能。其核心思想是将对象状态分为内部状态(可共享)和外部状态(不可共享),并通过享元工厂管理共享对象池。享元模式包含抽象享…

互联网大厂Java求职面试:云原生微服务架构设计与AI大模型集成实战

互联网大厂Java求职面试:云原生微服务架构设计与AI大模型集成实战 面试场景设定 人物设定: 李明(技术总监):拥有15年分布式系统架构经验,主导过多个亿级用户系统的重构,对云原生和AI融合有深…

nginx+tomcat动静分离、负载均衡

一、理论 nginx用于处理静态页面以及做调度器,tomcat用于处理动态页面 lvs(四层) 轮询(rr) 加权轮询(wrr) 最小连接(lc) 加权最小连接(wlc) ngi…

什么是AI芯片?

首先,我们要了解一下:什么是芯片?芯片的本质就是在半导体衬底上制作能实现一系列特定功能的集成电路。 其次,来看一下AI的概念。AI是研究如何使计算机能够模拟和执行人类智能任务的科学和技术领域,致力于开发能够感知…

PostgreSQL数据库配置SSL操作说明书

背景: 因为postgresql或者mysql目前通过docker安装,只需要输入主机IP、用户名、密码即可访问成功,这样其实是不安全的,可能会通过一些手段获取到用户名密码导致数据被窃取。而ES、kafka等也是通过用户名/密码方式连接,…

k8s更新证书

[rootk8s-master01 ~]# sudo kubeadm certs renew all [renew] Reading configuration from the cluster… [renew] FYI: You can look at this config file with ‘kubectl -n kube-system get cm kubeadm-config -o yaml’ certificate embedded in the kubeconfig file for…

正点原子lwIP协议的学习笔记

正点原子lwIP协议的学习笔记 正点原子lwIP学习笔记——lwIP入门 正点原子lwIP学习笔记——MAC简介 正点原子lwIP学习笔记——PHY芯片简介 正点原子lwIP学习笔记——以太网DMA描述符 正点原子lwIP学习笔记——裸机移植lwIP 正点原子lwIP学习笔记——裸机lwIP启动流程 正点…

MongoTemplate常用api学习

本文只介绍常用的api,尽量以最简单的形式学会mongoTemplate基础api的使用 一、新增 主要包含三个api:insert(一个或遍历插多个)、insertAll(批量多个)、save(插入或更新) //这里简…

006网上订餐系统技术解析:打造高效便捷的餐饮服务平台

网上订餐系统技术解析:打造高效便捷的餐饮服务平台 在数字化生活方式普及的当下,网上订餐系统成为连接餐饮商家与消费者的重要桥梁。该系统以菜品分类、订单管理等模块为核心,通过前台展示与后台录入的分工协作,为管理员和会员提…