深度学习处理时间序列(6)

news2025/5/31 20:36:43

RNN的高级用法

循环dropout(recurrent dropout)​:这是dropout的一种变体,用于在循环层中降低过拟合。

循环层堆叠(stacking recurrent layers)​:这会提高模型的表示能力(代价是更大的计算量)​。

双向循环层(bidirectional recurrent layer)​:它会将相同的信息以不同的方式呈现给RNN,可以提高精度并缓解遗忘问题。

我们将使用这3种方法来完善温度预测RNN.

利用循环dropout降低过拟合

我们回头来看基于LSTM的模型,它是第一个能够超越常识基准的模型。观察这个模型的训练曲线和验证曲线(图10-5)​,可以明显看出,尽管模型只有很少的单元,但很快就出现过拟合,训练损失和验证损失在几轮过后就开始明显偏离。你已经熟悉了降低过拟合的经典方法—dropout,即让某一层的输入单元随机为0,其目的是破坏该层训练数据中的偶然相关性。但如何在RNN中正确使用dropout,并不是一个简单的问题。人们早就知道,在循环层之前使用dropout会妨碍学习过程,而不会有助于正则化。2016年,Yarin Gal在他关于贝叶斯深度学习的博士论文中,确定了在RNN中使用dropout的正确方式:在每个时间步都应该使用相同的dropout掩码(相同模式的舍弃单元)​,而不是在不同的时间步使用随机变化的dropout掩码。此外,为了对GRU和LSTM等层的循环门得到的表示做正则化,还应该对该层的内部循环激活应用一个不随时间变化的dropout掩码(循环dropout掩码)​。在每个时间步使用相同的dropout掩码,可以让神经网络沿着时间传播其学习误差,而随时间随机变化的dropout掩码则会破坏这个误差信号,不利于学习过程。

Keras中的每个循环层都有两个与dropout相关的参数:一个是dropout,它是一个浮点数,指定该层输入单元的dropout比率;另一个是recurrent_dropout,指定循环单元的dropout比率。对于第一个LSTM示例,我们向LSTM层中添加循环dropout,看一下它对过拟合的影响,如代码清单10-22所示。由于使用了dropout,我们不需要过分依赖网络尺寸来进行正则化,因此我们将使用具有两倍单元个数的LSTM层,希望它的表示能力更强(如果不使用dropout,这个网络会马上开始过拟合,你可以试试看)​。由于使用dropout正则化的网络总是需要更长时间才能完全收敛,因此我们将模型训练轮数设为原来的5倍。

代码清单10-22 训练并评估一个使用dropout正则化的LSTM模型

inputs = keras.Input(shape=(sequence_length, raw_data.shape[-1]))
x = layers.LSTM(32, recurrent_dropout=0.25)(inputs)
x = layers.Dropout(0.5)(x)----这里在LSTM层之后还添加了一个Dropout层,对Dense层进行正则化
outputs = layers.Dense(1)(x)
model = keras.Model(inputs, outputs)

callbacks = [
    keras.callbacks.ModelCheckpoint("jena_lstm_dropout.keras",
                                    save_best_only=True)
]
model.compile(optimizer="rmsprop", loss="mse", metrics=["mae"])
history = model.fit(train_dataset,
                    epochs=50,
                    validation_data=val_dataset,
                    callbacks=callbacks)

模型结果如图10-11所示。成功!模型在前20轮中不再过拟合。验证MAE低至2.27摄氏度(比不使用机器学习的基准改进了7%)​,测试MAE为2.45摄氏度(比基准改进了6.5%)​,还不错

在这里插入图片描述

RNN的运行时性能

对于参数很少的循环模型(比如本章中的模型)​,在多核CPU上的运行速度往往比GPU上快很多,因为这种模型只涉及小矩阵乘法,而且由于存在for循环,因此乘法链无法很好地并行化。但较大的RNN则可以显著地受益于GPU运行时。使用默认关键字参数在GPU上运行Keras LSTM层或GRU层时,该层将利用cuDNN内核。这是由NVIDIA提供的低阶底层算法实现,它经过高度优化​。cuDNN内核有利有弊:速度快,但不够灵活。如果你想做一些默认内核不支持的操作,将会遭受严重的降速,这或多或少会迫使你坚持使用NVIDIA提供的操作。例如,LSTM和GRU的cuDNN内核不支持循环dropout,因此在层中添加循环dropout,会使运行时变为普通TensorFlow实现,这在GPU上的速度通常是原来的1/5~1/2(尽管计算成本相同)​。如果无法使用cuDNN,有一种方法可以加快RNN层的运行速度,那就是将RNN层展开(unroll)​。展开for循环是指去掉循环,将循环中的内容重复相应次。对于RNN的for循环,展开有助于TensorFlow对底层计算图进行优化。然而,这样做也会大大增加RNN的内存消耗,因此,它只适用于相对较小的序列(大约100个时间步或更少)​。另外请注意,只有当模型事先知道数据中的时间步数时(也就是说,向初始Input()传入的shape不包含None)​,才能使用这种方法。它的工作原理如下。

