主要内容

使用条件GAN生成合成信号

这个例子展示了如何使用条件生成对抗网络生成合成泵信号。

生成对抗网络(GANs)可用于生成类似于网络实际数据输入的合成数据。当模拟计算成本很高或实验成本很高时,GANs非常有用。条件GANs (Conditional GANs)可以在训练过程中使用数据标签来生成属于特定类别的数据。

本例将泵Simulink™模型获得的模拟信号作为CGAN训练数据集的“真实”数据。金宝appCGAN使用1-D卷积网络,并使用自定义训练循环和深度学习阵列进行训练。此外,本例使用主成分分析(PCA)来直观地比较生成信号和真实信号的特征。

CGAN用于信号合成

cgan由两个作为对手一起训练的网络组成:

  1. 发电机网络——给定一个标签和随机数组作为输入,该网络生成的数据具有与相同标签对应的训练数据观察相同的结构。生成器的目标是生成标识器分类为“真实”的标记数据。

  2. 鉴频器给定一批标记数据,其中包含来自训练数据和生成器生成的数据的观察结果,该网络试图将观察结果分类为“真实的”或“生成的”。鉴别器的目标是在给定批次的真实数据和生成的标记数据时,不被生成器“愚弄”。

理想情况下,这些策略会产生一个生成器,生成与输入标签对应的令人信服的真实数据,以及一个已经学习了每个标签训练数据的强大特征的鉴别器。

加载数据

仿真数据由文中给出的泵Simulink模型生成金宝app基于模拟数据的多类故障检测(预测性维护工具箱)的例子。Simu金宝applink模型可用于模拟三种类型的故障:气缸泄漏、入口堵塞和轴承摩擦增加。数据集包含1575个泵输出流量信号,其中760个为健康信号,815个为单个故障、两个故障组合或三个故障组合。每个信号有1201个信号样本,采样率为1000hz。

下载并解压缩临时目录中的数据,其位置由MATLAB®指定tempdir命令。如果数据所在的文件夹与指定的不同tempdir,在下面的代码中修改目录名称。

%下载数据dataURL =“https://ssd.mathworks.com/金宝appsupportfiles/SPT/data/PumpSignalGAN.zip”;saveFolder = fullfile(tempdir,“PumpSignalGAN”);zipFile = fullfile(tempdir,“PumpSignalGAN.zip”);如果~存在(saveFolder“dir”) websave (zipFile dataURL);结束解压缩数据解压缩(zipFile saveFolder)

zip文件包含训练数据集和预训练的CGAN:

  • simulatedDataset-模拟信号及其对应的分类标签

  • GANModel-在模拟数据上训练生成器和鉴别器

加载训练数据集,将信号标准化,使其均值为零,单位方差为零。

负载(fullfile (saveFolder“simulatedDataset.mat”))%负载数据集meanFlow = mean(流量,2);flowNormalized = flow-meanFlow;stdFlow = std(flowNormalized(:));flowNormalized = flowNormalized/stdFlow;

正常信号标记为1,故障信号标记为2。

定义发电机网络

定义以下双输入网络,它生成给定随机值和相应标签的1 × 1 × 100数组的流量信号。

网络:

  • 通过自定义层将1 × 1 × 100的噪声数组投影并重新塑造为4 × 1 × 1024的数组。

  • 将类别标签转换为嵌入向量,并将它们重新塑造为4 × 1 × 1数组。

  • 沿着通道维度连接来自两个输入的结果。输出是一个4 × 1 × 1025的数组。

  • 使用一系列带有批量归一化和ReLU层的1-D转置卷积层,将生成的数组上采样为1201by -1 by-1数组。

要投影和重塑噪声输入,请使用自定义层projectAndReshapeLayer,作为支持文件附在本例中。金宝app的projectAndReshapeLayer对象使用全连接层放大输入,并将输出重塑为指定的大小。

要将标签输入网络,请使用imageInputLayer对象,并指定大小为1乘1。要嵌入和重塑标签输入,请使用自定义层embedAndReshapeLayer,作为支持文件附在本例中。金宝app的embedAndReshapeLayer对象使用嵌入和全连接操作将类别标签转换为指定大小的单通道数组。对于分类输入,使用100的嵌入维数。

