【重新定义matlab强大系列十七】Matlab深入浅出长短期记忆神经网络LSTM

🔗 运行环境:Matlab

🚩 撰写作者:左手の明天

🥇 精选专栏:《python》

🔥  推荐专栏:《算法研究》

#### 防伪水印——左手の明天 ####

💗 大家好🤗🤗🤗,我是左手の明天!好久不见💗

💗今天更新系列——重新定义matlab强大系列💗

📆  最近更新:2024 年 03 月 09 日,左手の明天的第 316 篇原创博客

📚 更新于专栏:matlab

#### 防伪水印——左手の明天 ####


 本文主要说明如何使用长短期记忆 (LSTM) 神经网络处理分类和回归任务的序列和时间序列数据。有关如何使用 LSTM 神经网络对序列数据进行分类的示例,请参阅:

【深度学习】详解利用Matlab和Python中 LSTM 网络实现序列分类

【Python深度学习】详解Python深度学习进行时间序列预测

【Python机器学习】详解Python机器学习进行时间序列预测

【Matlab深度学习】详解matlab深度学习进行时间序列预测


一、LSTM 神经网络架构

LSTM 神经网络是一种循环神经网络 (RNN),可以学习序列数据的时间步之间的长期依存关系。LSTM 神经网络的核心组件是序列输入层和 LSTM 层。序列输入层将序列或时间序列数据输入神经网络中。LSTM 层学习序列数据的时间步之间的长期相关性。

下图说明用于分类的简单 LSTM 网络的架构。该神经网络从一个序列输入层开始,后跟一个 LSTM 层。为了预测类标签,该神经网络的末尾是一个全连接层、一个 softmax 层和一个分类输出层。

下图说明用于回归的简单 LSTM 神经网络的架构。该神经网络从一个序列输入层开始,后跟一个 LSTM 层。该神经网络的末尾是一个全连接层和一个回归输出层。

下图说明用于视频分类的神经网络的架构。要将图像序列输入到神经网络,请使用序列输入层。要使用卷积层来提取特征,也就是说,要将卷积运算独立地应用于视频的每帧,请使用一个序列折叠层,后跟一个卷积层,然后是一个序列展开层。要使用 LSTM 层从向量序列中学习,请使用一个扁平化层,后跟 LSTM 层和输出层。


二、LSTM 层架构

以下是数据流通过 LSTM 层的示意图,其中输入为 x、输出为 y、时间步数为 T。在图中,ht 表示在时间步 t 的输出(也称为隐藏状态),ct 表示在该时间步的单元状态

如果层输出完整序列,则它输出 y1、…、yT,等效于 h1、…、hT。如果该层仅输出最后一个时间步,则该层输出 yT,等效于 hT。输出中的通道数量与 LSTM 层的隐藏单元数量匹配。

第一个 LSTM 运算使用 RNN 的初始状态和序列的第一个时间步来计算第一个输出和更新后的单元状态。在时间步 t 上,该运算使用 RNN 的当前状态 (ct−1,ht−1) 和序列的下一个时间步来计算输出和更新后的单元状态 ct。

该层的状态由隐藏状态(也称为输出状态)和单元状态组成。时间步 t 处的隐藏状态包含该时间步的 LSTM 层的输出。单元状态包含从前面的时间步中获得的信息。在每个时间步,该层都会在单元状态中添加或删除信息。该层使用不同的控制这些更新。

以下组件控制层的单元状态和隐藏状态。

组件目的
输入门 (i)控制单元状态更新的级别
遗忘门 (f)控制单元状态重置(遗忘)的级别
候选单元 (g)向单元状态添加信息
输出门 (o)控制添加到隐藏状态的单元状态的级别

下图说明在时间步 t 上的数据流。此图显示门如何遗忘、更新和输出单元状态和隐藏状态。

LSTM 层的可学习权重包括输入权重 W (InputWeights)、循环权重 R (RecurrentWeights) 以及偏置 b (Bias)。矩阵 W、R 和 b 分别是输入权重、循环权重和每个分量的偏置的串联。该层根据以下方程串联矩阵:

其中 i、f、g、o 分别表示输入门、遗忘门、候选单元和输出门。

