深度学习--Matlab使用LSTM长短期记忆网络对负荷进行分类

一、概述

关于LSTM同系列的前一篇文章写的是利用LSTM网络对电力负荷进行预测【LSTM预测】,其本质是sequence-to-sequence problems,序列到序列的预测应用。这里做一下sequence-to-label classification problems,序列到标签的分类应用【LSTM分类】。关于LSTM的网络特性不再赘述。

本篇博文的具体示例是对给定的电力负荷进行分类,电力负荷数据格式为每日96个数据点的一维时间序列值,每条负荷数据均对应一个类型标签,总共类别为6类。其他的例子可以参考官网给定的japaneseVowelsTrainData 案例。

负荷数据是某电力公司内部数据,鉴于保密要求,这里仅描述数据格式,负荷数据集不提供。

  • 类别:6
  • 数据长度:96
  • 训练数据条数:9821
  • 测试数据条数:2456

二、数据格式转换

首先看一下需要传到LSTM网络的训练参数格式。

trainedNet = trainNetwork(C, Y, layers, options);

它必须从序列输入层开始,C是一个包含序列或时间序列预测器的元胞数组。C是d行1列,d代表有多少个训练样本,每个训练样本又包括N行M列,N代表训练样本的数据维度,M代表序列长度,y是标签的分类向量,是categorical类型。

因此,训练数据应该转换成元胞数组,训练数据标签应该转换成categorical类型。

2.1 训练数据格式转换

代码如下所示,用XTrain和YTrain来代替上述训练网络中的C和Y。

dataStandardlized是原始数据标准化后的数据,dataStandardlizedLable是每条数据对应的类别标签,num型。获得XTrain需要通过XTrainData转换成元胞数组,XTrain每一行是一条负荷训练样本数据,即1*96的数据。

YTrain是categorical类别数组,可以通过categorial函数转换,但是输入参数时字符元胞数组,因此现将XTrainLabel转换成字符矩阵,然后再将矩阵转换成元胞数组,最后转换成categorical类型。

%提取训练样本数据
XTrainSize = 9821;
XTrainData = dataStandardlized(1:XTrainSize,:);
XTrainLabel = dataStandardlizedLable(1:XTrainSize,:);%XTrain
for i = 1:size(XTrainData,1)XTrain{i,1} = XTrainData(i,:);
end%YTrain
TrainstrLable = num2str(XTrainLabel);% num to str
for i = 1:size(XTrainData,1)% str matrix to cellTraincellLable{i,1} = TrainstrLable(i,1);
end
YTrain = categorical(TraincellLable);%cell to categorical

2.2 测试数据格式转换

测试数据格式转换方法与训练数据格式转换相同,见代码。

%提取测试样本
XTestData = dataStandardlized(1+XTrainSize:end,:);
XTestLabel = dataStandardlizedLable(1+XTrainSize:end,:);
%XTest
for i = 1:size(XTestData,1)XTest{i,1} = XTestData(i,:);
end
%YTest
TeststrLable = num2str(TestLabel);% num to str
for i = 1:size(XTestData,1)TestcellLable{i,1} = TeststrLable(i,1);% str matrix to cell
end
YTest = categorical(TestcellLable);%cell to categorical

三、网络参数设置

前面讲到了TrainNetwork的C和Y,这里描述一下网络参数 layers和options的具体配置。

3.1 layers

layers用于定义训练网络的架构,按照网络架构的先后,依次填写到layers的每一行。

首先定义LSTM网络架构:

  • 将输入大小指定为序列大小 1(输入数据的维度,指同一时间下的数据维度)
  • 指定具有 100 个隐含单元的双向 LSTM 层,并输出序列的最后一个元素。
  • 指定六个类,包含大小为 1 的全连接层,后跟 softmax 层和分类层。
inputSize = 1;
numHiddenUnits = 100;
numClasses = 6;layers = [ ...sequenceInputLayer(inputSize)bilstmLayer(numHiddenUnits,'OutputMode','last')fullyConnectedLayer(numClasses)softmaxLayerclassificationLayer]

具体地:  

  1. sequenceInputLayer(inputSize):序列输入层,指定输入维度
  2. bilstmLayer(numHiddenUnits,'OutputMode','last'):双向LSTM层,指定隐藏节点,输出模式为‘last’即输出最后一个分类值
  3. fullyConnectedLayer(numClasses):全连接层,指定输出类别的个数
  4. softmaxLayer:这层是输出各类别分类的的概率
  5. classificationLayer:分类层,输出最后的分类结果,类似于概率竞争投票。

