【深度学习】常见模型-循环神经网络(Recurrent Neural Network, RNN)

循环神经网络(RNN)

概念简介

循环神经网络(Recurrent Neural Network, RNN)是一种用于处理序列数据(如时间序列、文本序列等)的神经网络模型。与传统神经网络不同,RNN 的结构具有记忆能力,可以通过隐状态(hidden state)对输入序列的上下文信息进行建模。它在自然语言处理(NLP)、语音识别、时间序列预测等领域中应用广泛。


核心特性

  1. 序列建模能力:能够捕捉输入数据的时间依赖性,适合处理具有时间或顺序关系的数据。
  2. 参数共享:在序列的每个时间步(time step)上,RNN 使用相同的权重矩阵进行计算。
  3. 循环结构:通过隐状态将过去的信息传递到当前时间步。

RNN 的基本计算过程为:

h_t = f(W_x x_t + W_h h_{t-1} + b)

其中:

  • h_t:当前时间步的隐状态。
  • x_t:当前时间步的输入。
  • W_x, W_h, b:权重矩阵和偏置。
  • f:激活函数(常用 tanh 或 ReLU)。

RNN 的局限性

  1. 梯度消失和梯度爆炸:在处理长序列时,误差梯度可能在反向传播过程中消失或爆炸,导致模型难以训练。
  2. 长时依赖问题:RNN 难以捕捉序列中相隔较远的依赖信息。

为解决这些问题,改进模型如 LSTM(长短期记忆网络)和 GRU(门控循环单元)被提出。


关键变体

  1. LSTM(Long Short-Term Memory)
    • 引入门机制(输入门、遗忘门和输出门)来选择性记忆或遗忘信息。
    • 能够更好地处理长序列依赖问题。
  2. GRU(Gated Recurrent Unit)
    • 是 LSTM 的简化版本,计算效率更高。

RNN 的结构

  1. 输入层:接收序列数据(如文本序列或时间序列)。
  2. 隐藏层:递归地将上一个时间步的状态作为当前时间步的输入。
  3. 输出层:根据任务需要输出预测结果(如分类、生成序列等)。

代码实现

以下是一个使用 Keras 实现简单 RNN 的示例:

1. 基本 RNN
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import SimpleRNN, Dense# 构建模型
model = Sequential([# RNN 层SimpleRNN(units=50, input_shape=(10, 1), activation='tanh'),# 全连接层Dense(units=1, activation='linear')  # 输出层
])# 编译模型
model.compile(optimizer='adam', loss='mse')
model.summary()

运行结果 