时间步 t 处的单元状态由下式给出:

其中 ⊙ 表示哈达玛乘积(向量的按元素乘法)。

时间步 t 处的隐藏状态由下式给出:

其中 σc 表示状态激活函数。默认情况下,lstmLayer 函数使用双曲正切函数 (tanh) 计算状态激活函数。

以下公式说明时间步 t 处的组件。

这些计算中,σg 表示门激活函数。默认情况下,lstmLayer 函数使用 

给出的 sigmoid 函数来计算门激活函数。


三、LSTM网络种类

3.1 分类 LSTM 网络

要创建针对“序列到标签”分类的 LSTM 网络,请创建一个层数组,其中包含一个序列输入层、一个 LSTM 层、一个全连接层、一个 softmax 层和一个分类输出层。

将序列输入层的大小设置为输入数据的特征数量。将全连接层的大小设置为类的数量。您不需要指定序列长度。

对于 LSTM 层,指定隐含单元的数量和输出模式 'last'

numFeatures = 12;
numHiddenUnits = 100;
numClasses = 9;
layers = [ ...sequenceInputLayer(numFeatures)lstmLayer(numHiddenUnits,'OutputMode','last')fullyConnectedLayer(numClasses)softmaxLayerclassificationLayer];

要针对“序列到序列”分类创建一个 LSTM 网络,请使用与“序列到标签”分类相同的架构,但将 LSTM 层的输出模式设置为 'sequence'

numFeatures = 12;
numHiddenUnits = 100;
numClasses = 9;
layers = [ ...sequenceInputLayer(numFeatures)lstmLayer(numHiddenUnits,'OutputMode','sequence')fullyConnectedLayer(numClasses)softmaxLayerclassificationLayer];

3.2 回归 LSTM 网络

要针对“序列到单个”回归创建一个 LSTM 网络,请创建一个层数组,其中包含一个序列输入层、一个 LSTM 层、一个全连接层和一个回归输出层。

将序列输入层的大小设置为输入数据的特征数量。将全连接层的大小设置为响应的数量。不需要指定序列长度。

对于 LSTM 层,指定隐含单元的数量和输出模式 'last'

numFeatures = 12;
numHiddenUnits = 125;
numResponses = 1;layers = [ ...sequenceInputLayer(numFeatures)lstmLayer(numHiddenUnits,'OutputMode','last')fullyConnectedLayer(numResponses)regressionLayer];

要针对“序列到序列”回归创建一个 LSTM 网络,请使用与“序列到单个”回归相同的架构,但将 LSTM 层的输出模式设置为 'sequence'

numFeatures = 12;
numHiddenUnits = 125;
numResponses = 1;layers = [ ...sequenceInputLayer(numFeatures)lstmLayer(numHiddenUnits,'OutputMode','sequence')fullyConnectedLayer(numResponses)regressionLayer];

3.3 视频分类网络

要针对包含图像序列的数据(如视频数据和医学图像)创建一个深度学习网络,请使用序列输入层指定图像序列输入。

要使用卷积层来提取特征,也就是说,要将卷积运算独立地应用于视频的每帧,请使用一个序列折叠层,后跟一个卷积层,然后是一个序列展开层。要使用 LSTM 层从向量序列中学习,请使用一个扁平化层,后跟 LSTM 层和输出层。

inputSize = [28 28 1];
filterSize = 5;
numFilters = 20;
numHiddenUnits = 200;
numClasses = 10;layers = [ ...sequenceInputLayer(inputSize,'Name','input')sequenceFoldingLayer('Name','fold')convolution2dLayer(filterSize,numFilters,'Name','conv')batchNormalizationLayer('Name','bn')reluLayer('Name','relu')sequenceUnfoldingLayer('Name','unfold')flattenLayer('Name','flatten')lstmLayer(numHiddenUnits,'OutputMode','last','Name','lstm')fullyConnectedLayer(numClasses, 'Name','fc')softmaxLayer('Name','softmax')classificationLayer('Name','classification')];

将这些层转换为一个层图,并将序列折叠层的 miniBatchSize 输出连接到序列展开层的对应输入。

