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

双向门控循环神经网络(BiGRU)及其Python和MATLAB实现

BiGRU是一种常用的深度学习模型,用于处理序列数据的建模和预测。它是基于GRU(Gated Recurrent Unit)模型的改进版本,通过引入更多的隐藏层和增加网络的宽度,能够更好地捕捉复杂的序列数据中的模式。

背景:

RNN(循环神经网络)是一种常用的序列数据处理模型,但是它在处理长序列数据时存在梯度消失或爆炸的问题,导致模型难以训练和学习长期依赖关系。为了解决这一问题,GRU模型被提出,它使用门控机制来控制信息的流动,从而更好地捕捉长序列数据中的依赖关系。然而,单层的GRU模型在处理复杂的数据时可能欠拟合,因此需要引入更多的隐藏层来增加网络的深度。

原理:

BiGRU模型是在GRU的基础上进行改进和扩展得到的,它包括两个方向的GRU层:一个从头到尾的正向层和一个从尾到头的反向层。这样,BiGRU模型可以同时捕捉序列数据中的正向和反向信息,从而更好地理解数据中的模式和规律。BiGRU模型的隐藏层和输出层之间还可以加入更多的全连接层,使模型能够更充分地学习数据中的特征和结构。

实现过程:

BiGRU模型的实现主要包括以下几个步骤:
1. 数据准备:将原始数据进行预处理和特征提取,将数据按照时间顺序组织成序列数据。
2. 搭建模型:定义BiGRU模型的结构,包括输入层、隐藏层、输出层和连接结构。
3. 模型训练:使用反向传播算法和优化器来训练BiGRU模型,调整模型参数使得损失函数最小化。
4. 模型评估:使用验证集或测试集来评估BiGRU模型的性能,看模型在新数据上的泛化能力如何。
5. 模型应用:将训练好的BiGRU模型应用于实际任务中,例如文本分类、语言建模、时间序列预测等。

流程图:

下面是BiGRU模型的一个简化流程图:
1. 输入层:将序列数据输入BiGRU模型,例如文本序列、时间序列等。
2. 正向GRU层:从头到尾对序列数据进行前向计算,得到正向信息表示。
3. 反向GRU层:从尾到头对序列数据进行反向计算,得到反向信息表示。
4. 连接结构:将正向和反向信息表示连接在一起,得到整个序列数据的表示。
5. 隐藏层:在连接结构之后可以加入更多的隐藏层进行特征提取和维度扩展。
6. 输出层:将隐藏层的表示映射到输出空间,得到模型的预测结果。

总结:

BiGRU模型是一种强大的序列数据处理模型,能够更好地捕捉复杂序列数据中的模式和规律。通过利用正向和反向信息表示来提高模型的性能,BiGRU模型在多个领域和任务中都取得了显著的效果。在实践中,可以根据具体任务的需求对BiGRU模型进行调整和改进,以获得更好的性能和效果。BiGRU模型的发展和应用将进一步推动深度学习在序列数据处理领域的发展和应用。
 

以下是一个简单的 BiGRU 模型的 Python 代码示例,用于序列数据预测:

1. 导入必要的库和模块:

```python
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
import matplotlib.pyplot as plt
import numpy as np

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Bidirectional, GRU, Dense
```

2. 加载数据并准备训练集和测试集:

```python
data = pd.read_excel('N2.xlsx').iloc[0:,1:]
X, y = data.iloc[:, 0:-1], data.iloc[:, -1]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, shuffle=False)
```

3. 缩放特征:

```python
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
```

4. 构建 BiGRU 模型并进行训练:

```python
model = Sequential()
model.add(Bidirectional(GRU(units=64, return_sequences=True), input_shape=(X_train_scaled.shape[1], X_train_scaled.shape[2])))
model.add(Dense(1))  # 回归问题输出层为1个神经元

model.compile(loss='mean_squared_error', optimizer='adam')  # 使用均方误差作为损失函数

model.fit(X_train_scaled, y_train, epochs=10, batch_size=32)
```

5. 在测试集上进行预测并评估模型:

```python
y_pred = model.predict(X_test_scaled)

mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print("RMSE:", rmse)
print("MAE:", mae)
print("R²:", r2)
```

6. 绘制拟合对比曲线图:

