神经网络——循环神经网络(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.hqwc.cn/news/478656.html

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

相关文章

云原生概念

云原生是一条使用户能: 1.低运维、 2.敏捷的、 3.以可扩展、可复制的方式, 最大化的利用”云“的能力、发挥”云“的价值的最 佳路径 云原生,是一条最佳路径或实践 参考:https://edu.aliyun.com/course/314164/lesson/7815

168基于matlab的六自由度并联摇摆台的反解控制算法

基于matlab的六自由度并联摇摆台的反解控制算法,stewart平台,配有GUI界面,可以自定义角度,杆长等参数。设定动平台位姿即能得到电机参数。程序已调通,可直接运行。 168 六自由度并联摇摆台 反解控制算法 (xiaohongshu.…

智慧城市与数字孪生:实现城市可持续发展的关键

一、引言 随着全球城市化进程的加速,城市面临着诸多挑战,如资源紧张、环境恶化、交通拥堵等。为了解决这些问题,智慧城市的概念应运而生。智慧城市利用先进的信息通信技术,提升城市治理水平,改善市民的生活质量。而数…

基于Java SSM框架实现网上拍卖系统项目【项目源码】

基于java的SSM框架实现网上拍卖系统演示 JSP技术介绍 JSP技术本身是一种脚本语言,但它的功能是十分强大的,因为它可以使用所有的JAVA类。当它与JavaBeans 类进行结合时,它可以使显示逻辑和内容分开,这就极大的方便了用户的需求。…

在springboot项目中调用openai API及我遇到的问题

这两天我在自己的网站中集成了openai API,引入chatgpt对话机器人,中途遇到了很多坑,记录一下。文章中会涉及一些付费工具,如果你有类似功能的工具,完全可以使用自己的。(主要是我想澄清一下,我不…

hot100 -- 滑动窗口

目录 🌼无重复字符 -- 最长子串 AC 滑动窗口(桶) 🌼所有字母异位词 AC 滑动窗口 桶 AC 滑动窗口(优化) 🌼无重复字符 -- 最长子串 一开始考虑用 BF暴力 或者 KMP 的,后来想…

彻底解决pycharm中的Python解释器重复-无法重命名和删除不干净的问题

Python解释器重复-无法重命名和删除 问题及原因:PyCharm在删除解释器配置时,并没有完全清除所有相关的配置信息,特别是关于解释器命名的部分。这可能导致即使删除了旧的解释器配置,PyCharm仍然“记住”了之前的命名序号&#xff…

log4j2的使用

基础用法 1. pom文件导入依赖 junit用来做测试 <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.5</version></dependency><dependency><groupId>org.…

《Arthas》--问题定位神器--常用指令一图全知

阿丹&#xff1a; 因为一个图太大&#xff0c;直接放出来影响观看&#xff0c;我给他们分开来。 图中关键标识&#xff1a; 基础命令&#xff1a; class相关 jvm相关 字节码增强 ArtHas 基础命令 help 查看命令帮助信息 cls 清空当前屏幕区域 session 查看当前会话的信息 …

vulhub中Apache Log4j Server 反序列化命令执行漏洞复现(CVE-2017-5645)

Apache Log4j是一个用于Java的日志记录库&#xff0c;其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码。 1.我们使用ysoserial生成payload&#xff0c;然后直接发送给your-ip:4712端口即可。 java -jar ysoserial-…

【FastAPI】P3 请求与响应

目录 请求路径参数查询参数 响应JSON 响应文本响应返回 Pydantic 模型 在网络通讯中&#xff0c;请求&#xff08;Request&#xff09; 与 响应&#xff08;Response&#xff09; 扮演着至关重要的角色&#xff0c;它们构成了客户端与服务器间互动的根本理念。 请求&#xff0…

数据结构day1

定义一个学生结构体&#xff0c;包含结构体成员&#xff1a;身高&#xff0c;姓名&#xff0c;成绩&#xff1b;定义一个结构体数组有7个成员&#xff0c;要求终端输入结构体成员的值&#xff0c;根据学生成绩&#xff0c;进行冒泡排序。 #include <stdio.h> #include &l…