inputs = keras.Input(shape=(sequence_length, num_features))---- sequence_length不能是None
x = layers.LSTM(32, recurrent_dropout=0.2, unroll=True)(inputs)----传入unroll=True将该层展开

循环层堆叠

模型不再过拟合,但似乎遇到了性能瓶颈,所以我们应该考虑增加神经网络的容量和表示能力。回想一下机器学习的通用工作流程,增大模型容量通常是好的做法,直到过拟合成为主要障碍(假设你已经采取了基本措施来降低过拟合,比如使用dropout)​。只要过拟合不是太严重,那么模型就很可能容量不足。增加网络容量的通常做法是增加每层单元个数或添加更多的层。循环层堆叠是构建更加强大的循环网络的经典方法,比如,不久之前谷歌翻译算法就是7个大型LSTM层的堆叠—这个模型很大。在Keras中堆叠循环层,所有中间层都应该返回完整的输出序列(一个3阶张量)​,而不是只返回最后一个时间步的输出。前面说过,这可以通过指定return_sequences=True来实现。在下面这个示例中,我们尝试堆叠两个使用dropout正则化的循环层,如代码清单10-23所示。不同的是,我们将使用门控循环单元(gated recurrent unit,GRU)层代替LSTM层。GRU与LSTM非常类似,你可以将其看作LSTM架构的精简版本。它由Kyunghyun Cho等人于2014年提出,当时RNN刚刚开始在不大的研究群体中重新引起人们的兴趣。

代码清单10-23 训练并评估一个使用dropout正则化的堆叠GRU模型

inputs = keras.Input(shape=(sequence_length, raw_data.shape[-1]))
x = layers.GRU(32, recurrent_dropout=0.5, return_sequences=True)(inputs)
x = layers.GRU(32, recurrent_dropout=0.5)(x)
x = layers.Dropout(0.5)(x)
outputs = layers.Dense(1)(x)
model = keras.Model(inputs, outputs)

callbacks = [
    keras.callbacks.ModelCheckpoint("jena_stacked_gru_dropout.keras",
                                    save_best_only=True)
]
model.compile(optimizer="rmsprop", loss="mse", metrics=["mae"])
history = model.fit(train_dataset,
                    epochs=50,
                    validation_data=val_dataset,
                    callbacks=callbacks)
model = keras.models.load_model("jena_stacked_gru_dropout.keras")
print(f"Test MAE: {model.evaluate(test_dataset)[1]:.2f}")

模型结果如图10-12所示。测试MAE为2.39摄氏度(比基准改进了8.8%)​。可以看到,增加一层确实对结果有所改进,但效果并不明显。此时你可能会发现,增加网络容量的回报在逐渐减小。

在这里插入图片描述

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

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

相关文章

【鸿蒙5.0】向用户申请麦克风授权

#效果图 步骤 在 config.json 里声明权限:在项目的 config.json 文件中添加麦克风权限的声明,告知系统应用需要使用该权限。检查权限状态:在代码里检查应用是否已经获得了麦克风权限。请求权限:若应用未获得麦克风权限&#xff0…

【解决】导入PNG图片,转 Sprite 格式成功但资产未生效问题

开发平台:Unity 6.0 图片格式:.png   问题描述 当 PNG 成功转换为 Sprite(精灵)时,资产状态将显示扩展箭头,即表明该资产可 Sprite 使用。 解决方法:设置正确的 Sprite Mode Single 关于 Spr…

从DeepSeek到Qwen,AI大模型的移植与交互实战指南

在不久前发布的《技术实战 | OK3588-C开发板上部署DeepSeek-R1大模型的完整指南》一文中,小编为大家介绍了DeepSeek-R1在飞凌嵌入式OK3588-C开发板上的移植部署、效果展示以及性能评测,本篇文章不仅将继续为大家带来关于DeepSeek-R1的干货知识&#xff0…

SkyWalking+Springboot实战

1、下载SkyWalking APM 1.手动下载 Downloads | Apache SkyWalkinghttps://skywalking.apache.org/downloads/ 2.链接下载 https://dlcdn.apache.org/skywalking/10.2.0/apache-skywalking-apm-10.2.0.tar.gzhttps://dlcdn.apache.org/skywalking/10.2.0/apache-skywalking-…

org.apache.maven.surefire:surefire-junit-platform:jar:2.22.2 Maven打包失败

org.apache.maven.surefire:surefire-junit-platform:jar:2.22.2 解决办法 勾上这个,打包时跳过测试代码

在机器人和无人机时代,测绘人的出路在哪里?

一、技术革命:当测绘行业按下“加速键” 无人机与机器人技术正在重塑测绘行业的底层逻辑。传统测绘依赖人工作业,效率低、成本高且风险大,而无人机凭借其灵活性和高效性,已能快速完成大范围地形测绘,精度可达厘米级&a…

linux》》docker 、containerd 保存镜像、打包tar、加载tar镜像

Linux》》docker: 默认情况下,Docker镜像保存在/var/lib/docker/目录下。 当您使用docker pull命令从Docker Hub或私有镜像仓库中拉取镜像时,Docker会自动将镜像文件保存在/var/lib/docker/image/目录下。 每个镜像都由一个或多个层组成,这些…