```python
plt.figure(figsize=(10, 6))
plt.plot(range(len(y_test)), y_test, color='darkorange', label='Actual')
plt.plot(range(len(y_pred)), y_pred, color='navy', linewidth=2, label='Predicted')
plt.xlabel('Sample Index')
plt.ylabel('Target Variable')
plt.title('BiGRU Regression Fit Comparison')
plt.legend()
plt.grid(True)
plt.show()
```

 

对于 MATLAB,可以使用深度学习工具箱中的函数来实现类似的 BiGRU 模型。以下是一个简单的 MATLAB 代码示例:

% 构建 BiGRU 模型  
layers = [  
    sequenceInputLayer(input_dim)  
    bilstmLayer(64, 'OutputMode', 'sequence')  
    fullyConnectedLayer(output_dim)  
    softmaxLayer  
    classificationLayer  
];  

% 定义训练选项  
options = trainingOptions('adam', 'MaxEpochs', 10, 'MiniBatchSize', 32, 'ValidationData', {X_val, y_val});  

% 训练模型  
net = trainNetwork(X_train, y_train, layers, options);  

% 在测试集上评估模型  
pred = classify(net, X_test);  
accuracy = mean(pred == y_test);  
fprintf('Test accuracy: %f\n', accuracy);


 

 

相关文章:

双向门控循环神经网络(BiGRU)及其Python和MATLAB实现

BiGRU是一种常用的深度学习模型,用于处理序列数据的建模和预测。它是基于GRU(Gated Recurrent Unit)模型的改进版本,通过引入更多的隐藏层和增加网络的宽度,能够更好地捕捉复杂的序列数据中的模式。 背景:…...

【BUG】已解决:ERROR: Failed building wheel for jupyter-nbextensions-configurator

ERROR: Failed building wheel for jupyter-nbextensions-configurator 目录 ERROR: Failed building wheel for jupyter-nbextensions-configurator 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我…...

Unity UGUI 之 自动布局组件

本文仅作学习笔记与交流,不作任何商业用途 本文包括但不限于unity官方手册,唐老狮,麦扣教程知识,引用会标记,如有不足还请斧正 本文在发布时间选用unity 2022.3.8稳定版本,请注意分别 1.什么是自动布局组件…...

网络基础之(11)优秀学习资料

网络基础之(11)优秀学习资料 Author:Once Day Date: 2024年7月27日 漫漫长路,有人对你笑过嘛… 全系列文档可参考专栏:通信网络技术_Once-Day的博客-CSDN博客。 参考文档: 网络工程初学者的学习方法及成长之路(红…...

QT自定义无边框窗口(可移动控制和窗口大小调整)

QT是一个功能强大的跨平台开发框架,它提供了丰富的界面设计工具和组件。在界面开发中,QT窗口自带的标题栏无法满足我们的需求。我们就需要自定义无边框窗口,包括自定义标题栏和窗口大小调整功能。本文将介绍如何在QT中实现这些功能。 一、简…...

Typora 【最新1.8.6】版本安装下载教程 (轻量级 Markdown 编辑器),图文步骤详解,免费领取(软件可激活使用)

文章目录 软件介绍软件下载安装步骤激活步骤 软件介绍 Typora 是一款专为 Markdown 爱好者设计的文本编辑器,它结合了简洁的界面设计与强大的 Markdown 渲染能力,为用户提供了一个流畅、高效的写作环境。以下是对 Typora 更详细的介绍: 核心特…...

RxJava 面试题及其答案

以下是一个全面的 RxJava 面试题及其答案,涵盖了 RxJava 的各个方面,包括基本概念、操作符、线程管理、错误处理、背压处理等: 基本概念 1. RxJava 的基本概念和原理是什么? 答案: RxJava 是一个用于响应式编程的库…...

【Rust】所有权OwnerShip

什么是所有权 rust使用由编译器检查的一些规则构成的所有权系统来管理内存。且这不会影响程序的运行效率。 所有权规则 rust中每一个每一个值都有一个owner。在同一时刻,只能有一个owner。当这个owner超过范围,则该值会被丢弃。 String类型 为什么需…...

qt总结--翻金币案例

完成了一个小项目的在qt5.15.2环境下的运行,并使用NSIS editNSIS打包完成.有待改进之处:增加计时功能,随机且能通关功能,过关后选择下一关功能.打包后仅仅有安装包有图标 安装后应用图标并未改变 在qt .pro中有待改进对qt的基本操作和帮助文档有了基本的认识.对C制作小游戏有了…...

最清楚的 BIO、NIO、AIO 详解!

一、什么是 I/O? I/O 描述了计算机系统与外部设备(磁盘)之间通信的过程。 为了保证操作系统的稳定性和安全性,一个进程的地址空间划分为 用户空间(User space) 和 内核空间(Kernel space &…...

八股文学习第二天| HTTP请求报文和响应报文是怎样的,有哪些常见的字段?,HTTP有哪些请求方式?,GET请求和POST请求的区别?

1、HTTP请求报文和响应报文是怎样的,有哪些常见的字段? 答: HTTP报文分为请求报文和响应报文。 (1) 请求报文 请求报文主要由请求行、请求头、空行、请求体构成。 请求行包括如下字段: 方法&#xff08…...

C++初阶学习第四弹——类与对象(中)

目录 一. 类的默认成员函数 二.六种默认成员函数 1、构造函数 1.1 构造函数的作用 1.2 特性 1.3 默认构造函数 2、析构函数 2.1 析构函数的作用 2.2 析构函数的用法 3、拷贝构造函数 3.1 拷贝构造函数的作用 3.2 特征 3.3 默认拷贝构造函数 三.总结 类与对象&…...

【计算机网络】期末实验答辩

注意事项: 1)每位同学要在下面做过的实验列表中选取三个实验进行答辩准备,并将自己的姓名,学号以及三个实验序号填入共享文档"1(2)班答辩名单"中。 2)在答辩当日每位同学由老师在表…...

