当前位置: 首页 > news >正文

LSTM模型变种

LSTM模型变种

一、GRU

1.什么是GRU

GRU(Gated Recurrent Unit)是一种循环神经网络(RNN)的变体,它被设计用来解决传统RNN在处理长序列时可能遇到的梯度消失或梯度爆炸问题。GRU通过引入门控机制来控制信息的流动,使得模型能够更好地捕捉长时间依赖关系。

GRU的主要特点在于它的结构比LSTM(Long Short-Term Memory)更简单,因为它只有一个隐藏状态,而没有像LSTM那样的细胞状态。尽管如此,GRU仍然能够有效地学习长期依赖,并且通常计算效率更高

2.GRU的基本结构

一个GRU单元包含两个主要的门:重置门(Reset Gate)和更新门(Update Gate)。这些门的作用是决定如何将新输入的信息与先前的记忆相结合。

  • 重置门 r t r_t rt)决定了前一时刻的状态 h t − 1 h_{t−1} ht1 有多少信息会被用于当前时刻的候选激活 $\tilde{h}_t $的计算。
  • 更新门 z t z_t zt)决定了前一时刻的状态 h t − 1 h_{t−1} ht1 和当前时刻的候选激活 h ~ t \tilde{h}_t h~t 如何结合以产生当前时刻的状态 h t h_t ht

3.模型结构

模型图:

在这里插入图片描述

内部结构:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.代码实现

原理实现

import numpy as npclass GRU:def __init__(self, input_size, hidden_size):self.input_size = input_sizeself.hidden_size = hidden_size# 初始化参数和偏置# 更新门self.W_z = np.random.randn(hidden_size, hidden_size+input_size)self.b_z = np.zeros(hidden_size)# 重置门self.W_r = np.random.randn(hidden_size, hidden_size + input_size)self.b_r = np.zeros(hidden_size)# 候选隐藏状态self.W_h = np.random.randn(hidden_size, hidden_size + input_size)self.b_h = np.zeros(hidden_size)def tanh(self, x):return np.tanh(x)def sigmoid(self, x):return 1 / (1 + np.exp(-x))def forward(self, x):# 初始化隐藏状态h_prev = np.zeros((self.hidden_size, ))concat_input = np.concatenate([x, h_prev], axis=0)z_t = self.sigmoid(np.dot(self.W_z, concat_input) + self.b_z)r_t = self.sigmoid(np.dot(self.W_r, concat_input) + self.b_r)concat_reset_input = np.concatenate([x, r_t*h_prev], axis=0)h_hat_t = self.tanh(np.dot(self.W_h, concat_reset_input) + self.b_h)h_t = (1 - z_t) * h_prev + z_t * h_hat_treturn h_t# 测试数据
input_size = 3
hidden_size = 2
seq_len = 4x = np.random.randn(seq_len, input_size)
gru = GRU(input_size, hidden_size)all_h = []
for t in range(seq_len):h_t = gru.forward(x[t, :])all_h.append(h_t)print(np.array(all_h).shape)

nn.GRUCell

import torch.nn as nn
import torchclass GRUCell(nn.Module):def __init__(self, input_size, hidden_size):super(GRUCell, self).__init__()self.input_size = input_sizeself.hidden_size = hidden_sizeself.gru_cell = nn.GRUCell(input_size, hidden_size)def forward(self, x):h_t = self.gru_cell(x)return h_t# 测试数据
input_size = 3
hidden_size = 2
seq_len = 4gru_model = GRUCell(input_size, hidden_size)x = torch.randn(seq_len, input_size)all_h = []
for t in range(seq_len):h_t = gru_model(x[t])all_h.append(h_t)print(all_h)

nn.GRU

import torch.nn as nn
import torchclass GRU(nn.Module):def __init__(self, input_size, hidden_size):super(GRU, self).__init__()self.input_size = input_sizeself.hidden_size = hidden_sizeself.gru = nn.GRU(input_size, hidden_size)def forward(self, x):out = self.gru(x)return out# 测试数据
input_size = 3
hidden_size = 2
seq_len = 4
batch_size = 5x = torch.randn(seq_len, batch_size, input_size)gru_model = GRU(input_size, hidden_size)out = gru_model(x)print(out)

二、BiLSTM

1.什么是BiLSTM

BiLSTM(Bidirectional Long Short-Term Memory)是LSTM的一种扩展,它通过同时考虑序列的前向和后向信息来增强模型对序列数据的理解。传统的LSTM只能从过去到未来单方向处理序列,而BiLSTM则能够同时捕捉到序列中每个时间点上的前后文信息,从而提高模型在许多任务中的表现。