lgraph = layerGraph(layers);
lgraph = connectLayers(lgraph,'fold/miniBatchSize','unfold/miniBatchSize');

3.4 更深的 LSTM 网络

可以通过在 LSTM 层之前插入具有输出模式 'sequence' 的额外 LSTM 层来加大 LSTM 网络的深度。为了防止过拟合,可以在 LSTM 层后插入丢弃层。

对于“序列到标签”分类网络,最后一个 LSTM 层的输出模式必须为 'last'

numFeatures = 12;
numHiddenUnits1 = 125;
numHiddenUnits2 = 100;
numClasses = 9;
layers = [ ...sequenceInputLayer(numFeatures)lstmLayer(numHiddenUnits1,'OutputMode','sequence')dropoutLayer(0.2)lstmLayer(numHiddenUnits2,'OutputMode','last')dropoutLayer(0.2)fullyConnectedLayer(numClasses)softmaxLayerclassificationLayer];

对于“序列到序列”分类网络,最后一个 LSTM 层的输出模式必须为 'sequence'

numFeatures = 12;
numHiddenUnits1 = 125;
numHiddenUnits2 = 100;
numClasses = 9;
layers = [ ...sequenceInputLayer(numFeatures)lstmLayer(numHiddenUnits1,'OutputMode','sequence')dropoutLayer(0.2)lstmLayer(numHiddenUnits2,'OutputMode','sequence')dropoutLayer(0.2)fullyConnectedLayer(numClasses)softmaxLayerclassificationLayer];

四、网络层

描述
sequenceInputLayer序列输入层向神经网络输入序列数据并应用数据归一化。

lstmLayer

LSTM 层是一个 RNN 层,该层学习时间序列和序列数据中时间步之间的长期相关性。

bilstmLayer

双向 LSTM (BiLSTM) 层是一个 RNN 层,该层学习时间序列或序列数据的时间步之间的双向长期相关性。当您希望 RNN 在每个时间步从完整时间序列中学习时,这些相关性会很有用。
gruLayerGRU 层是一个 RNN 层,它学习时间序列和序列数据中时间步之间的相关性。
convolution1dLayer一维卷积层将滑动卷积滤波器应用于一维输入。
maxPooling1dLayer一维最大池化层通过将输入划分为一维池化区域并计算每个区域的最大值来执行下采样。
averagePooling1dLayer一维平均池化层通过将输入划分为若干一维池化区域,然后计算每个区域的平均值来执行下采样。
globalMaxPooling1dLayer一维全局最大池化层通过输出输入的时间或空间维度的最大值来执行下采样。
sequenceFoldingLayer序列折叠层将一批图像序列转换为一批图像。使用序列折叠层独立地对图像序列的时间步执行卷积运算。
sequenceUnfoldingLayer序列展开层在序列折叠后还原输入数据的序列结构。
flattenLayer扁平化层将输入的空间维度折叠成通道维度。

wordEmbeddingLayer(Text Analytics Toolbox)

单词嵌入层将单词索引映射到向量。

五、序列处理

5.1 按长度对序列排序

要在填充或截断序列时减少填充或丢弃的数据量,请尝试按序列长度对数据进行排序。要按序列长度对数据进行排序,首先使用 cellfun 对每个序列应用 size(X,2) 来获得每个序列的列数。然后使用 sort 对序列长度进行排序,并使用第二个输出对原始序列重新排序。

sequenceLengths = cellfun(@(X) size(X,2), XTrain);
[sequenceLengthsSorted,idx] = sort(sequenceLengths);
XTrain = XTrain(idx);

5.2 填充序列

如果指定序列长度 'longest',则软件会填充序列,使小批量中的所有序列具有与小批量中的最长序列相同的长度。此选项是默认选项。

5.3 截断序列

如果指定序列长度 'shortest',则软件会截断序列,使小批量中的所有序列具有与该小批量中的最短序列相同的长度。序列中的其余数据被丢弃。

5.4 拆分序列

如果将序列长度设置为整数值,则软件会将小批量中的所有序列填充到小批量中最长序列的长度。然后,软件将每个序列拆分为指定长度的较小序列。如果发生拆分,则软件会创建额外的小批量。如果指定的序列长度没有均分数据的序列长度,则对于包含这些序列的最终时间步的小批量,其长度短于指定的序列长度。

