使用深度学习的序列对一回归
这个例子展示了如何使用长短期记忆(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——”)
另请参阅
trainNetwork
|trainingOptions
|lstmLayer
|sequenceInputLayer
|预测