发电机网络numFilters = 64;numLatentInputs = 100;projectionSize = [4 1 1024];numClasses = 2;embeddingDimension = 100;layersGenerator = [imageInputLayer([1 1 numLatentInputs],“归一化”“没有”“名字”“在”) projectAndReshapeLayer (projectionSize numLatentInputs,“项目”);concatenationLayer (3 2“名字”“猫”);transposedConv2dLayer (1 [5], 8 * numFilters,“名字”“tconv1”) batchNormalizationLayer (“名字”“bn1”‘ε’5 e-5) reluLayer (“名字”“relu1”转置conv2dlayer ([10 1],4*numFilters,“步”4“种植”(1 0),“名字”“tconv2”) batchNormalizationLayer (“名字”“bn2”‘ε’5 e-5) reluLayer (“名字”“relu2”转置conv2dlayer ([12 1],2*numFilters,“步”4“种植”(1 0),“名字”“tconv3”) batchNormalizationLayer (“名字”“bn3”‘ε’5 e-5) reluLayer (“名字”“relu3”转置conv2dlayer ([5 1],numFilters,“步”4“种植”(1 0),“名字”“tconv4”) batchNormalizationLayer (“名字”“bn4”‘ε’5 e-5) reluLayer (“名字”“relu4”转置conv2dlayer ([7 1],1,“步”,2,“种植”(1 0),“名字”“tconv5”));lgraphGenerator = layerGraph(layergenerator);图层= [imageInputLayer([1 1],“名字”“标签”“归一化”“没有”) embedAndReshapeLayer (projectionSize (1:2), embeddingDimension numClasses,“循证”));lgraphGenerator = addLayers(lgraphGenerator,layers);lgraphGenerator = connectLayers(lgraphGenerator,“循证”“猫/ in2”);

绘制生成器的网络结构。

情节(lgraphGenerator)

要使用自定义训练循环训练网络并启用自动区分,请将层图转换为adlnetwork对象。

dlnetGenerator = dlnetwork(lgraphGenerator);

定义鉴别器网络

定义下面的双输入网络,它对给定一组信号及其对应的标签的真实和生成的1201乘1信号进行分类。

这个网络:

  • 以120 × 1 × 1的信号作为输入。

  • 将类别标签转换为嵌入向量,并将其重塑为1201 × 1 × 1数组。

  • 沿着通道维度连接来自两个输入的结果。输出是一个1201 × 1 × 1025的数组。

  • 使用一系列带有泄漏ReLU层的1-D卷积层(尺度为0.2)将结果数组降采样为标量预测分数,这些数组是1乘1乘1的数组。

%鉴别器网络量表= 0.2;inputSize = [1201 1 1];layersDiscriminator = [imageInputLayer(inputSize,“归一化”“没有”“名字”“在”) concatenationLayer (3 2“名字”“猫”)卷积2dlayer ([17 1],8*numFilters,“步”,2,“填充”(1 0),“名字”“conv1”) leakyReluLayer(规模、“名字”“lrelu1”)卷积2dlayer ([16 1],4*numFilters,“步”4“填充”(1 0),“名字”“conv2”) leakyReluLayer(规模、“名字”“lrelu2”)卷积2dlayer ([16 1],2*numFilters,“步”4“填充”(1 0),“名字”“conv3”) leakyReluLayer(规模、“名字”“lrelu3”)卷积2dlayer ([8 1],numFilters,“步”4“填充”(1 0),“名字”“conv4”) leakyReluLayer(规模、“名字”“lrelu4”)卷积2dlayer ([8 1],1,“名字”“conv5”));lgraphDiscriminator = layerGraph(layersDiscriminator);图层= [imageInputLayer([1 1],“名字”“标签”“归一化”“没有”) embedAndReshapeLayer (inputSize embeddingDimension numClasses,“循证”));lgraphDiscriminator = addLayers(lgraphDiscriminator,layers);lgraphDiscriminator = connectLayers(lgraphDiscriminator,“循证”“猫/ in2”);

绘制鉴别器的网络结构。

情节(lgraphDiscriminator)

要使用自定义训练循环训练网络并启用自动区分,请将层图转换为adlnetwork对象。

dlnetDiscriminator = dlnetwork(lgraphDiscriminator);

火车模型

使用自定义训练循环训练CGAN模型。遍历训练数据并在每次迭代中更新网络参数。为了监控训练进度,使用两个固定的随机值数组来显示生成的健康和故障信号,并输入到生成器中,以及两个网络的分数图。

对于每个纪元,洗牌训练数据并在小批量数据上循环。

对于每个小批量:

  • 生成一个dlarray(深度学习工具箱)对象,该对象包含生成器网络的随机值数组。

  • 对于GPU训练,将数据转换为agpuArray(并行计算工具箱)对象。

  • 评估模型梯度使用dlfeval(深度学习工具箱)还有辅助函数modelGradients

  • 方法更新网络参数adamupdate(深度学习工具箱)函数。

辅助函数modelGradients将生成器网络和鉴别器网络、一小批输入数据和一组随机值作为输入,并返回损失相对于网络中可学习参数的梯度和两个网络的分数。损失函数定义在辅助函数中ganLoss

指定培训项目

设置训练参数。

参数个数。numLatentInputs = numLatentInputs;参数个数。numClasses = numClasses;参数个数。sizeData = [inputSize length(labels)];参数个数。numEpochs = 1000;参数个数。miniBatchSize = 256;指定Adam优化器的选项参数个数。learnRate = 0.0002;参数个数。gradientDecayFactor = 0.5;参数个数。squaredGradientDecayFactor = 0.999;

设置执行环境以在CPU上运行cgan。在图形处理器上运行cgan,请设置executionEnvironmentgpu或在实时编辑器中选择“在GPU上运行”选项。使用GPU需要并行计算工具箱™。要查看支持哪些gpu,请参见金宝appGPU支金宝app持版本(并行计算工具箱)

executionEnvironment =“cpu”;参数个数。executionEnvironment = executionEnvironment;

通过加载预训练的网络来跳过训练过程。要训练计算机上的网络,请设置trainNow真正的或者在实时编辑器中选择“Train CGAN now”选项。

trainNow =如果trainNow培训CGAN[dlnetGenerator,dlnetDiscriminator] = trainGAN(dlnetGenerator, dlnetDiscriminator)...dlnetDiscriminator flowNormalized,标签,params);% #好吧其他的%使用预训练的CGAN(默认)负载(fullfile (tempdir“PumpSignalGAN”“GANModel.mat”))%负载数据集结束

下面的训练图显示了生成器和鉴别器网络的分数示例。要了解更多关于如何解释网络分数的信息,请参见监控GAN培训进度,识别常见故障模式(深度学习工具箱).在本例中,生成器和判别器的分数都收敛于0.5,说明训练效果很好。

合成流信号

创建一个dlarray对象,该对象包含一批要输入到生成器网络的2000个1 × 1 × 100随机值数组。重置随机数发生器可重现的结果。

rng默认的numTests = 2000;ZNew = randn(1,1,numLatentInputs,numTests,“单一”);dlZNew = dlarray(ZNew,“SSCB”);

指定前1000个随机数组是正常的,其余的是故障的。

TNew = ones(1,1,1,numTests,“单一”);TNew(1,1,1,numTests/2+1:end) = single(2);dlTNew = dlarray(TNew,“SSCB”);

为了使用GPU生成信号,需要将数据转换为gpuArray对象。

如果executionEnvironment = =“图形”dlZNew = gpuArray(dlZNew);dlTNew = gpuArray(dlTNew);结束

使用预测使用随机值和标签的1 × 1 × 100数组在生成器上执行函数,生成合成信号并恢复对原始流信号执行的标准化步骤。

dlXGeneratedNew = predict(dlnetGenerator,dlZNew,dlTNew)*stdFlow+meanFlow;

信号特征可视化

与图像和音频信号不同,一般信号具有使人类难以感知的特征。为了比较真实信号与生成信号或健康信号与故障信号,可以对真实信号的统计特征应用主成分分析(PCA),然后将生成信号的特征投影到同一PCA子空间。

特征提取

将原始的真实信号和生成的信号合并到一个数据矩阵中。使用helper函数extractFeatures提取特征,包括常见信号统计量,如均值和方差以及频谱特征。

idxGenerated = 1:numTests;idxReal = numTests+1:numTests+size(流量,2);XGeneratedNew = squeeze(extractdata(gather(dlXGeneratedNew)));x = [XGeneratedNew single(flow)];特征= 0(大小(x,2),14,“喜欢”, x);ii = 1:size(x,2) features(ii,:) = extractFeatures(x(:,ii));结束

每行特性对应于一个信号的特征。

修改生成的健康信号和故障信号的标签,以及实际健康信号和故障信号的标签。

L = [squeeze(TNew)+2;labels.'];

这些标签现在有以下定义:

  • 1 -生成健康信号

  • 2 -产生故障信号

  • 3 -真正健康的信号

  • 4 -真实故障信号

主成分分析

对真实信号的特征进行PCA,并将生成的信号的特征投影到同一PCA子空间。W是系数和Y是分数。

% PCA通过svdfeaturesReal = features(idxReal,:);mu = mean(featuresReal,1);[~,S,W] = svd(featuresReal-mu);S = diag(S);Y = (features-mu)*W;

从奇异向量年代中,前三个奇异值占能量的99%年代.您可以通过利用前三个主成分来可视化信号特征。

sum (S (1:3)) / (S)和
ans =0.9923

用前三个主成分绘制所有信号的特征。在PCA子空间中,生成信号的分布与实际信号的分布相似。

idxHealthyR = L==1;idxFaultR = L==2;idxHealthyG = L==3;idxFaultG = L==4;pp = Y(:,1:3);图scatter3 (pp (idxHealthyR, 1)、pp (idxHealthyR, 2)、pp (idxHealthyR, 3),“o”)包含(“第一主成分”) ylabel (“第二主成分”) zlabel (“第三主成分”)举行scatter3 (pp (idxFaultR, 1), pp (idxFaultR, 2)、pp (idxFaultR, 3),' d ') scatter3 (pp (idxHealthyG, 1)、pp (idxHealthyG, 2)、pp (idxHealthyG, 3),“年代”) scatter3 (pp (idxFaultG, 1)、pp (idxFaultG, 2)、pp (idxFaultG, 3),“+”) view(-10,20)真正的健康的“真正的问题”“生成健康”“生成错误的”...“位置”“最佳”)举行

为了更好地捕捉真实信号和生成信号之间的差异,使用前两个主成分绘制子空间。

视图(2)

健康信号和故障信号无论是否真实或生成,都位于PCA子空间的同一区域,说明生成的信号具有与真实信号相似的特征。

预测真实信号的标签

为了进一步说明CGAN的性能,基于生成的信号训练SVM分类器,然后预测真实信号是健康的还是故障的。

将生成的信号作为训练数据集,将真实信号作为测试数据集。将数字标签更改为字符向量。

标签= {“健康”“错误”};strL = LABELS([挤压(TNew); LABELS .']).';dataTrain = features(idxGenerated,:);dataTest = features(idxReal,:);labelTrain = strL(idxGenerated);labelTest = strL(idxReal);predictors = dataTrain;response = labelTrain;CVP = cvpartition(size(predictors,1),“KFold”5);

使用生成的信号训练SVM分类器。

SVMClassifier = fitcsvm(...预测(cvp.training (1):)...响应(cvp.training (1)),“KernelFunction”多项式的...“PolynomialOrder”,2,...“KernelScale”“汽车”...“BoxConstraint”, 1...“类名”、标签...“标准化”,真正的);

使用训练好的分类器获得真实信号的预测标签。该分类器的预测准确率达到90%以上。

actualValue = labelTest;predictedValue = predict(SVMClassifier,dataTest);predictAccuracy = mean(cellfun(@strcmp,actualValue,predictedValue))
predictAccuracy = 0.9460

使用混淆矩阵查看关于每个类别的预测性能的详细信息。混淆矩阵表明,在每个类别中,基于生成的信号训练的分类器都达到了很高的精度。

图confusionchart (actualValue predictedValue)

案例研究

比较真实信号和生成信号的频谱特征。由于GPU训练的不确定性行为,如果您自己训练CGAN模型,您的结果可能与本例中的结果不同。

泵的电机转速为950 rpm,或15.833 Hz,由于泵有三个气缸,预计流量的基本值为3倍15.833 Hz,或47.5 Hz,谐波值为47.5 Hz的倍数。绘制一个真实和生成的健康信号的频谱。从图中可以看出,生成的健康信号具有相对较高的47.5 Hz和2倍47.5 Hz的功率值,这与真实的健康信号完全相同。

Fs = 1000;pspectrum([x(:,1) x(:,2006)],Fs) set(gca,“XScale”“日志”)传说(“生成健康”真正的健康的

如果存在故障,泵电机转速15.833 Hz及其谐波将发生共振。绘制一种真实和产生的故障信号的谱图。产生的信号具有相对较高的功率值,约为15.833 Hz及其谐波,与实际故障信号相似。

pspectrum([x(:,1011) x(:,2100)],Fs) set(gca,“XScale”“日志”)传说(“生成错误的”“真正的问题”

为另一种真实和产生的故障信号绘制频谱。产生的故障信号的频谱特征与理论分析不太吻合,与实际故障信号有较大差异。CGAN仍有可能通过调整网络结构或超参数来改进。

pspectrum([x(:,1001) x(:,2600)],Fs) set(gca,“XScale”“日志”)传说(“生成错误的”“真正的问题”

计算时间

Simu金宝applink模拟大约需要14个小时来生成2000个泵流量信号。如果您有并行计算工具箱(parallel Computing Toolbox™),这个持续时间可以减少到8个并行工作人员的1.7小时左右。

CGAN需要1.5小时的训练,用NVIDIA Titan V GPU生成相同数量的合成数据需要70秒。

另请参阅

(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)|(并行计算工具箱)

相关的话题