如果将序列长度指定为正整数,则软件会在连续的迭代中处理较小的序列。神经网络会在拆分的序列之间更新 RNN 状态。


六、解决长期依赖问题的常用架构

除了LSTM(长短期记忆)之外,还有其他神经网络架构也可以用于解决长期依赖问题。以下是一些常见的架构:

  • 门控循环单元(GRU):GRU是一种类似于LSTM的循环神经网络架构,旨在解决长期依赖问题。它通过门控机制来控制信息的流动,使得模型能够选择性地保留或遗忘之前时间步的信息。GRU比LSTM有更简单的结构,因此训练速度更快,且参数更少,有助于减少过拟合的风险。
  • 循环递归神经网络(RRNN):RRNN是另一种解决长期依赖问题的神经网络架构。它通过递归连接的方式,使得神经网络能够捕获序列数据中的长期依赖关系。RRNN的递归连接使得每个时间步的输出都依赖于前一个时间步的输出,从而能够处理长期依赖问题。

这些架构在处理长期依赖问题时表现出色,并且在许多应用中取得了显著的成功,如语音识别、机器翻译、图像识别等。选择合适的架构取决于任务的具体需求和数据的特点。

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

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

相关文章

音视频学习笔记——c++多线程(二)

✊✊✊🌈大家好!本篇文章是多线程系列第二篇文章😇。首先讲解了利用mutex解决多线程数据共享问题,举例更好理解lock和unlock的使用方法,以及错误操作造成的死锁问题,最后讲解了lock_guard与unique_lock使用…

Django模型层(附带test环境)

Django模型层(附带test环境) 目录 Django模型层(附带test环境)连接数据库Django ORM在models.py中建表允许为空指定默认值数据库迁移命令 开启测试环境建表语句补充(更改默认表名)数据的增加时间数据的时区 多表数据的增加一对多多对多 数据的删除修改数据查询数据查询所有数据…

鸿蒙OpenHarmony HDF 驱动开发

目录 序一、概述二、HDF驱动框架三、驱动程序四、驱动配置坚持就有收获 序 最近忙于适配OpenHarmonyOS LiteOS-M 平台,已经成功实践适配平台GD32F407、STM32F407、STM32G474板卡,LiteOS适配已经算是有实际经验了。 但是,鸿蒙代码学习进度慢下…

【AcWing】蓝桥杯集训每日一题Day1|二分|差分|503.借教室(C++)

503. 借教室 503. 借教室 - AcWing题库难度:简单时/空限制:1s / 128MB总通过数:8052总尝试数:26311来源:NOIP2012提高组算法标签二分差分 题目内容 在大学期间,经常需要租借教室。 大到院系举办活动&…

基于机器学习的网络入侵检测二元分类模型构建与性能评估(NSL-KDD数据集)

