GRU门控循环单元神经网络的MATLAB实现(含源代码)

news2025/1/11 21:03:48

在深度学习领域,循环神经网络(RNN)因其在处理序列数据方面的卓越能力而受到广泛关注。GRU(门控循环单元)作为RNN的一种变体,以其在捕捉时间序列长距离依赖关系方面的高效性而备受推崇。在本文中,我们将探讨如何在MATLAB环境中实现GRU网络,以及该实现在处理各类序列数据时的应用。

GRU神经网络简介

GRU由Cho等人于2014年提出,旨在解决标准RNN在处理长序列时的梯度消失或梯度爆炸问题。与传统的RNN相比,GRU引入了两个关键的门控机制:更新门(Update Gate)和重置门(Reset Gate)。这些门控结构帮助模型更有效地捕捉长期依赖关系。
更新门
更新门负责决定信息的保留量。它决定了来自过去状态的信息应该被多大程度上保留,以及新的候选隐藏状态的信息应该被多大程度上加入。
重置门
重置门则决定了多少过去的信息需要被忽略。它可以帮助模型忘记无关的信息,从而专注于当前的重要信息。
在这里插入图片描述

MATLAB中的GRU实现

在MATLAB中实现GRU涉及以下关键步骤:
数据准备:首先,我们需要准备并预处理适合GRU模型的序列数据。这通常包括数据的归一化、划分训练集和测试集等。
模型构建:MATLAB提供了内置的GRU层,可以通过gruLayer函数轻松创建。用户可以指定神经元数量、激活函数等参数。
模型训练和调整:利用MATLAB的trainingOptions函数,我们可以定义训练参数,如学习率、迭代次数、批大小等。然后,使用trainNetwork函数开始训练过程。在此阶段,调整模型参数和结构以达到最佳性能是至关重要的。
性能评估和测试:在模型训练完成后,需要在测试集上评估其性能。这通常涉及计算诸如准确率、损失函数值等指标,并对模型进行必要的微调。
应用和部署:训练好的GRU模型可以应用于各种序列数据任务,如时间序列预测、语言建模、情感分析等。MATLAB支持将训练好的模型导出,以便在其他应用中使用。

MATLAB中实现GRU的关键

在MATLAB中实现GRU时,有几个关键因素需要考虑:
数据预处理:确保输入数据格式适合MATLAB处理。适当的标准化或归一化可以提高模型的学习效率和性能。
超参数选择:合适的超参数(如隐藏层神经元数、学习率、批大小等)对模型的性能有重大影响。可能需要通过实验来找到最优设置。
避免过拟合:使用诸如dropout层或正则化技术来避免过拟合,特别是在处理小型数据集时。
计算资源:GRU模型训练可能需要较高的计算资源,特别是对于大型数据集。。

结论

GRU门控循环单元神经网络是一种强大的工具,适用于各种复杂的序列数据处理任务。在MATLAB中实现GRU不仅可行,而且相对直接,得益于MATLAB提供的高级函数和易于使用的界面。通过正确的实现和调整,GRU模型可以在多种应用中展现出色的性能,从而揭示序列数据的深层次特征和模式。

部分源代码

%% GRU参数设置
%% 清空环境变量
	clc;
	clear;
	close all;
	warning off;
	tic
	
%% 导入数据
	load data.mat
	[trainInd,valInd,testInd] = dividerand(size(X,2),0.7,0,0.3);	%划分训练集与测试集
	input_train = X(:,trainInd);	%列索引
	output_train = Y(:,trainInd);
	input_test = X(:,testInd);
	output_test = Y(:,testInd);

%% 归一化
	[inputn_train,input_ps] = mapminmax(input_train);	%映射到[0,1]并把参数保存到input_ps中
	[outputn_train,output_ps] = mapminmax(output_train);
	inputn_test = mapminmax('apply',input_test,input_ps);	%将归一化参数input_ps应用到测试集输入数据中
	outputn_test = mapminmax('apply',output_test,output_ps);

%% GRU参数设置
	inputSize = size(inputn_train,1);	%输入数据维度
	outputSize = size(outputn_train,1);		%输出数据维度
	numhidden_units = 5;
	
    layers = [ ...
        sequenceInputLayer(inputSize)                 %输入层设置
        gruLayer(numhidden_units,'Outputmode','sequence','name','hidden') 
        reluLayer('name','relu')
        fullyConnectedLayer(outputSize)               % 全连接层设置(影响输出维度)
        regressionLayer('name','out')];
		
	opts = trainingOptions('adam', ...
		'MaxEpochs',200, ...
		'ExecutionEnvironment','cpu',...
		'InitialLearnRate',0.1, ...
		'LearnRateSchedule','piecewise', ...
		'LearnRateDropPeriod',180, ...                % 学习率更新
		'LearnRateDropFactor',0.2, ...
		'Verbose',1, ...
		'Plots','training-progress'... 
		);
		
	analyzeNetwork(layers);	%显示网络结构
	