2.BiLSTM的工作原理

在BiLSTM中,对于每个时间步t,模型包含两个独立的LSTM层:

  • 前向LSTM:按照正常的时间顺序处理输入序列,即从第一个时间步到最后一个时间步。
  • 后向LSTM:以相反的时间顺序处理输入序列,即从最后一个时间步到第一个时间步。

这两个LSTM层分别输出一个隐藏状态,然后将这两个隐藏状态拼接起来形成最终的隐藏状态。这个拼接后的隐藏状态可以用来做进一步的预测或计算。

在这里插入图片描述

优点:

  • 上下文感知:BiLSTM可以利用整个序列的信息,因此对于需要理解上下文的任务特别有效。
  • 更好的性能:由于它可以捕捉更丰富的序列信息,通常在诸如命名实体识别、情感分析等自然语言处理任务上表现出色。

3.标注集

BMES标注:汉字作为词语开始Begin,结束End,中间Middle,单字Single,这四种情况就可以囊括所有的分词情况。比如“参观了北京天安门”这句话的标注结果就是BESBEBME

词性标注

4.代码实现

原理实现

import numpy as np
import torchclass BILSTM:def __init__(self, input_size, hidden_size, output_size):# 参数:词向量大小,隐藏层大小, 输出类别self.input_size = input_sizeself.hidden_size = hidden_sizeself.output_size = output_size# 正向self.lstm_forward = LSTM(input_size, hidden_size, output_size)# 反向self.lstm_backward = LSTM(input_size, hidden_size, output_size)def forward(self, x):# 正向LSTMoutput, _, _ = self.lstm_forward.forward(x)# 反向LSTM,np.flip是将数组进行翻转output_backward, _, _ = self.lstm_backward.forward(np.flip(x))# 合并两层的隐藏状态combine_output = [np.concatenate((x, y), axis=0) for x, y in zip(output, output_backward)]return combine_outputclass LSTM:def __init__(self, input_size, hidden_size, output_size):# 参数:词向量大小,隐藏层大小, 输出类别self.input_size = input_sizeself.hidden_size = hidden_sizeself.output_size = output_size# 初始化权重,偏置,把结构的W,U拼接在一起self.W_f = np.random.rand(hidden_size, input_size+hidden_size)self.b_f = np.random.rand(hidden_size)self.W_i = np.random.rand(hidden_size, input_size + hidden_size)self.b_i = np.random.rand(hidden_size)self.W_c = np.random.rand(hidden_size, input_size + hidden_size)self.b_c = np.random.rand(hidden_size)self.W_o = np.random.rand(hidden_size, input_size + hidden_size)self.b_o = np.random.rand(hidden_size)# 输出层self.W_y = np.random.rand(output_size, hidden_size)self.b_y = np.random.rand(output_size)def tanh(self, x):return np.tanh(x)def sigmoid(self, x):return 1/(1+np.exp(-x))def forward(self, x):# 初始化隐藏状态h_t = np.zeros((self.hidden_size,))# 初始化细胞状态c_t = np.zeros((self.hidden_size,))h_states = []  # 存储每一个时间步的隐藏状态c_states = []  # 存储每一个时间步的细胞状态for t in range(x.shape[0]):x_t = x[t]  # 获取当前时间步的输入(一个词向量)# 将x_t和h_t进行垂直方向拼接x_t = np.concatenate([x_t, h_t])# 遗忘门 "dot"迷茫中,这里是点积的效果,(5,7)点积(7,)得到的是(5,)f_t = self.sigmoid(np.dot(self.W_f, x_t) + self.b_f)# 输出门i_t = self.sigmoid(np.dot(self.W_i, x_t) + self.b_i)# 候选细胞状态c_hat_t = self.tanh(np.dot(self.W_c, x_t) + self.b_c)# 更新细胞状态, "*"对应位置直接相乘c_t = f_t * c_t + i_t * c_hat_t# 输出门o_t = self.sigmoid(np.dot(self.W_o, x_t) + self.b_o)# 更新隐藏状态h_t = o_t * self.tanh(c_t)# 保存时间步的隐藏状态和细胞状态h_states.append(h_t)c_states.append(c_t)# 输出层,分类类别y_t = np.dot(self.W_y, h_t) + self.b_youtput = torch.softmax(torch.tensor(y_t), dim=0)return np.array(h_states), np.array(c_states), output# 测试数据
input_size = 3
hidden_size = 2
seq_len = 4x = np.random.randn(seq_len, input_size)
bilstm = BILSTM(input_size, hidden_size, 5)
out = bilstm.forward(x)print(out)
print(np.array(out).shape)

