程序员学长 | 快速学会一个算法,RNN

本文来源公众号“程序员学长”,仅用于学术分享,侵权删,干货满满。

原文链接:快速学会一个算法,RNN

今天给大家分享一个超强的算法模型,RNN

循环神经网络(Recurrent Neural Network, RNN)是一种专门用于「处理序列数据的神经网络」

由于其能够处理不同长度的输入序列,并保持过去信息的能力,它广泛应用于自然语言处理、语音识别和时间序列预测等领域

RNN的算法原理

RNN 的核心思想是使用循环的连接结构来保持对之前处理过的信息的记忆。

这种记忆通过隐藏层的状态来表达,每个时间步的隐藏状态都依赖于前一时间步的隐藏状态和当前时间步的输入。这种结构使得 RNN 能够捕获时间序列数据中的动态变化特性。

RNN 的问题

循环神经网络(RNN)虽然在处理序列数据方面具有明显优势,但在实际应用中遇到了几个关键问题,特别是梯度消失和梯度爆炸问题。这些问题直接影响了网络的训练效率和性能,进而催生了长短时记忆网络(LSTM)和门控循环单元(GRU)这两种更为高效的RNN变体。

  1. 梯度消失

    在 RNN 中,当网络层较多或者处理的序列数据较长时,由于梯度在反向传播过程中反复乘以小于1的数(如激活函数的导数),导致梯度逐渐变小,最终接近于零。这会使得网络中的权重无法有效更新,特别是序列前端的权重,从而难以捕捉到序列中早期的重要信息。

  2. 梯度爆炸

    与梯度消失相反,梯度爆炸是指在反向传播过程中梯度逐渐变得非常大,这通常发生在权重值较大时。梯度爆炸会导致网络权重的大幅波动,使得训练过程变得不稳定,甚至导致数值计算溢出。

  3. 难以捕捉长期依赖

    由于梯度消失和梯度爆炸的问题,「标准的 RNN 在处理长序列时难以学习到输入序列中的长距离依赖关系」。这意味着网络难以记忆并利用序列中早期的信息来影响后续的输出,这对于许多需要理解整个输入序列上下文的任务来说是一个大问题,如语言翻译、文本生成等。

为了解决这些问题,研究者们开发了 LSTM 和 GRU 这两种特殊类型的RNN。

RNN 变体

LSTM

LSTM(Long Short-Term Memory)是一种特殊类型的循环神经网络(RNN),「专门设计用来解决传统 RNN 在处理序列数据时面临的长期依赖问题」

LSTM 的关键特征是其维持细胞状态的能力,「细胞状态充当可以存储长序列信息的记忆单元」。这使得 LSTM 能够随着时间的推移选择性地记住或忘记信息,使它们非常适合上下文和远程依赖性至关重要的任务。

图片

LSTM 的核心组件

LSTM 的关键在于其内部状态(cell state)和三个重要的门控机制:输入门、遗忘门和输出门。这些门控制着信息的流入、更新和流出,使 LSTM 能够在必要时保存信息跨越多个时间步,或者丢弃不再需要的信息。

GRU

门控循环单元(Gated Recurrent Unit, GRU)旨在简化长短时记忆网络(LSTM)的结构,同时保持对长期依赖信息的捕捉能力。

GRU 对比 LSTM 的主要区别在于「其结构更简单,参数更少,这使得 GRU 在某些情况下训练更快,计算效率更高。」

GRU的核心组件

GRU 将 LSTM 中的三个门控合并为两个门控,即更新门(update gate)和重置门(reset gate)。

这两个门控决定了信息是如何在单元间传递的,帮助网络捕捉时间序列中的长距离依赖。

案例分享

下面我们来使用 RNN、GRU 和 LSTM 进行苹果股价的预测。

import yfinance as yf
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout,SimpleRNN,GRU# 获取苹果公司的股票数据
data = yf.download('AAPL', start='2018-01-01', end='2023-01-01')# 使用收盘价
close_prices = data['Close'].values.reshape(-1, 1)# 数据归一化
scaler = MinMaxScaler(feature_range=(0, 1))
close_prices = scaler.fit_transform(close_prices)# 划分数据集为训练集和测试集
split = int(0.8 * len(close_prices))
train = close_prices[:split]
test = close_prices[split:]# 创建序列数据集
def create_dataset(data, steps):X, y = [], []for i in range(len(data) - steps):X.append(data[i:(i + steps), 0])y.append(data[i + steps, 0])return np.array(X), np.array(y)
steps = 60
X_train, y_train = create_dataset(train, steps)
X_test, y_test = create_dataset(test, steps)# 重塑输入以符合 RNN 模型的期望格式 [样本数, 时间步, 特征数]
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))# 构建 LSTM 模型
model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], 1)))
model.add(LSTM(units=50))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(X_train, y_train, epochs=50, batch_size=32, verbose=1)# 构建 RNN 模型
model_rnn = Sequential()
model_rnn.add(SimpleRNN(units=50, return_sequences=True, input_shape=(X_train.shape[1], 1)))
model_rnn.add(SimpleRNN(units=50))
model_rnn.add(Dense(1))
model_rnn.compile(optimizer='adam', loss='mean_squared_error')
model_rnn.fit(X_train, y_train, epochs=50, batch_size=32, verbose=1)# 构建 GRU 模型
model_gru = Sequential()
model_gru.add(GRU(units=50, return_sequences=True, input_shape=(X_train.shape[1], 1)))
model_gru.add(GRU(units=50))
model_gru.add(Dense(1))
model_gru.compile(optimizer='adam', loss='mean_squared_error')
model_gru.fit(X_train, y_train, epochs=50, batch_size=32, verbose=1)