简介 该项目是一个基于NSL-KDD数据集的网络入侵检测系统,主要采用机器学习方法对网络流量数据进行使用了多种机器学习模型,如逻辑回归、线性SVM、多项式核SVM、高斯核SVM、决策树、随机森林、朴素贝叶斯和K近邻算法训练二元分类(正常/异常&a…

bug总结(1)--变量取错

a c t i v i t y [ ′ t a g n a m e ′ ] 应为 activity[tag_name]应为 activity[′tagn​ame′]应为couponActivitList[0][‘name’] .隐藏的bug,在测试中竟然测不出来,而且上线了好久。为啥会出现这种低级错误呢?第一是写的时候不够仔细认…

Day26:安全开发-PHP应用模版引用Smarty渲染MVC模型数据联动RCE安全

目录 新闻列表 自写模版引用 Smarty模版引用 代码RCE安全测试 思维导图 PHP知识点: 功能:新闻列表,会员中心,资源下载,留言版,后台模块,模版引用,框架开发等 技术:输…

2024 年中国高校大数据挑战赛赛题 C:用户对博物馆评论的情感分析完整思路以及源代码分享

博物馆是公共文化服务体系的重要组成部分。国家文物局发布, 2021 年我国新增备案博物馆 395 家,备案博物馆总数达 6183 家,排 名全球前列;5605 家博物馆实现免费开放,占比达 90%以上;全国 博物馆举办展览 3…

【深度学习笔记】6_5 RNN的pytorch实现

注:本文为《动手学深度学习》开源内容,部分标注了个人理解,仅为个人学习记录,无抄袭搬运意图 6.5 循环神经网络的简洁实现 本节将使用PyTorch来更简洁地实现基于循环神经网络的语言模型。首先,我们读取周杰伦专辑歌词…

Python操作Redis 各种数据类型

本文将深入探讨如何使用Python操作Redis,覆盖从基础数据类型到高级功能的广泛主题。无论是字符串、列表、散列、集合还是有序集合,我们将一一解析,同时提供丰富的代码示例帮助读者更好地理解和应用。除此之外,本文还将介绍Redis的…

【20240309】WORD宏设置批量修改全部表格格式

WORD宏设置批量修改全部表格格式 引言1. 设置表格文字样式2. 设置表格边框样式3. 设置所有表格边框样式为075pt4. 删除行参考 引言 这两周已经彻底变为office工程师了,更准确一点应该是Word工程师,一篇文档动不动就成百上千页,表格图片也是上…

STM32之串口中断接收UART_Start_Receive_IT

网上搜索了好多,都是说主函数增加UART_Receive_IT()函数来着,实际正确的是UART_Start_Receive_IT()函数。 —————————————————— 参考时间:2024年3月9日 Cube版本:STM32CubeMX 6.8.1版本 参考芯片&#xff1a…

Svg Flow Editor 原生svg流程图编辑器(二)

系列文章 Svg Flow Editor 原生svg流程图编辑器(一) 说明 这项目也是我第一次写TS代码哈,现在还被绕在类型中头昏脑胀,更新可能会慢点,大家见谅~ 目前实现的功能:1. 元件的创建、移动、形变;2…

【C语言】字符指针

在指针的类型中我们知道有一种指针类型为字符指针char* 一般使用: int main() { char ch w; char *pc &ch; *pc w; return 0; } 还有一种使用方式,如下: int main() { const char* pstr "hello bit.";//这⾥是把⼀个字…

plantUML使用指南之序列图

文章目录 前言一、序列图1.1 语法规则1.1.1 参与者1.1.2 生命线1.1.3 消息1.1.4 自动编号1.1.5 注释1.1.6 其它1.1.7 例子 1.2 如何画好 参考 前言 在软件开发、系统设计和架构文档编写过程中,图形化建模工具扮演着重要的角色。而 PlantUML 作为一种强大且简洁的开…

【stm32 外部中断】

中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行 中断优先级:当有多个中…

LoadBalancer (本地负载均衡)

1.loadbalancer本地负载均衡客户端 VS Nginx服务端负载均衡区别 Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求,即负载均衡是由服务端实现的。 loadbalancer本地负载均衡,在调用微服务接口时候&a…

考研复习C语言初阶(4)+标记和BFS展开的扫雷游戏

目录 1. 一维数组的创建和初始化。 1.1 数组的创建 1.2 数组的初始化 1.3 一维数组的使用 1.4 一维数组在内存中的存储 2. 二维数组的创建和初始化 2.1 二维数组的创建 2.2 二维数组的初始化 2.3 二维数组的使用 2.4 二维数组在内存中的存储 3. 数组越界 4. 冒泡…

【Java JVM】Class 文件的加载

Java 虚拟机把描述类的数据从 Class 文件加载到内存, 并对数据进行校验, 转换解析和初始化, 最终形成可以被虚拟机直接使用的 Java 类型, 这个过程被称作虚拟机的类加载机制。 与那些在编译时需要进行连接的语言不同, 在 Java 语言里面, 类的加载, 连接和初始化过程都是在程序…

解决阿里云服务器开启frp服务端,内网服务器开启frp客户端却连接不上的问题

解决方法: 把阿里云自带的Alibabxxxxxxxlinux系统 换成centos 7系统!!!! 说一下我的过程和问题:由于我们内网的服务器在校外是不能连接的,因此我弄了个阿里云服务器做内网穿透,所谓…