主要内容

使用条件GAN生成合成信号

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

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

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

CGAN用于信号合成

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

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

  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 =意味着(流,2);flowNormalized = flow-meanFlow;stdFlow =性病(flowNormalized (:));flowNormalized = flowNormalized / stdFlow;

健康信号标记为1,故障信号标记为2。

定义发电机网络

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

网络:

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

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

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

  • 使用一系列带有批处理归一化和ReLU层的一维转置卷积层将得到的数组向上采样到1201乘1乘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”) transposedConv2dLayer (4 * numFilters [10 1],“步”4“种植”(1 0),“名字”“tconv2”) batchNormalizationLayer (“名字”“bn2”‘ε’5 e-5) reluLayer (“名字”“relu2”) transposedConv2dLayer (2 * numFilters (12 - 1),“步”4“种植”(1 0),“名字”“tconv3”) batchNormalizationLayer (“名字”“bn3”‘ε’5 e-5) reluLayer (“名字”“relu3”1) transposedConv2dLayer ([5], numFilters,“步”4“种植”(1 0),“名字”“tconv4”) batchNormalizationLayer (“名字”“bn4”‘ε’5 e-5) reluLayer (“名字”“relu4”1) transposedConv2dLayer ([7], 1“步”,2,“种植”(1 0),“名字”“tconv5”));lgraphGenerator = layerGraph (layersGenerator);[imageInputLayer([1 1],]),“名字”“标签”“归一化”“没有”) embedAndReshapeLayer (projectionSize (1:2), embeddingDimension numClasses,“循证”));lgraphGenerator = addLayers (lgraphGenerator层);lgraphGenerator = connectLayers (lgraphGenerator,“循证”“猫/ in2”);

绘制发电机的网络结构。

情节(lgraphGenerator)

为了使用自定义的训练循环来训练网络并使其能够自动区分,将层图转换为dlnetwork对象。

dlnetGenerator = dlnetwork (lgraphGenerator);

定义鉴别器网络

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

这个网络:

  • 以1201乘1乘1的信号作为输入。

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

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

  • 向下采样得到的数组为标量预测分数,这是1 × 1 × 1的数组,使用一系列一维卷积层和尺度为0.2的泄漏ReLU层。

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

绘出鉴别器的网络结构。

情节(lgraphDiscriminator)

为了使用自定义的训练循环来训练网络并使其能够自动区分,将层图转换为dlnetwork对象。

dlnetDiscriminator = dlnetwork (lgraphDiscriminator);

火车模型

使用自定义训练循环训练CGAN模型。在每次迭代时循环训练数据并更新网络参数。为了监控训练进程,使用两个固定的随机值阵列,以及两个网络的得分图,来显示生成的健康和错误信号。

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

为每个mini-batch:

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

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

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

  • 使用adamupdate(深度学习工具箱)函数。

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

指定培训选项

设置训练参数。

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

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

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

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

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

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

合成流信号

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

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

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

TNew = 1 (1, 1, 1, numTests,“单一”);TNew (1, 1, 1, numTests / 2 + 1:结束)=单(2);dlTNew = dlarray (TNew,“SSCB”);

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

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

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

dlXGeneratedNew =预测(dlnetGenerator dlZNew dlTNew) * stdFlow + meanFlow;

信号特征可视化

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

特征提取

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

idxGenerated = 1: numTests;idxReal = numTests + 1: numTests +大小(流,2);XGeneratedNew =挤压(extractdata(收集(dlXGeneratedNew)));x = [XGeneratedNew single(flow)];特点= 0(大小(x, 2), 14日“喜欢”, x);ii = 1:size(x,2) feature (ii,:) = extractFeatures(x(:,ii));结束

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

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

L =[挤压(TNew) + 2;标签。');

标签现在有这些定义:

  • 1 -产生健康的信号

  • 2 -产生错误信号

  • 3 -真正的健康信号

  • 4 -真实的故障信号

主成分分析

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

% PCA通过svdfeaturesReal =特性(idxReal:);μ=意味着(featuresReal, 1);[~ S W] =圣言(featuresReal-mu);S =诊断接头(年代);Y = (features-mu) * W;

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

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

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

idxHealthyR = L = = 1;idxFaultR = L = = 2;idxHealthyG = L = = 3;idxFaultG = L = = 4;页= 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),“+”(-10年,20)传说)视图(真正的健康的“真正的问题”“生成健康”“生成错误的”...“位置”“最佳”)举行

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

视图(2)

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

预测真实信号的标签

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

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

标签= {“健康”“错误”};strL =标签([挤压(TNew);标签。”)。“;dataTrain =特性(idxGenerated:);人数(=特性(idxReal:);labelTrain = strL (idxGenerated);labelTest = strL (idxReal);预测= dataTrain;响应= labelTrain;本量利= cvpartition(大小(预测,1),“KFold”5);

使用生成的信号训练支持向量机分类器。

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

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

actualValue = labelTest;predictedValue =预测(SVMClassifier、人数();predictAccuracy =意味着(cellfun (@strcmp, actualValue predictedValue))
predictAccuracy = 0.9460

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

图confusionchart (actualValue predictedValue)

案例研究

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

该泵的电机转速为950转/分钟,或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)组(gca),“XScale”“日志”)传说(“生成健康”真正的健康的

如果存在故障,在泵电机转速15.833 Hz及其谐波处会出现共振。绘制一个真实的和产生的故障信号的频谱。产生的信号在15.833 Hz左右具有较高的功率值,其谐波与真实故障信号相似。

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

为另一个真实的和产生的错误信号绘制频谱。所产生的故障信号的频谱特性与理论分析结果不符,与实际故障信号存在一定的差异。通过调整网络结构或超参数,仍有可能改进CGAN。

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

计算时间

Simu金宝applink仿真需要大约14个小时来生成2000个泵流量信号。如果您有parallel Computing Toolbox™,那么使用8个并行工作器,这个持续时间可以减少到大约1.7小时。

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

另请参阅

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

相关的话题