API的使用

import torch
import torch.nn as nn
import numpy as npclass BiLstm(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(BiLstm, self).__init__()# 定义双向LSTMself.lstm = nn.LSTM(input_size, hidden_size, bidirectional=True)# 因为双向的,所以第一个参数是隐藏层的的二倍self.linear = nn.Linear(hidden_size*2, output_size)def forward(self, x):out, _ = self.lstm(x)out = self.linear(out)return out# 测试数据
input_size = 3
hidden_size = 8
seq_len = 4
output_size = 5
batch_size = 6x = torch.randn(seq_len, batch_size, input_size)bilstm = BiLstm(input_size, hidden_size, output_size)output = bilstm(x)print(output.shape)

相关文章:

LSTM模型变种

LSTM模型变种 一、GRU 1.什么是GRU GRU(Gated Recurrent Unit)是一种循环神经网络(RNN)的变体,它被设计用来解决传统RNN在处理长序列时可能遇到的梯度消失或梯度爆炸问题。GRU通过引入门控机制来控制信息的流动&…...

基于comsol模拟微穿孔板和卷曲通道的混合吸声器低频吸声

研究背景&#xff1a; 具有深亚波长厚度&#xff08;5cm&#xff09;的吸收器对低频声音&#xff08;<500Hz&#xff09;的衰减在噪声控制工程中引起了极大的兴趣。然而&#xff0c;由于低频声音的强穿透性和普通材料的弱固有分散性&#xff0c;这是一项具有挑战性的任务。…...

Ajax ( 是什么、URL、axios、HTTP、快速收集表单 )Day01

AJAX 一、Ajax是什么1.1名词解释1.1.1 服务器1.1.2 同步与异步1. 同步&#xff08;Synchronous&#xff09;2. 异步&#xff08;Asynchronous&#xff09;3. 异步 vs 同步 场景4. 异步在 Web 开发中的常见应用&#xff1a; 1.2 URL 统一资源定位符1.2.1 URL - 查询参数1.2.2 ax…...

【Java 循环控制实例详解【While do... while】】

Java 循环控制详解【While & do… while】 在 Java 中&#xff0c;循环控制是程序设计中非常重要的部分&#xff0c;主要包括 while 循环和 do...while 循环。本文将详细介绍这两种循环的基本语法、执行流程及相关示例。 1. while 循环控制 基本语法 循环变量初始化; wh…...

10.2 Linux_进程_进程相关函数

创建子进程 函数声明如下&#xff1a; pid_t fork(void); 返回值&#xff1a;失败返回-1&#xff0c;成功返回两次&#xff0c;子进程获得0(系统分配)&#xff0c;父进程获得子进程的pid 注意&#xff1a;fork创建子进程&#xff0c;实际上就是将父进程复制一遍作为子进程&…...

栈与队列面试题(Java数据结构)

前言&#xff1a; 这里举两个典型的例子&#xff0c;实际上该类型的面试题是不确定的&#xff01; 用栈实现队列&#xff1a; 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 方法一&#xff1a;双栈 思路 将一个栈当作输入栈&#xff0c;用于压入 push 传入的数…...

手撕数据结构 —— 顺序表(C语言讲解)

目录 1.顺序表简介 什么是顺序表 顺序表的分类 2.顺序表的实现 SeqList.h中接口总览 具体实现 顺序表的定义 顺序表的初始化 顺序表的销毁 打印顺序表 ​编辑 检查顺序表的容量 尾插 尾删 ​编辑 头插 头删 查找 在pos位置插入元素 删除pos位置的值 ​…...

女友学习前端第二天-笔记

2024/10/8笔记 表格 table 表格 tr 行 td 单元格内容 th 表头 第一行相当于h1 alignleft /center /right 对齐方式 应在table边上 比如<table alignleft> border 代表边框 也应在table边上 比如<table alignleft border"1"> cellpadding 单元外框与…...

电脑手机下载小米xiaomi redmi刷机包太慢 解决办法

文章目录 修改前下载速度修改后下载速度修改方法&#xff08;修改host&#xff09; 修改前下载速度 一开始笔者以为是迅雷没开会员的问题&#xff0c;在淘宝上买了一个临时会员后下载速度依然最高才100KB/s 修改后下载速度 修改方法&#xff08;修改host&#xff09; host文…...

Python中的策略模式:解锁编程的新维度

引言 策略模式是一种行为型设计模式&#xff0c;允许算法独立于使用它的客户端而变化。这使得我们可以根据不同的情况选择不同的算法或策略来解决问题&#xff0c;从而增强系统的灵活性。在日常开发中&#xff0c;策略模式常用于处理多种算法或行为之间的切换&#xff0c;比如…...

ara::core::Future::then()的概念和使用方法

1. 概念 在ara::core::Future的上下文中&#xff0c;then()是一种用于处理异步操作结果的机制。一个Future代表一个尚未完成的异步计算&#xff0c;它最终会产生一个结果或者一个错误。then()方法允许你在Future完成时注册一个回调函数&#xff08;或者说后续操作&#xff09;…...

九、5 USART串口数据包

数据包作用&#xff1a;把一个个单独的数据给打包起来&#xff0c;将同一批的数据进行打包和分割&#xff0c;方便接收方进行识别&#xff0c;方便我们进行多字节的数据通信。 1、串口收发HEX数据包 &#xff08;1&#xff09;数据包的格式是个人规定的&#xff0c;如以FF为包…...

SQL第12课——联结表

三点&#xff1a;什么是联结&#xff1f;为什么使用联结&#xff1f;如何编写使用联结的select语句 12.1 联结 SQL最强大的功能之一就是能在数据查询的执行中联结&#xff08;join)表。联结是利用SQL的select能执行的最重要的操作。 在使用联结前&#xff0c;需要了解关系表…...

CentOS7 虚拟机操作系统安装及相关配置教程

1、安装虚拟机 在VMware《主页》界面中点击《创建新的虚拟机》按钮&#xff1a; 选择你准备好的ISO文件&#xff0c;点击下一步&#xff1a; 然后填写虚拟机的名称以及虚拟机将来保存的位置&#xff1a; 再次下一步&#xff0c;填写虚拟机磁盘大小&#xff1a; 继续下一步&…...

『网络游戏』窗口基类【06】

创建脚本&#xff1a;WindowRoot.cs 编写脚本&#xff1a; 修改脚本&#xff1a;LoginWnd.cs 修改脚本&#xff1a;LoadingWnd.cs 修改脚本&#xff1a;ResSvc.cs 修改脚本&#xff1a;LoginSys.cs 运行项目 - 功能不变 本章结束...

04_23 种设计模式之《单例模式》

文章目录 一、单例模式基础知识单例模式有 3 个特点&#xff1a; 单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取这个实例。这种模式通常用于管理共享资源&#xff0c;如…...

视频加字幕用什么软件最快?12款工具快速添加字幕!

对于大多数同学来讲&#xff0c;剪辑中比较头疼的就是如何给视频加字幕和唱词啦&#xff0c;特别是用Pr或者FCXP等专业剪辑软件&#xff0c;加字幕也是特别费时的&#xff0c;哪怕是有批量添加的功能orz... 虽然关于这方面的内容已经很多啦&#xff0c;但是真正全面的内容还特…...

C++:string (用法篇)

文章目录 前言一、string 是什么&#xff1f;二、C语法补充1. auto2. 范围for 三、string类对象的常见构造1. Construct string object2. String destructor3. operator 四、string迭代器相关1. begin与end1&#xff09;begin2&#xff09;end3&#xff09;使用 2. rbegin 与 r…...

力扣随机题

最接近原点的K个点 题目 973. 最接近原点的 K 个点 - 力扣&#xff08;LeetCode&#xff09; 思路 这就是一道排序题&#xff0c;直接根据公式排序&#xff0c;然后返回对应范围的数组就行了 代码 public int[][] kClosest(int[][] points, int k) {Arrays.sort(points, n…...

CSS样式基础样式选择器(案例+代码实现+效果图)

目录 1.css样式的规则 2.引入css样式的方式 1)行内式 2)内嵌式 3)外链式 1-link导入 2-import导入 4)总 3.css基础选择器 1)标签选择器 案例&#xff1a;使用标签选择器编写一个圆 1.代码 2.效果 2)类选择器 案例&#xff1a;使用类选择器为div添加背景色 1.代码 2.效果 3)id…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知&#xff0c;帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量&#xff0c;能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度&#xff0c;还为机器人、医疗设备和制造业的智…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染&#xff08;SSR&#xff09;与静态网站生成&#xff08;SSG&#xff09; 框架&#xff0c;由 Vercel 开发。它简化了构建生产级 React 应用的过程&#xff0c;并内置了很多特性&#xff1a; ✅ 文件系…...

jdbc查询mysql数据库时,出现id顺序错误的情况

我在repository中的查询语句如下所示&#xff0c;即传入一个List<intager>的数据&#xff0c;返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致&#xff0c;会导致返回的id是从小到大排列的&#xff0c;但我不希望这样。 Query("SELECT NEW com…...