基于深度网络设计器的时间序列预测训练网络
这个例子展示了如何通过训练长短期记忆(LSTM)网络来预测时间序列数据深层网络设计师.
深层网络设计师允许您交互地创建和训练深度神经网络,用于序列分类和回归任务。
为了预测序列未来时间步长的值,可以训练序列到序列回归LSTM网络,其中响应是值移动了一个时间步的训练序列。即在输入序列的每一个时间步中,LSTM网络学习预测下一个时间步的值。
本示例使用数据集chickenpox_dataset
.该示例创建并训练一个LSTM网络,根据前几个月的病例数预测水痘病例数。
加载序列数据
加载示例数据。chickenpox_dataset
包含单个时间序列,时间步长对应月,值对应病例数。输出是一个单元格数组,其中每个元素都是单个时间步。将数据重塑为行向量。
数据= chickenpox_dataset;数据=({}):数据;图绘制(数据)包含(“月”) ylabel (“案例”)标题(“水痘每月病例”)
对训练和测试数据进行划分。训练前90%的序列,测试后10%的序列。
地板numTimeStepsTrain =(0.9 *元素个数(数据)
numTimeStepsTrain = 448
dataTrain =数据(1:numTimeStepsTrain + 1);人数(=数据(numTimeStepsTrain + 1:结束);
标准化数据
为了更好的拟合和防止训练发散,将训练数据标准化,使其均值和单位方差为零。对于预测,必须使用与训练数据相同的参数对测试数据进行标准化。
μ=意味着(dataTrain);sig =性病(dataTrain);datatrainstandardization = (dataTrain - mu) / sig;
准备预测和响应
为了预测序列未来时间步长的值,将响应指定为值移动一个时间步的训练序列。即在输入序列的每一个时间步中,LSTM网络学习预测下一个时间步的值。预测器是没有最后时间步的训练序列。
XTrain = dataTrainStandardized (1: end-1);YTrain = dataTrainStandardized(2:结束);
若要使用深度网络设计器训练网络,请将训练数据转换为数据存储对象。使用arrayDatastore
将训练数据预测器和响应转换为ArrayDatastore
对象。使用结合
来合并两个数据存储。
adsXTrain = arrayDatastore (XTrain);adsYTrain = arrayDatastore (YTrain);cdsTrain =结合(adsXTrain adsYTrain);
定义LSTM网络架构
要创建LSTM网络架构,请使用深层网络设计师.的深层网络设计师App可以让你构建、可视化、编辑和训练深度学习网络。
deepNetworkDesigner
在深层网络设计师开始页面,暂停Sequence-to-Sequence并点击开放.这样做可以打开一个适合于序列到序列分类任务的预先构建的网络。您可以通过替换最后的层来将分类网络转换为回归网络。
删除softmax层和分类层,并用回归层替换它们。
调整层的属性,使它们适合水痘数据集。该数据具有单一的输入特征和单一的输出特征。选择sequenceInputLayer并设置InputSize来1
.选择fullyConnectedLayer并设置OutputSize来1
.
通过单击检查您的网络分析.该网络已准备好进行培训,如果深度学习网络分析器零错误报告。
导入数据
要导入培训数据存储,请选择数据选项卡并单击导入数据>导入数据存储.选择cdsTrain
作为培训数据和没有一个
作为验证数据。点击进口.
数据预览显示了单个输入时间序列和单个响应时间序列,每一个都有448个时间步。
指定培训选项
在培训选项卡上,单击培训方案.集解算器来亚当
,InitialLearnRate来0.005
,MaxEpochs来500
.为了防止渐变爆炸,设置GradientThreshold来1
.
有关设置培训选项的详细信息,请参见trainingOptions
.
列车网络的
点击火车.
深层网络设计师显示显示训练进度的动画图。图中显示了小批量损失和准确性,验证损失和准确性,以及关于训练进度的附加信息。
培训完成后,通过单击导出培训的网络出口在培训选项卡。训练过的网络保存为trainedNetwork_1
变量。
预测未来时间步骤
通过预测未来的多个时间步来测试训练过的网络。使用predictAndUpdateState
函数每次预测一个时间步长,并在每次预测时更新网络状态。对于每个预测,使用前面的预测作为函数的输入。
使用与训练数据相同的参数对测试数据进行标准化。
datateststandardization = (dataTest - mu) / sig;XTest = dataTestStandardized (1: end-1);欧美=人数((2:结束);
为了初始化网络状态,首先对训练数据进行预测XTrain
.接下来,使用训练响应的最后一个时间步骤进行第一个预测YTrain(结束)
.循环其余的预测,并输入先前的预测predictAndUpdateState
.
对于大量的数据集合,长序列,或大型网络,GPU上的预测通常比CPU上的预测更快。否则,CPU上的预测通常计算速度更快。对于单时间步预测,使用CPU。如果要使用CPU进行预测,请设置“ExecutionEnvironment”
选择predictAndUpdateState
来“cpu”
.
网= predictAndUpdateState (trainedNetwork_1 XTrain);[净,YPred] = predictAndUpdateState(净,YTrain(结束));numTimeStepsTest =元素个数(XTest);为i = 2:numTimeStepsTest [net,YPred(:,i)] = predictAndUpdateState(net,YPred(:,i-1),“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][数据,“。”)举行从包含(“月”) ylabel (“案例”)标题(“预测”)传说([“观察”“预测”])
将预测值与试验数据进行比较。
图副图(2,1,1)图(YTest) hold住在情节(YPred“。”)举行从传奇([“观察”“预测”]) ylabel (“案例”)标题(“预测”) subplot(2,1,2) stem(YPred - YTest)“月”) ylabel (“错误”)标题(" RMSE = "+ rmse)
用观察值更新网络状态
如果您可以访问预测之间的时间步长的实际值,那么您可以使用观测值而不是预测值来更新网络状态。
首先,初始化网络状态。若要对新序列进行预测,请使用重置网络状态resetState
.重置网络状态可以防止以前的预测影响对新数据的预测。重置网络状态,然后通过对训练数据的预测初始化网络状态。
网= 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) hold住在情节(YPred“。”)举行从传奇([“观察”“预测”]) ylabel (“案例”)标题(“与更新预测”) subplot(2,1,2) stem(YPred - YTest)“月”) ylabel (“错误”)标题(" RMSE = "+ rmse)
在这里,用观测值更新网络状态比用预测值更新网络状态更准确。