主要内容

利用深度网络设计器进行时间序列预测的训练网络

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

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

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

本例使用数据集chickenpox_dataset.该示例创建并训练LSTM网络,根据前几个月的病例数预测水痘病例数。

加载顺序数据

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

数据= chickenpox_dataset;数据= [Data {:}];Figure plot(data) xlabel(“月”) ylabel (“案例”)标题(“每月水痘病例”

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

numTimeStepsTrain = floor(0.9* nummel (data))
numTimeStepsTrain = 448
dataTrain = data(1:numTimeStepsTrain+1);dataTest = data(numTimeStepsTrain+1:end);

标准化数据

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

mu = mean(dataTrain);sig = std(dataTrain);datatrainstandardization = (dataTrain - mu) / sig;

准备预测器和响应

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

XTrain = datatrainstandardization (1:end-1);YTrain = datatrainstandardization (2:end);

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

adsXTrain = arrayDatastore(XTrain);adsYTrain = arrayDatastore(YTrain);cdsTrain = combine(adsXTrain,adsYTrain);

定义LSTM网络体系结构

要创建LSTM网络架构,请使用深度网络设计器.的深度网络设计器应用程序允许您构建、可视化、编辑和训练深度学习网络。

deepNetworkDesigner

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

删除softmax层和分类层,用回归层代替它们。

调整层的属性,使其适合水痘数据集。该数据具有单个输入特征和单个输出特征。选择sequenceInputLayer并设置InputSize1.选择fullyConnectedLayer并设置OutputSize1

通过单击检查网络分析.网络已准备好训练,如果深度学习网络分析仪报告零错误。

导入数据

要导入训练数据存储,请选择数据选择并单击导入数据>导入数据存储.选择cdsTrain作为训练数据和没有一个作为验证数据。点击进口

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

指定培训项目

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

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

列车网络的

点击火车

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

训练完成后,单击导出训练好的网络出口培训选项卡。训练后的网络保存为trainedNetwork_1变量。

预测未来时间步骤

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

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

datateststandardization = (dataTest - mu) / sig;XTest = datateststandardization (1:end-1);YTest = dataTest(2:end);

为了初始化网络状态,首先对训练数据进行预测XTrain.接下来,使用训练响应的最后一个时间步骤进行第一个预测YTrain(结束).循环其余的预测,并输入先前的预测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-1),“ExecutionEnvironment”“cpu”);结束

使用先前计算的参数对预测进行非标准化。

YPred = sig*YPred + mu;

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

rmse =√(mean(YPred-YTest).^2))
rmse =175.9693

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

figure plot(dataTrain(1:end-1))稍等idx = numTimeStepsTrain:(numTimeStepsTrain+numTimeStepsTest);情节(idx (numTimeStepsTrain) YPred][数据,“。”)举行包含(“月”) ylabel (“案例”)标题(“预测”)传说([“观察”“预测”])

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

图子图(2,1,1)图(YTest) hold住情节(YPred“。”)举行传奇([“观察”“预测”]) ylabel (“案例”)标题(“预测”) subplot(2,1,2) stem(YPred - YTest) xlabel(“月”) ylabel (“错误”)标题(" rmse = "+ rmse)

用观测值更新网络状态

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

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

net = resetState(net);net = predictAndUpdateState(net,XTrain);

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

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

使用先前计算的参数对预测进行非标准化。

YPred = sig*YPred + mu;

计算均方根误差(RMSE)。

rmse =√(mean(YPred-YTest).^2))
Rmse = 119.5968

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

图子图(2,1,1)图(YTest) hold住情节(YPred“。”)举行传奇([“观察”“预测”]) ylabel (“案例”)标题(“最新天气预报”) subplot(2,1,2) stem(YPred - YTest) xlabel(“月”) ylabel (“错误”)标题(" rmse = "+ rmse)

在这里,用观测值更新网络状态比用预测值更新网络状态更准确。

另请参阅

相关的话题