神经网络——循环神经网络(RNN)

神经网络——循环神经网络(RNN)

文章目录

  • 神经网络——循环神经网络(RNN)
    • 一、循环神经网络(RNN)
    • 二、循环神经网络结构
      • 1、一对一(One to One)
      • 2、一对多(One to Many)
      • 3、多对多(Many to Many)
      • 4、多对一(Many to One)
    • 三、循环神经网络原理
    • 四、RNN实战
      • 1、时间序列预测
    • 五、循环神经网络的弊端

一、循环神经网络(RNN)

循环神经网络(Recurrent Neural Network,简称RNN)是一种能够处理序列数据的神经网络模型。循环神经网络属于深度学习神经网络(DNN),与传统的前馈神经网络不同,RNN在处理每个输入时都会保留一个隐藏状态,该隐藏状态会被传递到下一个时间步,以便模型能够记忆之前的信息。

循环神经网络在自然语言处理、语音识别、机器翻译等任务上取得了很大的成功。它能够捕捉到输入序列的上下文信息,从而能够更好地处理序列数据的特点。

二、循环神经网络结构

1、一对一(One to One)

特征:由一个输入到模型中,获得一个输出。
在这里插入图片描述

2、一对多(One to Many)

特征:由一个输入到模型中,获得多个输出。
在这里插入图片描述

3、多对多(Many to Many)

特征:由多个输入到模型中,获得多个输出。
在这里插入图片描述
其他变形:
在这里插入图片描述

4、多对一(Many to One)

特征:由多个输入到模型中,获得一个输出。
在这里插入图片描述

三、循环神经网络原理

符号说明:

符号说明
X n X_n Xn输入内容
Y n Y_n Yn输出内容
U 、 V 、 W U、V、W UVW权重
S n S_n Sn神经元
c c c输出的个数

循环神经网络的一个特性是上一次的结果将会作为下一次的输入
在这里插入图片描述
在输出层,通常使用 s o f t m a x softmax softmax函数对数据进行归一化处理。
Y n = s o f t m a x ( S n ) = e S n ∑ c = 1 c e S c \begin{aligned} Y_n&=softmax(S_n)\\ &= \frac{e^{S_n}}{\sum_{c= 1}^{c}e^{S_c}} \end{aligned} Yn=softmax(Sn)=c=1ceSceSn
由函数可知,此函数将数据限制在 [ 0 , 1 ] [0,1] [0,1]且和为 1 1 1


在隐藏层中,常用 t a n h tanh tanh作为激活函数。根据循环神经网络的性质可以分析出
S n = t a n h ( U X n + W S n − 1 ) S_n=tanh(UX_n+WS_{n-1}) Sn=tanh(UXn+WSn1)
根据公式可以得知
Y n = s o f t m a x ( ∑ n = 1 n t a n h ( U X n + W S n − 1 ) ) = e ∑ n = 1 n t a n h ( U X n + W S n − 1 ) ∑ c = 1 c e S c \begin{aligned} Y_n&=softmax(\sum_{n=1}^{n}tanh(UX_n+WS_{n-1}))\\ &=\frac{e^{\sum_{n=1}^{n}tanh(UX_n+WS_{n-1})}}{\sum_{c=1}^{c}e^{Sc}} \end{aligned} Yn=softmax(n=1ntanh(UXn+WSn1))=c=1ceScen=1ntanh(UXn+WSn1)

四、RNN实战

1、时间序列预测

现在有2000-2013年成都一月份的平均温度数据,现在即将预测2014年的温度。
在这里插入图片描述
MATLAB代码如下:

% 日期数据
years = 2000:2013;
target_year = 2014;% 温度数据
temperatures = [0.501, 1.038, 0.447, 1.304, 0.922, 0.811, 1.865, 0.414, 0.271, 1.126, 2.434, -1.447, 0.166, 0.614];% 利用数据进行训练
training_years = years(1:14);
training_temperatures = temperatures(1:14);% 创建简单的递归神经网络 (RNN) 模型
net = layrecnet(1,10);% 调整输入数据的维度
input_seq = con2seq(training_temperatures');
target_seq = con2seq(training_temperatures');% 在训练数据上训练模型
net = train(net, input_seq, target_seq);% 预测2014年的温度
predicted_temperatures = sim(net, input_seq);% 将 cell 类型的预测结果转换为数组类型
predicted_temperature_2014 = cell2mat(predicted_temperatures);% 输出预测结果
disp(['2014年的预测温度为: ', num2str(predicted_temperature_2014(end))]);
figure;
hold on;
plot(training_years, training_temperatures, 'o-', 'LineWidth', 1.5, 'MarkerSize', 8, 'DisplayName', 'Training Data');
plot(target_year, predicted_temperature_2014(end), 'ro', 'MarkerSize', 10, 'DisplayName', 'Prediction');
xlabel('Year');
ylabel('Temperature');
legend('Location', 'best');
title('Temperature Prediction');
hold off;

最后得到2014年的预测温度,并获得一个预测图像。
在这里插入图片描述
有时候我们不一定只预测一年的数据。我们还可以预测2014-2018年每年的数据。

MATLAB代码如下:

% 温度数据
temperature = [0.501, 1.038, 0.447, 1.304, 0.922, 0.811, 1.865, 0.414, 0.271, 1.126, 2.434, -1.447, 0.166, 0.614];% 准备训练数据
X = temperature(1:end-1);
Y = temperature(2:end);% 数据预处理
X = X';
Y = Y';% 构建RNN模型
hiddenUnits = 10; % 隐藏单元数量
net = layrecnet(1, hiddenUnits);% 配置训练参数
net.trainParam.showWindow = false; % 不显示训练进度窗口
net.trainParam.epochs = 100; % 迭代次数% 修改输入数据尺寸
X = con2seq(X);
Y = con2seq(Y);% 转换数据为二维矩阵形式
X = cell2mat(X);
Y = cell2mat(Y);% 将数据转换为时间序列数据
inputSize = size(X, 2);
outputSize = size(Y, 2);
X = num2cell(X', 1);
Y = num2cell(Y', 1);% 训练RNN模型
net = train(net, X, Y);% 预测并显示2014至2018年的温度和误差值
futureYears = 2014:2018;
predictedTemperature = [];
errors = [];for i = 1:numel(futureYears)% 预测下一年的温度prediction = round(sim(net, lastInput), 3, 'significant');% 计算误差值error = abs(prediction - Y{i});% 添加到预测结果和误差列表predictedTemperature = [predictedTemperature, prediction];errors = [errors, error];% 更新输入lastInput = [lastInput(:, 2:end), prediction];% 显示当前年份、温度和误差值disp(['年份:' num2str(futureYears(i)) ',温度:' num2str(prediction) ',误差值:' num2str(error)]);
end% 绘制训练集和预测结果
figure
hold on
plot(2000:2013, temperature, 'b')
plot(futureYears, predictedTemperature, 'r')
xlabel('年份')
ylabel('温度')
legend('训练数据', '预测数据')% 计算平均绝对误差MAE
MAE = mean(errors);% 输出平均绝对误差MAE
disp(['平均绝对误差MAE:' num2str(MAE)]);

根据MAE,选择误差合理的数据作为预测值。我选取一个MAE值为0.2422的预测值。图像如下:
在这里插入图片描述

五、循环神经网络的弊端

存在问题:
1、计算复杂度高:RNN的推理过程是逐步进行的,每一步都需要依赖前一步的结果。这导致了计算量较大,特别是在处理长序列时,时间和空间复杂度都会显著增加。

2、信息丢失:RNN的隐藏状态只能通过有限个时间步骤传递信息。长时间序列中重要的历史信息可能会被遗忘或丢失,从而影响预测的准确性。

解决方法:
采用长短期记忆网络(LSTM)、门控循环单元(GRU)等RNN变体。

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

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

相关文章

爬虫学习笔记-scrapy爬取电影天堂(双层网址嵌套)

1.终端运行scrapy startproject movie,创建项目 2.接口查找 3.终端cd到spiders,cd scrapy_carhome/scrapy_movie/spiders,运行 scrapy genspider mv https://dy2018.com/ 4.打开mv,编写代码,爬取电影名和网址 5.用爬取的网址请求,使用meta属性传递name ,callback调用自定义的…

C#快速配置NLog日志使用

首先我们需要在Nuget中安装Nlog和Nlog-Schema。 添加配置文件&#xff1a;NLog.config <?xml version"1.0" encoding"utf-8" ?> <nlog xmlns"http://www.nlog-project.org/schemas/NLog.xsd"xmlns:xsi"http://www.w3.org/2001…

整车 EOL下线 测试系统介绍

EOL测试系统背景 随着国家对环保事业的愈加重视&#xff0c;电动汽车以其绿色清洁的驱动方式&#xff0c;逐渐成为政策扶持 的重点对象。一方面&#xff0c;国家对电动汽车越来越重视&#xff0c;在另外一个方面&#xff0c;人们也越来越乐于绿色 出行&#xff0c;增大了电动汽…

NestJS入门1:创建项目

1.初始化 管理员权限运行CMD进入某个文件夹&#xff0c;输入命令&#xff0c;进行初始化&#xff0c;该命令不在文件夹下产生文件 npm i -g nestjs/cli 2. 创建项目 不需要手工创建文件夹&#xff0c;在原路径下执行以下命令&#xff08;其中nest-start为项目名&#xff0c…

前端新手Vue3+Vite+Ts+Pinia+Sass项目指北系列文章 —— 第十二章 常用工具函数 (Utils配置)

前言 在项目开发中&#xff0c;我们经常会使用一些工具函数&#xff0c;也经常会用到例如loadsh等工具库&#xff0c;但是这些工具库的体积往往比较大&#xff0c;如果项目本身已经引入了这些工具库&#xff0c;那么我们就没有必要再引入一次&#xff0c;所以我们需要自己封装…

Spring Boot 笔记 023 注册页面

1.1 request.js请求工具 //定制请求的实例//导入axios npm install axios import axios from axios; //定义一个变量,记录公共的前缀 , baseURL const baseURL /api; const instance axios.create({baseURL})//添加响应拦截器 instance.interceptors.response.use(result…

【VSCode编写JavaScript】

VSCode编写JavaScript ■ 下载安装VSCode■ VSCode统一配置■ 格式化工具■ Tab size &#xff08;代码缩进 2个字符&#xff09;![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/7b79c59636f147c8b08a0fff37886e0a.png) ■ VSCode安装JS插件■ VSCode新建JS工程代码…

政安晨:【完全零基础】认知人工智能(五)【超级简单】的【机器学习神经网络】 —— 数据训练

回顾 作为这个系列文章的最后一篇&#xff0c;咱们先回顾一下建立神经网络的整体步骤&#xff0c;以实现对机器学习神经网络的整体认知&#xff1a; 在人工智能领域中&#xff0c;机器学习神经网络的数据训练部分是指通过将大量的输入数据输入到神经网络中&#xff0c;利用反…

OpenAI文生视频物理世界模型——Sora降世,AI视频领域降维打击令五大行业一夜变天!

年初六&#xff0c;OpenAI发布了“文生视频”的工具&#xff0c;Sora。AI技术变革又一次震撼了整个世界。或许你又开始担心&#xff0c;AI发展那么快&#xff0c;将会取代自己。但请记住&#xff0c;危机时代也是变革时代&#xff0c;变革就是机会。开工第一天&#xff0c;相信…

新能源汽车整车测试解决方案-热管理测试

热管理测试&#xff08;Thermal Management Test&#xff09; 整车热管理主要研究对象是电驱动系统及电池系统的温度控制和驾驶室的气候调节&#xff0c;满足关键零部件的冷却要求&#xff0c;确保各零部件的安全性与可靠性&#xff0c;提高车厢内乘员环境的舒适性&#xff0c…

【机器学习】数据清洗——基于Pandas库的方法删除重复点

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

【全网首篇】Copyparty 路径遍历漏洞 CVE-2023-37474 漏洞分析

Copyparty是一个便携式文件服务器 Copyparty 路径遍历漏洞 CVE-2023-37474 漏洞分析&#xff0c;这个漏洞研究了一些时间&#xff0c;不过这个不难 漏洞复现分析环境 Copyparty测试版本&#xff1a;1.8.0和1.8.2 系统&#xff1a;Windows10 和 Linux 运行环境&#xff1a;…

Leetcode 283.移动零

给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: […

区块链革命:Web3如何改变我们的生活

随着技术的不断发展&#xff0c;区块链技术作为一种去中心化的分布式账本技术&#xff0c;正逐渐成为数字世界的核心。Web3作为区块链技术的重要组成部分&#xff0c;正在引领着数字化时代的变革&#xff0c;其影响已经开始渗透到我们生活的方方面面。本文将深入探讨区块链革命…

c# #if 与 Conditional属性宏的区别

测试代码 using System; using System.Diagnostics;namespace ConsoleApp1 {public class TestClass{[Conditional("Debug1")]public static void Func1(){Console.WriteLine("Conditional 宏");}public static void Func2(){ #if Debug2Console.WriteLin…

springboot当中使用EMQX(MQTT协议)

本篇博客主要围绕EMQX是什么&#xff1f;、能干什么&#xff1f;、怎么用&#xff1f; 三点来进行整理。 1、MQTT协议 1.1、MQTT简介 在了解EMQX前首先了解一下MQTT协议&#xff0c;MQTT 全称为 Message Queuing Telemetry Transport&#xff08;消息队列遥测传输&#xff0…

智慧城市驿站:智慧公厕升级版,打造现代化城市生活的便捷配套

随着城市化进程的加速&#xff0c;人们对城市生活质量的要求也越来越高。作为智慧城市建设的一项重要组成部分&#xff0c;多功能城市智慧驿站应运而生。它集合了信息技术、设计美学、结构工艺、系统集成、环保节能等多个亮点&#xff0c;将现代科技与城市生活相融合&#xff0…

qt for python创建UI界面

现在很多库都有用到python,又想使用QT creater创作界面&#xff0c;来使用。 1.使用的版本 使用虚拟机安装Ubuntu22.04&#xff0c;Ubuntu使用命令行安装qt,默认安装的是QT5&#xff0c;不用来回调了&#xff0c;就用系统默认的吧&#xff0c;不然安装工具都要费不少事情。pyt…

SimpleDateFormat为什么是线程不安全的?

目录 在日常开发中&#xff0c;Date工具类使用频率相对较高&#xff0c;大家通常都会这样写&#xff1a;这很简单啊&#xff0c;有什么争议吗&#xff1f;格式化后出现的时间错乱。看看Java 8是如何解决时区问题的&#xff1a;在处理带时区的国际化时间问题&#xff0c;推荐使用…

[力扣 Hot100]Day30 两两交换链表中的节点

题目描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 出处 思路 前两个结点先偷一手用交换val做&#xff0c;从链表第1…