3.2 options

options用于指定训练网络的优化选项,通过调用trainingOptions进行设置。

此处指定训练选项:

  • 求解器为 'adam'
  • 梯度阈值为 1,最大轮数为 100。
  • 100作为小批量数。
  • 填充数据以使长度与最长序列相同,序列长度指定为 'longest'。
  • 数据保持按序列长度排序的状态,不打乱数据。
  • 'ExecutionEnvironment' 指定为 'cpu',设定为'auto'表明使用GPU。
maxEpochs = 100;
miniBatchSize = 100;options = trainingOptions('adam', ...'ExecutionEnvironment','cpu', ...'GradientThreshold',1, ...'MaxEpochs',maxEpochs, ...'MiniBatchSize',miniBatchSize, ...'SequenceLength','longest', ...'Shuffle','never', ...'Verbose',0, ...'Plots','training-progress');

四、训练LSTM网络

将前面准备好的参数送入训练网络,等待训练结束。

net = trainNetwork(XTrain,YTrain,layers,options);

我这里的训练时间非常长,当然训练过程与隐藏节点数,训练数据的维度和训练次数以及电脑配置有关系,我这里单CPU训练耗时112分钟。

五、利用LSTM网络进行分类

利用标准结果和分类结果计算分类的正确率。

使用classify函数进行分类,同训练过程一样,仍然要指定小批量大小为100,指定组内数据按照最长的数据填充。

miniBatchSize = 100;
YPred = classify(net,XTest, ...'SequenceLength','longest','MiniBatchSize',miniBatchSize);
%计算分类准确度
acc = sum(YPred == YTest)./numel(YTest)

可以看到分类精度达到92%,还是很不错了。

------分享知识,让人愉悦,原创博文,支持请点赞。

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

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

相关文章

VC跨进程数据(结构体)传递-WM_COPYDATA

两个测试程序,都是MFC基于对话框的应用程序,一个是发送者,一个是接收者。 两个程序都使用同一个结构体: typedef struct {char imsi[20];char options[512]; }_tagResult;发送者:按钮点击事件: void CCa…

咨询的真相8:咨询业的“前世今生”

第四节 咨询业的奶酪究竟有多大 2001年,又是从美国,传来了一本风靡全球的畅销书,讲的是四个老鼠和一块奶酪的故事。从此,奶酪就成了众人争抢之物的代名词。美国人的创新精神不得不佩服,忒俗的一个道理经他们仅从形式上…

带界面的OCX制作实例

制作一个有界面的OCX,并进行测试。代码下载 一、制作一个有界面的OCX: 设置该对话框的属性(关键噢): 给添加的对话框资源关联一个类CDlgTest,基类是:CDialog,如下: 给CO…

从淘宝数据结构来看电子商务中商品属性设计

淘宝名词解释 产品 和 商品的区别: 淘宝标准化产品,由类目关键属性唯一确定。如:手机类目,关键属性是品牌和型号,Nokia N95就是一个产品,nokia是品牌,N95是型号。产品除了关键属性还包括一般信息、销售属性和非关键属性…

linux串口驱动分析

linux串口驱动分析硬件资源及描述 s3c2440A 通用异步接收器和发送器(UART)提供了三个独立的异步串行 I/O(SIO)端口,每个端口都可以在中断模式或 DMA 模式下操作。UART 使用系统时钟可以支持最高 115.2Kbps 的波特率。每…

Linux 进程通信 -- 信号

一、概述 信号用于保持进程间的通信,可以备发送到一个进程或者一组进程,发送给进程的这个唯一信息通常是标志信号的一个数。信号可从键盘终端产生、虚拟内存中非法访问系统资源等情况下产生。信号异步发生,收到信号的进程可以采取某种动作或…

简单理解Socket

TCP/IP 要想理解socket首先得熟悉一下TCP/IP协议族, TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,定义了主机如何连入因特网及数据如何再它们之间传输的标准&…

write() vs. writev()

From: http://www.cppblog.com/whoami17/archive/2009/05/10/82452.html 今天突然想比较一下 write() 和 writev() 的性能, 网上google了半天, 竟然没有发现一点有关的数据信息, 自己就测试了一下。 平台如下: CentOS 5.2 Lin…

linux下GPRS模块ppp拨号上网