接下来,我们来看一下预测的结果。

# LSTM 预测
predicted_stock_price_lstm = model.predict(X_test)
predicted_stock_price_lstm = scaler.inverse_transform(predicted_stock_price_lstm)# RNN 预测
predicted_stock_price_rnn = model_rnn.predict(X_test)
predicted_stock_price_rnn = scaler.inverse_transform(predicted_stock_price_rnn)# GRU 预测
predicted_stock_price_gru = model_gru.predict(X_test)
predicted_stock_price_gru = scaler.inverse_transform(predicted_stock_price_gru)# 绘图
plt.figure(figsize=(14, 5))
plt.plot(real_stock_price, color='red', label='Real Apple Stock Price')
plt.plot(predicted_stock_price_lstm, color='blue', label='Predicted Apple Stock Price (LSTM)')
plt.plot(predicted_stock_price_rnn, color='green', label='Predicted Apple Stock Price (RNN)')
plt.plot(predicted_stock_price_gru, color='purple', label='Predicted Apple Stock Price (GRU)')
plt.title('Apple Stock Price Prediction Comparison')
plt.xlabel('Time')
plt.ylabel('Apple Stock Price')
plt.legend()
plt.show()

THE END !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

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

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

相关文章

不花一分钱也能制作出高质量的宣传册

在当今竞争激烈的市场环境中,拥有一份高质量的宣传册对于企业或个人来说至关重要。它能帮助您在客户心中留下深刻印象,有效推广您的品牌或服务。但聘请专业设计师和印刷商制作宣传册往往需要不小的开支。那么,有没有既省钱又能做出高质量宣传…

flask水质监测预警系统-计算机毕业设计源码10148

摘 要 近些年来,对河道水位进行实时、准确的监测越来越受到广大人民群众的重视。然而要建立一个稳定的、可靠地、准确的城市河道水位远程监测系统,就必须要解决由人工监测向自动化监测的转变,使用新科技来进行设计。水质监测预警系统是以实际…

ardupilot开发 --- 坐标变换 篇

Good Morning, and in case I dont see you, good afternoon, good evening, and good night! 0. 一些概念1. 坐标系的旋转1.1 轴角法1.2 四元素1.3 基于欧拉角的旋转矩阵1.3.1 单轴旋转矩阵1.3.2 多轴旋转矩阵 2. 齐次变换矩阵3. visp实践 0. 一些概念 相关概念:旋…

charls抓包工具 mumu模拟器抓包apk

1.先安装mumu 官网添加链接描述 2.配置 设置,点进互联网,点编辑,选择手动代理 主机名写自己电脑的ip地址,端口随便,只要不被占用,一般参考其他人都是8888 3.下载charls 参考这个添加链接描述 先官网…

项目验收测试有必要找第三方软件测试机构吗?

在当今信息技术飞速发展的时代,软件测试成为了确保软件质量的重要环节。而在项目的验收测试中,很多企业都面临一个问题,那就是是否有必要找第三方软件测试机构进行验收测试?今天,我们就来探讨一下这个问题。 第三方软件测试机构…

【别再用Excel了!】这款免费可视化工具能帮你轻松提升效率

现代数据分析和展示的需求已经远远超出了传统工具的能力,尤其是在需要快速、直观和高效地处理复杂数据的情况下。山海鲸可视化通过其强大的功能和易用性,成为了设计师以及各类新手用户的理想选择。下面我就以一个可视化设计师的角度,和大家简…

2024年6月计算机视觉论文推荐:扩散模型、视觉语言模型、视频生成等

6月还有一周就要结束了,我们今天来总结2024年6月上半月发表的最重要的论文,重点介绍了计算机视觉领域的最新研究和进展。 Diffusion Models 1、Autoregressive Model Beats Diffusion: Llama for Scalable Image Generation LlamaGen,是一个…

合合信息智能文档抽取:赋能不良资产管理行业的数字化转型

官.网地址:合合TextIn - 合合信息旗下OCR云服务产品 随着数字化浪潮的汹涌澎湃,全球各行各业正经历着前所未有的变革。人工智能技术的快速发展,以其独特的创新能力和应用潜力,正在深刻地改变着业务模式,推动产业效率的…

