在Simulink中使用LSTM网络进行物理系统建模
这个例子展示了如何通过训练长短期记忆(LSTM)神经网络来创建一个降阶模型(ROM)来替换Simulink®模型中的Simscape组件。
ROM是物理模型的替代品,它允许您在不影响原始物理模型精度的情况下减少所需的计算。对于需要大量计算的工作流,例如设计探索,您可以使用ROM来代替原始的物理系统。虽然构建ROM的技术多种多样,但本示例构建一个LSTM-ROM(一种利用LSTM网络的ROM类型),并将其作为深度学习状态预测块的一部分在Simulink模型中使用。
为了训练LSTM网络,本例使用原始模型生成训练数据。ROM中经过训练的LSTM将负载轴的B、F信号和控制压力作为输入,并预测负载轴的B、F信号的下一个值。在训练模型之后,示例创建一个LSTM-ROM组件,并用它替换Simulink模型中的物理组件。此图显示了在Simulink模型中用LSTM-ROM子组件替换物理组件的过程。
为LSTM- rom训练LSTM网络是一项计算密集型任务,运行时间长。为了加快示例的速度,该示例跳过训练,加载预先训练的网络版本。要代替训练网络,请设置doTraining
变量来真正的
.
doTraining = false;
生成的训练数据
使用Simulink模型生成训练数据ex_sdl_flexible_shaft
,作为支持文件附加到本示例中。要访问此模型,请将此示例作为实时脚本打开。这个Simulink模型模拟了一个柔性轴。它有两个采用集总参数方法建模的柔性铝轴:电机轴,由20段组成,负载轴,由5段组成。两根轴都包含惯性,阻尼和刚性扭转弹簧。在模拟开始时,离合器是解锁的,从动轴是自由的。电机轴的初始速度设置为200 rad/s,系统在稳态启动。该模型使用施加在离合器上的压力作为控制参数来确定模型的动力学。
Simulink模型输出四个值:
负载轴基座(B)信号
负载轴从动件(F)信号
控制压力
电机轴的F信号
前三个状态用于训练LSTM-ROM。第四种状态用于评估训练模型的准确性。
这个图显示了模型的结构。
Simulink模型依赖于工作空间变量stopTime
而且timeInterval
,分别指定仿真的最终时间步长和输出时间步长之间的间隔。模拟的初始时间步长为0。
的停止时间0.2
时间间隔为
.
stopTime = 0.2;timeInterval = 5 e-5;
模型的Pressure块依赖于工作空间变量maxPressure
,它定义了施加在离合器上的最大压力值。的20个不同的等间距值运行该模型maxPressure
之间的
而且
.收集单元格数组中的输出数据数据
,其中每个元素对应以指定压力剖面计算的时间序列观测值。
numObservations = 20;maxPressures = linspace (1 e5, 1 e6, numObservations);data =细胞(numObservations, 1);为i = 1:numObservations maxPressure = maxPressure (i);simout = sim卡(“ex_sdl_flexible_shaft”);数据{我}= simout.simout.Data ';结束
提取仿真的时间步长。
* = simout.simout.Time;numTimeSteps =长度(次);
绘制前五个模拟的控制压力。
数字为I = 1:5 pressure = data{I}(3,:);情节(时间、压力);持有在结束标题(“输入压力”)传说(“观察”+(1:5))包含(“时间”) ylabel (“压力(Pa)”)举行从
绘制其中一个仿真的负载轴的B、F信号和电机轴的F信号。
idx = 4;BLoadShaft = {idx}数据(1:);FLoadShaft = {idx}数据(2:);FMotorShaft = {idx}数据(4:);图绘制(时间、BLoadShaft...次,FLoadShaft,...次,FMotorShaft)传说(“B -负载轴”,“F -负载轴”,“F -电机轴”)标题(模型动力学(最大压力=+ maxPressures (idx) +“啪”)
为培训准备数据
当使用非常长的序列训练LSTM时,为每个时间步计算的梯度的累积可能导致梯度消失,并导致训练过程收敛到次优结果。为了防止梯度消失,对训练数据进行下采样,这样序列就会更短,而不会丢失太多的信息。
若要对数据进行下采样,请指定一个大于训练数据的采样时间的采样时间。在有状态预测块中使用LSTM网络时,必须指定相同的值样品时间参数。
的采样时间 .
sampleTime = 1 e - 3;
通过提取固定间隔的时间步来对训练数据进行下采样,该固定间隔由样本时间除以模拟时间间隔给出。
intervaldown采样= sampleTime / timeInterval;timeStepsDownsampled = 1: intervalDownsampled: numTimeSteps;为i = 1:numObservations datadownsampling {i} = data{i}(:, timestepsdownsampling);结束
方法将训练数据均匀地划分为训练和测试分区trainingPartitions
函数,作为支持文件附加到本示例中。要访问此文件,请将示例作为实时脚本打开。
[idxTrain,idxTest] = trainingPartitions(numObservations,[0.5 0.5]);maxPressuresTrain = maxPressures (idxTrain);maxPressuresTest = maxPressures (idxTest);dataTrain = dataDownsampled (idxTrain);人数(= dataDownsampled (idxTest);
从训练数据中提取预测指标和目标。预测器是负载轴的B信号和F信号以及控制压力。目标是位移一个时间步的载荷轴的B和F信号。的前三个通道对应的预测器dataTrain
.的每个元素的前两个通道对应dataTrain
移动了一个时间步。
inputStatesTrain = [1 2 3];outputStatesTrain = [1 2];numObservationsTrain =元素个数(dataTrain);为i = 1:numObservationsTrain XTrain{i} = dataTrain{i}(inputStatesTrain,1:end-1);TTrain{我}= dataTrain{我}(outputStatesTrain, 2:结束);结束
定义网络体系结构
定义以下LSTM网络,预测下一个B和F信号值。
对于序列输入,指定一个序列输入层,其输入大小与输入数量匹配。通过将输入缩放到0到1之间的值来规范化输入。
为了学习输入特征之间的交互,包括一个输出大小为200的完全连接层,然后是一个ReLU层。
为了了解序列数据中的长期依赖关系,包括两个LSTM层,其中包含200个隐藏单元,然后是一个ReLU层。
要输出正确大小的预测,需要包含一个大小与响应数量匹配的完全连接层。
为了训练回归网络,包括一个回归层。
numHiddenUnits = 200;numFeatures =元素个数(inputStatesTrain);numResponses =元素个数(outputStatesTrain);layers = [sequenceInputLayer(numFeatures, normalized = .“rescale-zero-one”) fullyConnectedLayer(numHiddenUnits) reluLayer lstmLayer(numHiddenUnits) lstmLayer(numHiddenUnits) reluLayer fullyConnectedLayer(numResponses) regressionLayer];
指定培训选项
指定培训选项:
训练一个使用亚当求解器的网络 时代的发展。
为了防止梯度爆炸,剪辑梯度的阈值为1。
为了改进训练,安排一个分段递减的学习率因子。使用初始学习率为 每降低0.6倍的速率 迭代。
在图形中显示训练进度,抑制冗长输出。
如果有GPU,请使用GPU进行训练。的
trainNetwork
函数,默认情况下,在可用的GPU上训练。使用GPU需要并行计算工具箱和支持的GPU设备。有关支持的设备的信息,请参见GPU计算的需求(并行计算工具箱).
选择= trainingOptions (“亚当”,...MaxEpochs = 3 e4,...GradientThreshold = 1,...InitialLearnRate = 5 e - 3,...LearnRateSchedule =“分段”,...LearnRateDropPeriod = 1 e4,...LearnRateDropFactor = 0.6,...Verbose = 0,...情节=“训练进步”);
火车LSTM网络
训练LSTM网络trainNetwork
函数。要在Simulink模型中使用LSTM网络,请将网络保存在MAT文件中。
为LSTM- rom训练LSTM网络是一项计算密集型任务,运行时间长。为了加快示例的速度,该示例跳过训练,加载预先训练的网络版本。要代替训练网络,请设置doTraining
变量来真正的
.
文件名=“flexibleShaftLoadNet.mat”;如果doTraining net = trainNetwork(XTrain, TTrain, layers, options);保存(文件名,“净”)其他的负载(文件名);结束
在Simulink模型中使用LSTM-ROM
创建以下Simulink子组件,使用训练过的LSTM网络输出负载轴的预测B和F信号。该块通过反馈循环使用对下一个时间步骤的预测。
在“有状态预测”块中,设置文件路径参数设置为保存的训练网络的位置,并指定用于生成训练数据的相同采样时间。在连接到有状态预测块输入和单元延迟块的速率转换块中使用相同的采样时间。
用LSTM-ROM子组件替换原始Simulink模型中的负载轴。生成的模型保存在ex_sdl_flexible_shaft_lstm
.要访问此文件,请将示例作为实时脚本打开。
测试模型
利用hold out测试数据集评估模型的准确性。
为了测试整个模型的准确性,而不仅仅是LSTM网络,将输出与原始Simulink模型生成的电机轴的模拟F信号进行比较。
从测试数据中提取目标。测试目标是用原模型模拟的电机轴F信号,移动一个时间步。
numObservationsTest =元素个数(人数();outputStatesTest = 4;为i = 1:numObservationsTest TTest{i} = dataTest{i}(outputStatesTest,2:end);结束
对于测试数据集的每一个最大压力值,运行模拟并将模拟的电机轴F信号保存在单元阵列中欧美
.
犯错误= [];为i = 1:numObservationsTest maxPressure = maxPressuresTest(i);simout = sim卡(“ex_sdl_flexible_shaft_lstm”);欧美{我}= simout.simout.Data (1: end-1, 4) ';结束
在散点图中可视化时间步预测。
图scatter([TTest{:}], [YTest{:}])“目标”) ylabel (“预测”) m = min([TTest{:} YTest{:}]);M = max([TTest{:} YTest{:}]);xlim([m m]) ylim([m m]) hold住在情节([m m], [m m],“r——”)
在直方图中可视化预测误差。
[TTest{:}] - [YTest{:}]“错误”) ylabel (“频率”)
接近于零的值表示预测准确。
使用新数据进行模拟
运行之前未见的最大压力值的模型 Pa。
maxPressure = 2.7 e5;simout = sim卡(“ex_sdl_flexible_shaft_lstm”);Y = simout.simout.Data (:, 4) ';
在图中可视化预测的F信号。
图绘制(simout.simout。时间,Y) ylim([0 inf]) xlabel(“时间”) ylabel (“F信号-电机轴”)标题(模型预测(最大压力=”+ maxPressure +“啪”)
另请参阅
有状态的预测|预测|lstmLayer
|trainingOptions
|trainNetwork