主要内容

使用深度学习的序列对一回归

这个例子展示了如何使用长短期记忆(LSTM)神经网络预测波形的频率。

您可以使用LSTM神经网络使用序列和目标值的训练集来预测序列的数值响应。LSTM网络是一种循环神经网络(RNN),它通过随着时间步骤的循环和更新网络状态来处理输入数据。网络状态包含在以前的时间步骤中记住的信息。序列的数字响应示例包括:

  • 序列的属性,例如它的频率、最大值和平均值。

  • 序列的过去或未来时间步长的值。

本例使用波形数据集训练一个序列到一的回归LSTM网络,该数据集包含1000个综合生成的具有三个通道的不同长度的波形。若要使用常规方法确定波形的频率,请参见fft

加载顺序数据

从加载示例数据WaveformData.mat.数据是numObservations-by-1单元格序列数组,其中numObservations是序列的个数。每个序列都是numChannels——- - - - - -numTimeSteps数字数组,其中numChannels信道数的序列和numTimeSteps是序列中的时间步数。对应的目标在a中numObservations——- - - - - -numResponses波形频率的数字数组,其中numResponses是目标的通道数。

负载WaveformData

查看观察数。

numObservations = numel(data)
numObservations = 1000

查看前几个序列的大小和相应的频率。

数据(1:4)
ans =4×1单元格数组{3×103 double} {3×136 double} {3×140 double} {3×124 double}
频率(1:4,:)
ans =4×15.8922 2.2557 4.5250 4.4418

查看该序列的通道数。对于网络训练,每个序列必须有相同数量的通道。

numChannels = size(数据{1},1)
numChannels = 3

查看响应数(目标的通道数)。

numResponses = size(频率,2)
numResponses = 1

在图中可视化前几个序列。

图tiledlayout (2, 2)i = 1:4 nexttile stackedplot(data{i}', DisplayLabels=“通道”+ (1:numChannels)) xlabel(“时间步”)标题(频率:“+频率(i))结束

为培训准备数据

为验证和测试留出数据。将数据划分为包含80%数据的训练集、包含10%数据的验证集和包含剩余10%数据的测试集。

[idxTrain,idxValidation,idxTest] = trainingPartitions(numObservations, [0.8 0.1 0.1]);XTrain = data(idxTrain);XValidation = data(idxValidation);XTest = data(idxTest)TTrain = freq(idxTrain);TValidation = freq(idxValidation);TTest = freq(idxTest);

定义LSTM网络体系结构

创建一个LSTM回归网络。

  • 使用序列输入层,其输入大小与输入数据的通道数量相匹配。

  • 为了更好的拟合和防止训练发散,设置归一化序列输入层的选项zscore”。这将序列数据归一化,使其具有零平均值和单位方差。

  • 使用带有100个隐藏单位的LSTM层。隐藏单元的数量决定了该层学习到多少信息。较大的值可以产生更准确的结果,但更容易对训练数据进行过拟合。

  • 若要为每个序列输出单个时间步长,请设置OutputMode选项的LSTM层最后的”。

  • 为了指定要预测的值的数量,包括一个大小与预测器数量匹配的完全连接层,然后是一个回归层。

numHiddenUnits = 100;层= [...sequenceInputLayer (numChannels正常化=“zscore”) lstmLayer(numHiddenUnits, OutputMode=“最后一次”) fullyConnectedLayer(numResponses) regressionLayer
layers = 4×1具有图层的层数组:1 " Sequence Input 3维序列输入2 " LSTM LSTM 100个隐藏单元3 "全连接1全连接层4 "回归输出均方误差

指定培训项目

指定培训选项。

  • 使用Adam优化器进行训练。

  • 训练250个纪元。对于更大的数据集,您可能不需要为一个良好的拟合训练那么多的epoch。

  • 指定用于验证的序列和响应。

  • 输出给出最佳(即最小)验证损失的网络。

  • 设置学习率为0.005。

  • 截断每个小批中的序列,使其具有与最短序列相同的长度。截断序列可以确保不添加填充,但代价是丢弃数据。对于序列中所有时间步长都可能包含重要信息的序列,截断会阻止网络实现良好的拟合。

  • 以图表形式展示训练过程。

  • 禁用详细输出。

选项= trainingOptions(“亚当”...MaxEpochs = 250,...ValidationData = {XValidation TValidation},...OutputNetwork =“best-validation-loss”...InitialLearnRate = 0.005,...SequenceLength =“最短”...情节=“训练进步”...Verbose = false);

训练LSTM网络

使用指定的训练选项训练LSTM网络trainNetwork函数。

net = trainNetwork(XTrain, TTrain,图层,选项);

测试LSTM网络

利用测试数据进行预测。

YTest = predict(net,XTest, SequenceLength=“最短”);

将前几个预测在一个图中可视化。

图tiledlayout (2, 2)i = 1:4 nexttile stackedplot(XTest{i}',DisplayLabels=“通道”+ (1:numChannels)) xlabel(“时间步”)标题(“预测频率:”+字符串(欧美(i)))结束

在直方图中可视化均方误差。

图直方图(mean((TTest - YTest).^2,2)) xlabel(“错误”) ylabel (“频率”

计算总体均方根误差。

rmse =√(mean((YTest-TTest).^2))
rmse =0.6865

把预测频率和实际频率画出来。

图散射(欧美、tt、“b +”);包含(“预测频率”) ylabel (“实际频率”)举行M = min(频率);M = max(频率);xlim([m m]) ylim([m m]) plot([m m], [m m],“r——”

另请参阅

||||

相关的话题