一步步教你学会如何安装VMare虚拟机(流程参考图)

前言:一步步教你安装VMare虚拟机(此版本为17.5。2版本)。 1、安装 2、确认协议 3、选择位置存放 4、选择第二个 5、都不选。 6、都选提供便捷操作 7、点击许可证,将密钥输入(可以在网络寻找自己版本的密钥&#xff…...

WebGoC题解(14) 151.(2017dloi小乙)第5题 巧克力甜度(sweet)

题目描述 妈妈买了n颗甜度不同的巧克力,规定小C只能吃最大甜度之和是S。 例如:有5颗巧克力,s6,每个的甜度分别为: 4 2 3 1 1,那么小C最多可以吃3颗。 请问你能帮小C计算一下最多能吃多少颗巧克力吗? 输入格…...

深入探索PHP框架:Symfony框架全面解析

1. 引言 在现代Web开发领域,PHP作为一种广泛使用的服务器端脚本语言,其框架的选择对于项目的成功至关重要。PHP框架不仅能够提高开发效率,还能确保代码的质量和可维护性。本文将深入探讨Symfony框架,这是一个功能强大且灵活的PHP…...

内卷的利与弊

“内卷”原指一类文化模式达到了某种最终的形态以后,既没有办法稳定下来,也没有办法转变为新的形态,而只能不断地在内部变得更加复杂的现象。经网络流传,很多大学生用其来指代非理性的内部竞争或“被自愿”竞争。现指同行间竞相付…...

用Java手写jvm之实现查找class

写在前面 完成类加载器加载class的三阶段,加载,解析,初始化中的加载😀😀😀 源码 。 jvm想要运行class,是根据类全限定名称来从特定的位置基于类加载器来查找的,分别如下:…...

【React】组件:全面解析现代前端开发的基石

文章目录 一、什么是组件?二、组件的类型三、组件的生命周期四、状态管理五、属性传递六、组合与继承七、最佳实践 在现代前端开发中,React 已成为开发者构建用户界面的首选框架之一。React 的强大之处在于其组件化设计,允许开发者将 UI 拆分…...

java学习--包装类

包装类 Boolean的关系图 Character关系图 其他关系图 包装类和基本数据转换 Debug进入之后可以看到底层代码如下 例题: 三元运算符是一个整体返回的数的类型看其中所含类型最高的那个是谁就会转成哪个 想要掌握这个这个知识,就要多看源码,直接…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

在rocky linux 9.5上在线安装 docker

前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四&#xff…...