Model: "sequential"
_________________________________________________________________Layer (type)                Output Shape              Param #   
=================================================================simple_rnn (SimpleRNN)      (None, 50)                2600      dense (Dense)               (None, 1)                 51        =================================================================
Total params: 2651 (10.36 KB)
Trainable params: 2651 (10.36 KB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________

2. 使用 LSTM
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM
from tensorflow.keras.layers import Densemodel = Sequential([# LSTM 层LSTM(units=50, input_shape=(10, 1)),# 全连接层Dense(units=1, activation='linear')
])model.compile(optimizer='adam', loss='mse')
model.summary()

运行结果 

Model: "sequential"
_________________________________________________________________Layer (type)                Output Shape              Param #   
=================================================================lstm (LSTM)                 (None, 50)                10400     dense (Dense)               (None, 1)                 51        =================================================================
Total params: 10451 (40.82 KB)
Trainable params: 10451 (40.82 KB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________Process finished with exit code 0

3. 使用 GRU
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import GRU
from tensorflow.keras.layers import Densemodel = Sequential([# GRU 层GRU(units=50, input_shape=(10, 1)),# 全连接层Dense(units=1, activation='linear')
])model.compile(optimizer='adam', loss='mse')
model.summary()

 运行结果 

Model: "sequential"
_________________________________________________________________Layer (type)                Output Shape              Param #   
=================================================================gru (GRU)                   (None, 50)                7950      dense (Dense)               (None, 1)                 51        =================================================================
Total params: 8001 (31.25 KB)
Trainable params: 8001 (31.25 KB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________

应用场景

  1. 自然语言处理(NLP)

    • 机器翻译
    • 情感分析
    • 文本生成
    • 语法错误纠正
  2. 时间序列分析

    • 股票价格预测
    • 气象数据分析
    • 销售量预测
  3. 语音处理

    • 语音识别
    • 声音生成
  4. 视频分析

    • 动作识别
    • 视频字幕生成

优缺点

优点
  • 能够自然地处理序列数据。
  • 参数共享使其计算效率较高。
  • 灵活性强,适用于多种任务(分类、生成等)。
缺点
  • 对长序列的依赖建模能力有限。
  • 梯度消失和梯度爆炸问题需要额外的正则化或改进模型(如 LSTM 和 GRU)。

RNN 是深度学习中一类重要的神经网络,尤其在处理时间依赖性或顺序相关的数据方面表现出色。虽然其基本形式存在一些局限,但通过改进版本(如 LSTM 和 GRU)克服了这些问题,为解决复杂序列问题提供了强大的工具。

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

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

相关文章

Matlab总提示内存不够用,明明小于电脑内存

目录 前言情况1(改matlab最大内存限制)情况2(重启电脑)情况3 前言 在使用matlab中,有时候需要占用的内存并没有超过电脑内存依旧会报错,提示内存不够用,可以尝试下面几种方法,总有一…

数据结构(Java)——二叉树

1.概念 二叉树是一种树形数据结构,其中每个节点最多有两个子节点,通常被称为左子节点和右子节点。二叉树可以是空的(即没有节点),或者由一个根节点以及零个或多个左子树和右子树组成,其中左子树和右子树也分…

PyTest自学 - pytest夹具使用初步

<< 返回目录 1 PyTest自学 - pytest夹具使用初步 夹具可以为测试用例提供资源(测试数据)、执行预置条件、执行后置条件&#xff0c;夹具可以是函数、类或模块&#xff0c;使用pytest.fixture装饰器进行标记。 1.1 夹具的作用范围 夹具的作用范围&#xff1a; 函数范围…

Windows电脑上记录工作待办清单的工具用哪个?

在Windows电脑上记录日常工作待办清单的工具用哪一个比较好呢&#xff1f;想要工作效率高&#xff0c;借助Windows电脑上的待办清单工具&#xff0c;可以帮助大家快速完成各项任务&#xff0c;今天给大家盘点几款工作待办清单工具。 Windows自带的便笺Stickynotes Windows自…

H266/VVC 量化编码中 JCCR 技术

色度联合编码 JCCR VVC 支持色度分量联合编码(Joint Coding of Chroma Residual&#xff0c;JCCR)&#xff0c; 两个色度残差联合编码。通过 TU 的标志位 tu_joint_cbcr_residual_flag 指定该工 具&#xff0c;并通过 CBF 来隐式传输所选的模式。仅当 TU 的至少一个色度分量的 …

ZooKeeper 数据模型

ZooKeeper 数据模型 ZooKeeper 拥有层次化的命名空间&#xff0c;类似分布式文件系统&#xff0c;但每个节点不仅能有子节点&#xff0c;还可关联数据。节点路径为规范的绝对路径&#xff0c;用斜杠分隔&#xff0c;无相对引用。路径命名有如下约束&#xff1a; 路径名不能包…

云原生时代,如何构建高效分布式监控系统

文章目录 一.监控现状二.Thanos原理分析SidecarQuerierStoreCompactor 三.Sidecar or ReceiverThanos Receiver工作原理 四.分布式运维架构 一.监控现状 Prometheus是CNCF基金会管理的一个开源监控项目&#xff0c;由于其良好的架构设计和完善的生态&#xff0c;迅速成为了监控…

关于扫雷的自动补空实现C语言

关于扫雷的自动补空实现C语言 相信很多朋友在用C语言实现扫雷功能时&#xff0c;都想实现扫雷里面的的自动补足功能&#xff0c;但总是难以实现&#xff0c;在这里我将分享一种方法——递归思想 先看代码&#xff01; 位置在game.c //判断附近雷区并过滤空白区&#xff08;…

图形化数据报文转换映射工具

目录 概要整体架构流程技术名词解释技术细节小结 概要 在当今数字化时代&#xff0c;数据的处理和分析是企业、科研机构以及各类组织日常运营的核心环节。数据来源广泛&#xff0c;格式多样&#xff0c;常见的数据格式包括XML&#xff08;可扩展标记语言&#xff09;和JSON&a…

LINUX下设置分离状态(Detached State)和未设置分离状态的主要区别在于线程资源的管理方式和线程的生命周期。以下是两种状态的对比:

1. 设置分离状态&#xff08;Detached State&#xff09; 资源管理&#xff1a; 线程终止时&#xff0c;系统会自动释放与线程相关的所有资源&#xff08;如线程栈、线程控制块&#xff09;。不需要其他线程显式回收&#xff08;pthread_join&#xff09;。 线程生命周期&…

微前端qiankun的基本使用(vue-element-admin作为项目模版)

微前端qiankun的基本使用(vue-element-admin作为项目模版) qiankun架构特点主应用netmoni_master改造工程项目目录结构子项目配置:子应用注册配置项container:子应用挂载节点配置项activeRule:子应用路由子应用netmoni_child1改造目录结构项目配置:src/settings中配置子应…

使用PHP函数 “is_object“ 检查变量是否为对象类型

在PHP中&#xff0c;变量可以保存不同类型的值&#xff0c;包括整数、字符串、数组、布尔值等等。其中&#xff0c;对象是一种特殊的数据类型&#xff0c;用于封装数据和方法。在处理PHP代码中&#xff0c;我们经常需要检查一个变量是否为对象类型&#xff0c;以便进行相应的处…

DAY3,模拟终端

题目 实现一个终端的功能&#xff0c;注意需要带有cd功能 思路 如何 C语言执行shell命令&#xff1f; 使用进程替换exec函数&#xff1b;&#xff1b;使用system函数。 如何 切换工作目录&#xff1f; 使用chdir函数切换工作目录。 其…

一键视频转文字/音频转文字,浏览器右键提取B站视频文案,不限时长免费无限次可用

上篇文章阿虚分享了自己的「短视频」笔记方案 短视频文件小&#xff0c;易存储&#xff0c;所以阿虚建议是直接将原视频插入到笔记当中 而长视频文件大&#xff0c;很难像短视频一样操作。阿虚之前的建议是提取重要部分视频转长截图&#xff0c;或者视频转GIF 但上述方案仔细…

【C++】详细讲解继承(上)

C面向对象的三大特性&#xff1a;封装&#xff0c;继承&#xff0c;多态。现在我们就介绍一下继承。 1.继承的概念及定义 1.1 继承的概念 继承机制是⾯向对象程序设计使代码可以 复⽤ 的最重要的⼿段。我们前面接触到的都是 函数 层次的复用&#xff0c;遇到过的 类 层次的复…

AIGC专栏18——EasyAnimateV5.1版本详解 应用Qwen2 VL作为文本编码器,支持轨迹控制与相机镜头控制

AIGC专栏18——EasyAnimateV5.1版本详解 应用Qwen2 VL作为文本编码器&#xff0c;支持轨迹控制与相机镜头控制 学习前言相关地址汇总源码下载地址HF测试链接MS测试链接 测试效果Image to VideoText to Video轨迹控制镜头控制 EasyAnimate详解技术储备Qwen2 VLStable Diffusion …

1905电影网中国地区电影数据分析(一) - 数据采集、清洗与存储

文章目录 前言一、数据采集步骤及python库使用版本1. python库使用版本2. 数据采集步骤 二、数据采集网页分析1. 分析采集的字段和URL1.1 分析要爬取的数据字段1.2 分析每部电影的URL1.2 分析每页的URL 2. 字段元素标签定位 三、数据采集代码实现1. 爬取1905电影网分类信息2. 爬…

【25】Word:林涵-科普文章❗

目录 题目​ NO1.2.3 NO4.5.6 NO7.8 NO9.10 NO11.12 不连续选择&#xff1a;按住ctrl按键&#xff0c;不连续选择连续选择&#xff1a;按住shift按键&#xff0c;选择第一个&#xff0c;选择最后一个。中间部分全部被选择 题目 NO1.2.3 布局→纸张方向&#xff1a;横向…

C语言二级

//请编写函数fun()&#xff0c;该函数的功能是&#xff1a;计算并输出给定整数n的所有因 //子&#xff08;不包括1和自身&#xff09;之和。规定n的值不大于1000。例如&#xff0c;在主函数 //中从键盘给n输入的值为856&#xff0c;则输出为&#xff1a;sum 763。 //注意&…

P6周:VGG-16算法-Pytorch实现人脸识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 我的环境 语言环境&#xff1a;Python 3.8.12 编译器&#xff1a;jupyter notebook 深度学习环境&#xff1a;torch 1.12.0cu113 一、前期准备 1.设置GPU im…