%% GRU网络训练
	GRUnet = trainNetwork(inputn_train,outputn_train,layers,opts);	
	
	[GRUnet,GRUoutputr_train] = predictAndUpdateState(GRUnet,inputn_train);	%训练集训练
	GRUoutput_train = mapminmax('reverse',GRUoutputr_train,output_ps);
	[GRUnet,GRUoutputr_test] = predictAndUpdateState(GRUnet,inputn_test);	%测试集训练
	GRUoutput_test = mapminmax('reverse',GRUoutputr_test,output_ps);
%% 输出数据
    len=size(output_test,2);
	error1 = GRUoutput_test - output_test;	%GRU网络输出误差
	error2 = GRUoutput_train - output_train;
    MAE1=sum(abs(error1./output_test))/len;
	MAPE1 = calculateMAPE(output_test,GRUoutput_test);
	RMSE1 = sqrt(mean((error1).^2));
	disp('GRU网络测试集预测绝对平均误差MAE');
	disp(MAE1);
	disp('GRU网络测试集预测平均绝对误差百分比MAPE');
	disp(MAPE1);
	disp('GRU网络测试集预测均方根误差RMSE');
	disp(RMSE1);

%% 输出可视化
	figure(1)
	plot(GRUoutput_test,'k');
	hold on;
	plot(output_test,'r');
    legend('预测值','真实值');
    title('测试集预测结果');
	hold on;
	
	figure(2)
	plot(error1);
    title('测试集误差');
	hold on;

    figure(3)
	plot(GRUoutput_train,'k');
	hold on;
	plot(output_train,'r');
    legend('预测值','真实值');
    title('训练集预测结果');
	hold on;
	
	figure(4)
	plot(error2);
    title('训练集误差');
	hold on;
    toc

function mape = calculateMAPE(actual, forecast)
    absolute_error = abs(actual - forecast);
    percentage_error = absolute_error ./ actual;
    mape = mean(percentage_error) * 100;
end

另外此处还有BIGRU,贝叶斯优化的GRU,BIGRU等代码,欢迎访问~~:https://mbd.pub/o/author-a2yXmm5naw==/work

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1400017.html

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

相关文章

ros2学习笔记-CLI工具,记录命令对应操作。

目录 环境变量turtlesim和rqt以初始状态打开rqt node启动节点查看节点列表查看节点更多信息命令行参数 --ros-args topic话题列表话题类型话题列表,附加话题类型根据类型查找话题名查看话题发布的数据查看话题的详细信息查看类型的详细信息给话题发布消息&#xff0…

推荐两个工具:DeepSpeed-FastGen和DataTrove

DeepSpeed-FastGen 通过 MII 和 DeepSpeed-Inference 加速LLM生成文本 仓库地址:https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen GPT-4 和 LLaMA 等大型语言模型 (LLM) 已成为服务于各个级别的人工智能应用程序的主要工作负载。从一…

UE5 独立程序的网络TCP/UDP服务器与客户端基础流程

引擎源码版,复制\Engine\Source\Programs\路径下的BlankProgram空项目示例。 重命名BlankProgram,例如CustomTcpProgram,并修改项目名称。 修改.Build.cs内容 修改Target.cs内容 修改Private文件夹内.h.cpp文件名并修改.cpp内容 刷新引擎 …

SpringMVC获取参数与页面跳转

获取参数 第一种 直接当成方法的参数,需要与前台的name一致 相当于Request.getAttribute("username") Controller 第二种 使用对象接收 页面的name也要和对象的字段一致 创建一个对应的实体类 Controller 将参数更换为User对象就行 SpringMVC获取到…

【设计模式】你知道游戏SL大法是什么设计模式吗?

什么是备忘录模式? 老规矩,我们先来看看备忘录模式 (Memento) 的定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 它的UML类图如下&a…

keep-alive组件缓存

keep-alive组件缓存 从a跳b,a已经销毁,b重新渲染;b跳a,b销毁a重新渲染 源组件销毁,目标组件渲染 组件缓存:组件实例等相关( 包括vnode)存储起来 重新渲染指的是:把视图重…

MySQL---多表查询综合练习

