基于深度网络设计器的时间序列预测训练网络
这个例子展示了如何通过训练长短期记忆(LSTM)网络来预测时间序列数据深度网络设计器。
深度网络设计器允许您交互式地创建和训练用于序列分类和回归任务的深度神经网络。
为了预测序列未来时间步长的值,您可以训练一个序列到序列回归LSTM网络,其中响应是值移动一个时间步长的训练序列。即在输入序列的每一个时间步长,LSTM网络学习预测下一个时间步长的值。
本例使用数据集chickenpox_dataset
。这个例子创建并训练了一个LSTM网络,根据前几个月的水痘病例数来预测水痘病例数。
负载顺序数据
加载示例数据。chickenpox_dataset
包含单个时间序列,其时间步长对应于月份,值对应于病例数。输出是一个单元格数组,其中每个元素都是一个时间步长。将数据重塑为行向量。
数据= chickenpox_dataset;Data = [Data {:}];图plot(数据)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);datatrainstandardiized = (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层和classification层,用回归层代替。
调整图层的属性,使它们适合水痘数据集。该数据具有单个输入特征和单个输出特征。选择sequenceInputLayer然后设置InputSize来1
。选择fullyConnectedLayer然后设置OutputSize来1
。
点击查看您的网络分析。网络已经准备好训练了深度学习网络分析器报告零错误。
导入数据
要导入训练数据存储,请选择数据选项卡并单击导入数据>导入自定义数据。选择cdsTrain
作为训练数据和没有一个
作为验证数据。点击进口。
数据预览显示单个输入时间序列和单个响应时间序列,每个时间序列都有448个时间步长。
指定培训方案
在培训选项卡上,单击培训方案。集解算器来亚当
,InitialLearnRate来0.005
,MaxEpochs来500
。为防止渐变爆炸,请设置GradientThreshold来1
。
有关设置培训选项的详细信息,请参见trainingOptions
。
列车网络的
点击火车。
深度网络设计器显示一个动画情节,显示训练进度。该图显示了小批损失和准确性,验证损失和准确性,以及关于训练进度的附加信息。
训练完成后,点击导出训练后的网络出口在培训选项卡。训练后的网络保存为trainedNetwork_1
变量。
预测未来的时间步骤
通过预测未来的多个时间步来测试训练好的网络。使用predictAndUpdateState
函数一次预测一个时间步长,并在每次预测时更新网络状态。对于每个预测,使用之前的预测作为函数的输入。
使用与训练数据相同的参数对测试数据进行标准化。
datatestnormalized = (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 = sqrt(mean((YPred-YTest).^2))
rmse =单175.9693
用预测值绘制训练时间序列。
figure plot(dataTrain(1:end-1)) hold在idx = numTimeStepsTrain:(numTimeStepsTrain+numTimeStepsTest);情节(idx (numTimeStepsTrain) YPred][数据,“。”)举行从包含(“月”) ylabel (“案例”)标题(“预测”)传说([“观察”“预测”])
将预测值与测试数据进行比较。
图subplot(2,1,1) plot(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 = sqrt(mean((YPred-YTest).^2))
Rmse = 119.5968
将预测值与测试数据进行比较。
图subplot(2,1,1) plot(YTest) hold在情节(YPred“。”)举行从传奇([“观察”“预测”]) ylabel (“案例”)标题(“最新天气预报”) subplot(2,1,2) stem(YPred - YTest) xlabel(“月”) ylabel (“错误”)标题(" rmse = "+ rmse)
在这里,使用观测值而不是预测值更新网络状态时,预测更准确。