主要内容

基于深度网络设计器的时间序列预测训练网络

这个例子展示了如何通过训练长短期记忆(LSTM)网络来预测时间序列数据深层网络设计师

深层网络设计师允许您交互式地创建和训练序列分类和回归任务的深度神经网络。

为了预测序列未来时间步长的值,可以训练一个序列到序列回归LSTM网络,其中的响应是值移动一个时间步长的训练序列。即在输入序列的每一个时间步长,LSTM网络学习预测下一个时间步长的值。

本例使用数据集水痘这个example creates and trains an LSTM network to forecast the number of chickenpox cases given the number of cases in previous months.

加载序列数据

加载示例数据。水痘包含单个时间序列,时间步长对应月份,值对应案例数。输出是一个单元格数组,其中每个元素都是一个时间步骤。将数据重塑为行向量。

数据= chickenpox_dataset;数据=({}):数据;图绘制(数据)包含(“月”)伊拉贝尔(“案例”)标题(“每月水痘病例”

对训练和测试数据进行分区。训练序列的前90%,测试序列的后10%。

NUMTIMESTEPTRAIN=地板(0.9*numel(数据))
numTimeStepsTrain = 448
dataTrain=数据(1:numTimeStepsTrain+1);dataTest=数据(numTimeStepsTrain+1:end);

标准化数据

为了更好的拟合和防止训练发散,将训练数据标准化,使其均值和单位方差均为零。对于预测,必须使用与训练数据相同的参数对测试数据进行标准化。

μ=意味着(dataTrain);sig =性病(dataTrain);datatrain标准化= (datatrainmu) / sig;

准备预测因素和反应

为了预测序列的未来时间步长的值,将响应指定为平移一个时间步长的训练序列。即在输入序列的每一个时间步长,LSTM网络学习预测下一个时间步长的值。预测器是没有最后时间步长的训练序列。

XTrain = dataTrainStandardized (1: end-1);YTrain = dataTrainStandardized(2:结束);

要使用深度网络设计器训练网络,请将训练数据转换为数据存储对象。使用arrayDatastore将训练数据,预测器和反应转换成ArrayDatastore对象。使用结合合并两个数据存储。

adsXTrain = arrayDatastore (XTrain);adsYTrain = arrayDatastore (YTrain);cdsTrain =结合(adsXTrain adsYTrain);

定义LSTM网络架构

要创建LSTM网络体系结构,请使用深层网络设计师这个深层网络设计师应用程序可以让你建立,可视化,编辑和训练深度学习网络。

deepNetworkDesigner

深层网络设计师开始页,暂停Sequence-to-Sequence并点击开放.这样做将打开一个适合于序列到序列分类任务的预构建网络。通过替换最后的层,可以将分类网络转换为回归网络。

删除softmax层和分类层并用回归层替换。

调整层的属性,使其适合水痘数据集。该数据只有一个输入特性和一个输出特性。选择sequenceInputLayer并设置输入大小1选择fullyConnectedLayer并设置OutputSize1

通过点击来检查你的网络分析。网络已准备好接受培训,如果深度学习网络分析仪零错误报告。

导入数据

要导入训练数据存储,请选择数据选项卡并单击导入数据>导入数据存储选择镉毒株作为培训数据和没有一个作为验证数据。点击进口

数据预览显示了单个输入时间序列和单个响应时间序列,每个时间序列都有448个时间步骤。

指定培训选项

培训选项卡上,单击培训方案设置解算器亚当InitialLearnRate0.005,MaxEpochs500.为防止渐变发生爆炸,请设置GradientThreshold1

有关设置培训选项的详细信息,请参见trainingOptions

列车网络的

点击火车

深层网络设计师显示显示训练进度的动画情节。该图显示了小批损失和准确性,验证损失和准确性,以及培训进展的附加信息。

一旦培训完成,通过点击导出培训网络出口培训选项卡。将训练后的网络保存为trainedNetwork_1变量。

预测未来时间步骤

通过预测未来的多个时间步来测试经过训练的网络predictAndUpdateState函数一次预测一个时间步骤,并在每次预测时更新网络状态。对于每个预测,使用之前的预测作为函数的输入。

使用与训练数据相同的参数对测试数据进行标准化。

datatest标准化= (dataTest - mu) / sig;XTest = dataTestStandardized (1: end-1);欧美=人数((2:结束);

要初始化网络状态,首先对训练数据进行预测XTrain.接下来,使用训练反应的最后一个时间步骤进行第一次预测(完).循环剩余的预测并输入之前的预测predictAndUpdateState

对于大量数据、长序列或大型网络,GPU上的预测通常比CPU上的预测更快。否则,对CPU的预测通常计算得更快。对于单时间步长预测,使用CPU。要使用CPU进行预测,请设置“ExecutionEnvironment”选择predictAndUpdateState“cpu”

net=predictAndUpdateState(trainedNetwork_1,XTrain);[net,YPred]=predictAndUpdateState(net,YTrain(end));numTimeStepsTest=numel(XTest);i = 2:numTimeStepsTest [net,YPred(:,i)] = predictAndUpdateState(net,YPred(:,i)),“ExecutionEnvironment”“cpu”);结束

使用前面计算的参数使预测不标准化。

YPred = sig*YPred + mu;

训练进度图报告从标准化数据计算的均方根误差(RMSE)。从非标准化预测计算RMSE。

rmse =√意味着(YPred-YTest)。^ 2))
rmse =175.9693

用预测值绘制训练时间序列。

图绘制(dataTrain (1: end-1))在…上idx = numTimeStepsTrain:(numTimeStepsTrain + numTimeStepsTest);情节(idx (numTimeStepsTrain) YPred][数据,“。”)举行包含(“月”)伊拉贝尔(“案例”)标题(“预测”)传说([“观察”“预测”])

将预测值与试验数据进行比较。

图子地块(2,1,1)图(YTest)保持在…上情节(YPred“。”)举行传奇([“观察”“预测”]) ylabel (“案例”)标题(“预测”) subplot(2,1,2) stem(YPred - YTest) xlabel(“月”)伊拉贝尔(“错误”)标题(" RMSE = "+ rmse)

用观测值更新网络状态

如果您可以访问预测之间的实际时间步长的值,那么您可以使用观测值而不是预测值更新网络状态。

首先,初始化网络状态。要对新序列进行预测,请使用重置状态.重置网络状态可以防止先前的预测影响对新数据的预测。重置网络状态,然后通过对训练数据的预测来初始化网络状态。

网= resetState(净);网= predictAndUpdateState(净,XTrain);

预测每一个时间步骤。对于每一个预测,使用前一个时间步长的观测值来预测下一个时间步长。设置“ExecutionEnvironment”选择predictAndUpdateState“cpu”

YPred = [];numTimeStepsTest =元素个数(XTest);i=1:numTimeStepsTest[net,YPred(:,i)]=predictAndUpdateState(net,XTest(:,i),“ExecutionEnvironment”“cpu”);结束

使用前面计算的参数使预测不标准化。

YPred = sig*YPred + mu;

计算均方根误差(RMSE)。

rmse =√意味着(YPred-YTest)。^ 2))
rmse = 119.5968

将预测值与试验数据进行比较。

图子地块(2,1,1)图(YTest)保持在…上情节(YPred“。”)举行传奇([“观察”“预测”]) ylabel (“案例”)标题(“与更新预测”) subplot(2,1,2) stem(YPred - YTest) xlabel(“月”)伊拉贝尔(“错误”)标题(" RMSE = "+ rmse)

在这里,当用观测值而不是预测值更新网络状态时,预测会更准确。

另请参阅

相关话题