交叉编译器:arm-linux-gcc-4.5.4 Linux内核版本:Linux-3.0 主机操作系统:Centos 6.5 开发板:FL2440 GPRS:SIM900A 在开发SIM900模块之前,开发板已经加载了linux内核以及文件系统&#xf…

高级I/O(七)--readv和writev函数

From: http://blog.chinaunix.net/uid-26822401-id-3158225.html readv和write函数让我们在单个函数调用里从多个不连续的缓冲里读入或写出。这些操作被称为分散读&#xff08;scatter read&#xff09;和集合写&#xff08;gather write&#xff09;。 #include <sys/uio…

Linux下如何定位Java进程CPU利用率过高原因

首先通过Top命令查看占用CPU较高的进程PID&#xff0c;执行Top之后按1可以查看每个核占用比例 1 top这里由于我是用的虚拟机&#xff0c;即使我的Java进程占用CPU很高也只是占的虚拟机的&#xff0c;而对整个机器的CPU来说占的并不高。这里我们找到了pid7957 然后我们在根据pi…

【iOS开发】企业版证书($299)In-House方式发布指南

一、明确几个概念 1、企业版IDP&#xff1a;即iOS Development Enterprise Program。注意是$299&#xff0f;Year那种&#xff0c;并不是$99/Year的那种。 2、In House&#xff1a;是只企业内部发布&#xff0c;仅限企业内部人员使用。 二、In-House方式特点 1、不能发布到Appl…

RMSE、MAPE、准确率、召回率、F1、ROC、AUC总结

RMSE(root mean square error)均方根误差 单纯统计误差的值。 MAPE(mean absolute percentage error) 平均百分比误差 存在一个和原始数据相比较的过程。 准确率&#xff08;precision&#xff09;P&#xff1a; PTP/(TPFP) TP(true positive) FP(false positive) P是代表预…

hdu 5317 RGCDQ (2015多校第三场第2题)素数打表+前缀和相减求后缀(DP)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid5317 题意&#xff1a;F(x) 表示x的不同质因子的个数结果是求L&#xff0c;R区间中最大的gcd( F(i) , F(j) )&#xff0c;i、j在L&#xff0c;R区间内。 思路&#xff1a;因为2<L < R<1000000&#xf…

MATLAB 中RMSE和MAPE的计算方法

RMSE&#xff1a;均方根误差 matlab计算方法&#xff1a; rmse sqrt(mean((YPred-Obverval).^2)); MAPE&#xff1a;平均百分比误差 matlab计算方法&#xff1a; meap mean(abs((observed - predicted)./observed))*100;

shell 基本知识

shell--脚本基础知识 ****shell 脚本基础知识**** 一、基本脚本编译 知识内容&#xff1a; # 构建脚本 # 将命令串联起来 # 存储变量 # 数学计算 # 重定向输出 # 检查代码shell不像高级语言需要编译后执行&#xff0c;而是直接处理每一条命令&#xff0c;可以将多条命令连接起来…

让LwIP拥有PING其他设备的能力

LwIP是个很不错的协议栈&#xff0c;但是由于其体积过于小巧&#xff0c;使其只能支持ICMP的ECHO类型。 因为在“icmp.c”中的“void icmp_input(struct pbuf *p, struct netif *inp)”函数里有个很长的switch case语句&#xff08;大约80行的位置&#xff09;。 而这个语句只…

H.264详解

From: http://netliuwei.blog.163.com/blog/static/93642191201111721931583/ H.264 H.264&#xff0c;同时也是MPEG-4第十部分&#xff0c;是由ITU-T视频编码专家组&#xff08;VCEG&#xff09;和ISO/IEC动态图像专家组&#xff08;MPEG&#xff09;联合组成的联合视频组&…

VSCode中配置prettier和ESLint

文章目录 了解ESLint和Prettier的作用prettier配置ESLint配置常见问答ESLint 和Prettier 有什么区别&#xff1f;为什么我应该同时使用ESLint 和Prettier&#xff1f;在使用ESLint 和Prettier 时&#xff0c;有可能出现它们之间的规则冲突吗&#xff1f;我已经在项目中使用了ES…

Lwip使用经验

LWIP使用经验 一 LWIP内存管理 数据包管理 设置内存大小 宏编译开关 二 LWIP启动时序 三 LWIP运行逻辑 接收数据包 SequentialAPI函数调用 四 TCPIP核心知识点 滑动窗口 三次握手 断开连接 TCP状态转换 同时打开 同时关闭 五正确使用LWIP 六 LWIP常见问题 网卡驱动程序 内存…