创建dept表 CREATE TABLE dept ( deptno INT(2) NOT NULL COMMENT 部门编号, dname VARCHAR (15) COMMENT 部门名称, loc VARCHAR (20) COMMENT 地理位置 ); 添加dept表主键 mysql> alter table dept add primary key(deptno); Query OK, 0 rows affected (0.02 s…

正则表达式初版

一、简介 REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,但与通…

YOLOv5改进 | 主干篇 | 华为GhostnetV1一种移动端的专用特征提取网络

一、本文介绍 本文给大家带来的改进机制是华为移动端模型Ghostnetv1,华为GhostnetV1一种移动端的专用特征提取网络,旨在在计算资源有限的嵌入式设备上实现高性能的图像分类。GhostNet的关键思想在于通过引入Ghost模块,以较低的计算成本增加了特征图的数量,从而提高了模型的…

消除噪音:Chain-of-Note (CoN) 强大的方法为您的 RAG 管道提供强大动力

论文地址:https://arxiv.org/abs/2311.09210 英文原文地址:https://praveengovindaraj.com/cutting-through-the-noise-chain-of-notes-con-robust-approach-to-super-power-your-rag-pipelines-0df5f1ce7952 在快速发展的人工智能和机器学习领域&#x…

数据结构 | 红黑树

二叉搜索树 节点的左边比节点的值小,右边比节点的值大。 红黑树 红黑树的性质 节点要么是红色,要么是黑色根节点是黑色叶子节点都是黑色的空节点红黑树中红色节点的子节点都是黑色从任一节点到叶子节点的所有路径都包含相同数目的黑色节点 在添加或者…

Rustdesk自建服务搭建好了,打开Win10 下客户端下面状态一直正在接入网络,无法成功连接服务器

环境: Rustdesk1.2.3 自建服务器 有域名地址 问题描述: Rustdesk自建服务搭建好了,打开Win10 下客户端下面状态一直正在接入网络,无法成功连接服务器 解决方案: RustDesk是一款免费的远程桌面软件,它允许用户通过互联网远程连接和控制其他计算机。它是用Rust编程语…

爬虫进阶之selenium模拟浏览器

爬虫进阶之selenium模拟浏览器 简介环境配置1、建议先安装conda2、创建虚拟环境并安装对应的包3、下载对应的谷歌驱动以及与驱动对应的浏览器 代码setting.py配置scrapy脚本参考中间件middlewares.py 附录:selenium教程 简介 Selenium是一个用于自动化浏览器操作的…

web开发学习笔记(10.postman请求响应,后端接口基础知识)

1.springboot使用get请求接受简单参数 上述写法不去别get或者post请求 2.postman各种提交方式的区别 1、form-data: 就是http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可…

huggingface学习 | 云服务器使用hf_hub_download下载huggingface上的模型文件

系列文章目录 huggingface学习 | 云服务器使用git-lfs下载huggingface上的模型文件 文章目录 系列文章目录一、hf_hub_download介绍二、找到需要下载的huggingface文件三、准备工作及下载过程四、全部代码 一、hf_hub_download介绍 hf_hub_download是huggingface官方支持&…

【C++】文件操作

文件操作 一、文本文件(一)写文件读文件 二、二进制文件(一)写文件(二)读文件 程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放,通过文件可以将数据持久化&#xff…

支付宝小程序开发踩坑笔记(支付宝、学习强国小程序)

1、接口请求安卓端回调 success,IOS 端回调 fail 原因:dataType 设置不对,默认是 json 格式,对返回数据会进行 json 解析,如果解析失败,就会回调 fail 。加密传输一般是 text 格式。 2、input 禁止输入空格…

【动态规划】【数学】【C++算法】805 数组的均值分割

作者推荐 【动态规划】【数学】【C算法】18赛车 本文涉及知识点 动态规划 数学 805 数组的均值分割 给定你一个整数数组 nums 我们要将 nums 数组中的每个元素移动到 A 数组 或者 B 数组中,使得 A 数组和 B 数组不为空,并且 average(A) average(B)…

2788.按分隔符拆分字符串

前言 力扣还挺上道(bushi),今天第一次写每日一题,给了个简单等级的数组题,我只能说,首战告捷(小白的呐喊),看看这每日一题我能坚持一天写出来, ok&#xff…

Ubuntu安装mysql8详细步骤

1、拉取镜像 docker pull mysql:8.0.20 2、启动镜像 docker run -p 3307:3306 --name mysql8 -e MYSQL_ROOT_PASSWORD123456 -d mysql:8.0.20 检查是否启动成功 docker ps 3、配置挂载 创建挂载目录(请检查保证创建成功) mkdir -p /docker/mysql8.0.20/…