把动漫幻想变为现实:一键生成真实图像,让你的动漫梦想成为现实!

大家好我是安琪!你能想到一个动漫图片可以转换成真实图像吗?其实,这就是所谓的漫改真人。有很多非常出名的动漫画或者动漫剧,改成由真人去饰演,就叫做漫改影视。 对于很多的动漫爱好者来说,如果一部漫改影…

css控制整个div下的所有元素中的文字放大缩小

css控制文字放大缩小 话不多说,直接上代码,我用了最简单粗暴的方法,找个下面所有的元素,然后遍历放大所有文字 add() {var div this.$refs[myDiv];var elements div.querySelectorAll("*");for (var i 0; i < elements.length; i) {var fontSize parseInt(win…

还不到6个月,GPTs黄了

相比起来&#xff0c;人们还不如使用一个足够强大、灵活且通用的AI助手来满足各类复杂需求。更严重的是一些独立GPTs显露出的安全隐患。除此之外&#xff0c;最大的问题在于OpenAI模糊不清的货币化政策。 文章正文 上周&#xff0c;不少人发现微软官网忽然更新了一条“GPT Bu…

深度解析拆分盘到底是怎样的运行逻辑!

一、引言 在数字经济的蓬勃发展中&#xff0c;拆分盘投资方式逐渐崭露头角&#xff0c;引起了广大投资者的关注。不同于传统的投资模式&#xff0c;拆分盘以其独特的拆分策略&#xff0c;为投资者提供了一种看似能够持续增值的新途径。本文将深入探讨拆分盘的基本原理、运作实…

BW:CP里添加信息对象小问题记录

之前做视图直接添加进CP里&#xff0c;以为不能直接往CP里加信息对象&#xff0c;还专门建了一个带信息对象的模型&#xff0c;把信息对象拖到CP里&#xff0c;然后再链接视图的字段 今天发现原来不用这样&#xff0c;直接加就可以&#xff0c;小记一下 如图直接诶创建&#x…

Linux驱动开发-02字符设备驱动开发初步

一、驱动开发的前期准备 在进入驱动开发之前&#xff0c;需要烧写UBoot、内核、设备树&#xff0c;做一些前期的准备工作&#xff0c;确保我们开发板上的内核版本和Ubuntu上是一致的才能进行正式开发 1.U-Boot 2.内核版本 3.使用TFTP挂载的内核和设备树 二、Linux驱动开发与裸机…

记一次elementui时间线的实现

实现效果 点击展开&#xff0c;每次累加五条数据进行展示 实现思路 起始本质上就是一个分页查询&#xff0c;只不过按新的形式展示&#xff0c;然后也不统计总数&#xff0c;每次只展示固定的5条数据点击加载更多&#xff0c;就展示下一页&#xff0c;页的页数进行1&#xff…

ONLYOFFICE 文档 8.1 发布:重塑文档处理

官网链接&#xff1a;ONLYOFFICE官网 一、PDF编辑器功能强大&#xff1a;创造跟随想象 在追求无界办公与高效创作的今天&#xff0c;ONLYOFFICE再次引领风潮&#xff0c;正式发布了其桌面编辑器的最新版本——ONLYOFFICE桌面编辑器8.1。这一版本不仅巩固了其作为顶级办公套件…

python3使用ast.parse详解

使用ast库分析python3脚本, 并对脚本进行一些处理, 比如注释pirnt语句 一.基础知识 官方网址连接 ast — Abstract Syntax Trees ast库可以方便的分析python代码结构, 并做一些处理, 很适合对大量脚本文件做批量处理, 比如把print语句全部注释等. 直观的打印出代码结构 impo…

简述Java项目中VO,BO,PO,DO,DTO之类的文件概念、易混点

VO&#xff0c;BO&#xff0c;PO&#xff0c;DO&#xff0c;DTO 概念易混点一&#xff1a;VO和DTO- 让我们通过一个实例来阐释DTO和VO的概念及其应用差异&#xff1a;小结&#xff1a;VO专注于展示&#xff0c;而DTO则用于数据的传输和业务逻辑的处理。 二&#xff1a;BO和PO小…

公益培训|半导体与集成电路项目制培训项目

关于我们 硬蛋产业学院&#xff0c;基于硬蛋创新(http://00400.HK)在芯片产业的资源和技术优势&#xff0c;引进全球领先的芯片应用技术&#xff0c;为国内培养芯片应用技术人才&#xff0c;助力芯片应用产业发展。 硬蛋产业学院在国家各主管部门、广东省、深圳市及社会各界的大…

AI 激发算力需求暴增,施耐德电气解码智算中心发展

随着全球碳达峰目标的持续推进&#xff0c;各行各业都在加速绿色转型的步伐&#xff0c;尤其是高耗能产业更是备受关注。人工智能行业以其迅猛的发展速度令人瞩目&#xff0c;它所带来的不仅是算力需求的飙升&#xff0c;更是日益凸显的能耗问题。 目前&#xff0c;人工智能预…