DeepSeek+Kimi:PPT制作的效率革命

摘要:传统PPT制作面临模板选择困难、内容逻辑混乱、设计排版能力有限以及反复修改等问题。DeepSeek和Kimi两款AI工具的组合为PPT制作提供了全新的解决方案。DeepSeek擅长内容生成与逻辑推理,能够快速生成高质量的PPT大纲和内容;Kimi则专注于长…

电影交流|基于Java+vue的电影交流平台小程序系统(源码+数据库+文档)

电影交流平台 目录 基于SprinBootvue的电影交流平台小程序系统 一、前言 二、系统设计 三、系统功能设计 1用户信息管理 2 电影信息管理 3公告信息管理 4论坛信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&…

深度学习入门(二):从感知机到神经网络

文章目录 前言一个神经网络的例子激活函数登场3层神经网络的实现矩阵运算3层神经网络示意图符号定义第一层信号传递第二层信号传递第三层信号传递 代码实现实践:手写数字识别参考资料 前言 上一篇文章我们学习了感知机,因为它和神经网络有很多共同点&am…

AI三大主义 和 深度学习三大主义

在人工智能(AI)研究领域,"三大主义"通常指三种核心方法论或思想流派,它们代表了不同的技术路径和哲学观点。以下是主流的划分方式: 1. 符号主义(Symbolicism) 核心思想:智…

探索 Vue 中的多语言切换:<lang-radio /> 组件详解!!!

探索 Vue 中的多语言切换&#xff1a;<lang-radio /> 组件详解 &#x1f30d; 嗨&#xff0c;大家好&#xff01;&#x1f44b; 今天我们来聊聊如何在 Vue 项目中实现一个优雅的多语言切换功能——<lang-radio /> 组件。这是一个小而美的组件&#xff0c;出现在登…

搭建私人对外git空间

# 创建用户&#xff0c;指定不可登录的 Shell&#xff08;git-shell 或 /usr/sbin/nologin&#xff09; sudo adduser --system --shell /usr/bin/git-shell --group git # 验证用户配置 grep git /etc/passwd # 预期输出&#xff1a;git:x:998:998::/home/git:/usr/bin/git-s…

DeepSeek本地部署(linux)

一、下载并安装Ollama 1.下载Ollama Ollama官网:Ollama 点击"Download",会跳转至下载页面。 1.1在线下载安装 可复制此命令到Linux服务器进行在线下载,如下载速度过慢,可选择离线下载安装。 curl -fsSL https://ollama.com/install.sh | sh1.2离线下载安装 …

MySQL的基础语法1(增删改查、DDL、DML、DQL和DCL)

目录 一、基本介绍 二、SQL通用语法 三、SQL分类(DDL、DML、DQL、DCL) 1.DDL 1.1数据库操作 1.2表操作 1.2.1表操作-查询创建 1.2.2表操作-数据类型 1&#xff09;数值类型 2&#xff09;字符串类型 3&#xff09;日期时间类型​编辑 4&#xff09;表操作-案例 1.2.3…

Oracle数据库数据编程SQL<3.3 PL/SQL 游标>

游标(Cursor)是Oracle数据库中用于处理查询结果集的重要机制&#xff0c;它允许开发者逐行处理SQL语句返回的数据。 目录 一、游标基本概念 1. 游标定义 2. 游标分类 二、静态游标 &#xff08;一&#xff09;显式游标 【一】不带参数&#xff0c;普通的显示游标 1. 显式…

畅享电脑流畅运行:深度卸载、智能监视与空间释放

软件介绍 在数字化办公与娱乐高度融合的当下&#xff0c;电脑承载着我们诸多重要任务&#xff0c;然而&#xff0c;随着软件的频繁安装与卸载&#xff0c;系统逐渐被各种顽固软件及其残留 “拖垮”&#xff0c;运行速度变慢、磁盘空间告急等问题接踵而至。别愁&#xff0c;今天…

Visual Studio Code 无法打开源文件解决方法

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux &#x1f525; 系列专栏&#xff1a;C从入门到精通 目录 一&#xff1a;&#x1f525; 突发状况 二&#xff1a;&#x1f525; 共勉 一&#xff1a;&#x1f525; 突发状况 &#x1f42c;…

核函数(机器学习深度学习)

一、核函数的基本概念 核函数&#xff08;Kernel Function&#xff09; 是机器学习中处理非线性问题的核心工具&#xff0c;通过隐式映射将数据从原始空间转换到高维特征空间&#xff0c;从而在高维空间中实现线性可分或线性建模。其数学本质是计算两个样本在高维空间中的内积…

【工具】BioPred一个用于精准医疗中生物标志物分析的 R 软件包

介绍 R 语言包 BioPred 提供了一系列用于精准医疗中的亚组分析和生物标志物分析的工具。它借助极端梯度提升&#xff08;XGBoost&#xff09;算法&#xff0c;并结合倾向得分加权和 A 学习方法&#xff0c;帮助优化个体化治疗规则&#xff0c;从而简化亚组识别过程。BioPred 还…