主要内容

加速音频深度学习使用了基于gpu的特征提取

在本例中,您利用gpu的特征提取和增强减少训练所需的时间深度学习模型。你训练的模型是一个卷积神经网络(CNN)声学故障识别。

音频工具箱™包括gpuArray(并行计算工具箱)金宝app支持大多数特征提取器,包括受欢迎的等melSpectrogrammfcc。GPU支持的概述,请参阅金宝app代码生成和GPU的支持金宝app

负荷训练数据

下载并解压缩空气压缩机数据集[1]。这个数据集由空气压缩机的录音在健康状态或错误的7个州之一。

url =“//www.tatmou.com/金宝appsupportfiles/audio/AirCompressorDataset/AirCompressorDataset.zip”;downloadFolder = fullfile (tempdir,“AirCompressorDataset”);datasetLocation = tempdir;如果~ isfolder (fullfile (datasetLocation,“AirCompressorDataset”)loc = websave (downloadFolder、url);解压缩(loc fullfile (datasetLocation“AirCompressorDataset”))结束

创建一个audioDatastore对象来管理数据并把它分割为训练集和验证集。

广告= audioDatastore (downloadFolder,“IncludeSubfolders”,真的,“LabelSource”,“foldernames”);rng默认的[adsTrain, adsValidation] = splitEachLabel(广告,0.8);

可视化在训练集和验证集的文件数量。

uniqueLabels =独特(adsTrain.Labels);tblTrain = countEachLabel (adsTrain);tblValidation = countEachLabel (adsValidation);H =酒吧(uniqueLabels, [tblTrain。数,tblValidation.Count],“堆叠”);传奇(H, [“训练集”,“验证”),“位置”,“NorthEastOutside”)

选择随机绘图训练集的例子。每个记录有50000个样本在16岁千赫采样。

t = (0:5e4-1) / 16 e3;tiledlayout (4 2“TileSpacing”,“紧凑”,“填充”,“紧凑”)n = 1:元素个数(uniqueLabels) idx =找到(adsTrain.Labels = = uniqueLabels (n));[x, fs] = audioread (adsTrain.Files {idx (randperm(元素个数(idx), 1))});nexttile plotHandle =情节(t, x);如果7 n = = | | n = = 8包含(“秒”);其他的集(gca),“xtick”[])结束标题(string (uniqueLabels (n)));结束

数据预处理的CPU和GPU

在本例中,您进行特征提取和数据扩充而训练网络。在本节中,您定义特征提取和增强管道和管道在一个CPU上执行的速度比较对管道在GPU上执行的速度。该管道的输出是输入的CNN火车。

创建一个audioFeatureExtractor对象提取梅尔光谱使用200 ms梅尔女士5跳窗户。的输出提取是一个numHops- 128 - 1阵列。

afe = audioFeatureExtractor (“SampleRate”fs,“FFTLength”,4096,“窗口”,损害(圆(fs * 0.2),“周期”),“OverlapLength”而圆(fs * 0.195),“melSpectrum”,真正的);setExtractorParams (afe“melSpectrum”,“NumBands”,128);featureVector =提取(afe x);[numHops, numFeatures numChannels] =大小(featureVector)
numHops = 586
numFeatures = 128
numChannels = 1

深度学习的方法是用疯狂,本例中的训练数据集相对较小。使用混合[2]增强技术来有效地扩大训练集在混合,你合并两个音频信号的特征提取作为加权和。两个信号有不同的标签,标签分配到合并后的特征矩阵的概率分配基于混合系数。的混合增强实现支持对象,金宝app混合

创建管道来执行以下步骤:

  1. 提取log-mel谱图。

  2. 应用混合矩阵的特性。的混合金宝app支持对象输出单元阵列包含的特性和标签。

创建两个版本的管道进行比较:一个CPU上执行管道,并将原始音频信号转换为gpuArray所以,管道上执行你的GPU。

抵消=每股收益;adsTrainCPU =变换(adsTrain @ (x) log10(提取(afe x) +偏移量));mixerCPU =混合物(adsTrainCPU);adsTrainCPU =变换(adsTrainCPU @ (x,信息)混合(mixerCPU x,信息),“IncludeInfo”,真正的);adsTrainGPU =变换(adsTrain @gpuArray);adsTrainGPU =变换(adsTrainGPU @ (x) log10(提取(afe x) +偏移量));mixerGPU =混合物(adsTrainGPU);adsTrainGPU =变换(adsTrainGPU @ (x,信息)混合(mixerGPU x,信息),“IncludeInfo”,真正的);

验证组,应用特征提取管道而不是增加。因为你不是应用混合,创建一个数据存储单元阵列输出包含的特性和标签。再次创建一个验证管道上执行你的GPU和CPU上执行验证管道之一。

adsValidationGPU =变换(adsValidation @gpuArray);adsValidationGPU =变换(adsValidationGPU @ (x) {log10(提取(afe x) +偏移量)});adsValidationGPU =结合(adsValidationGPU arrayDatastore (adsValidation.Labels));adsValidationCPU =变换(adsValidation @ (x) {log10(提取(afe x) +偏移量)});adsValidationCPU =结合(adsValidationCPU arrayDatastore (adsValidation.Labels));

比较时间CPU和一个GPU来提取特征和执行数据增加。

抽搐2 = 1:元素个数(adsTrain.Files) x =阅读(adsTrainCPU);结束cpuPipeline = toc;重置(adsTrainCPU)抽搐2 = 1:元素个数(adsTrain.Files) x =阅读(adsTrainGPU);结束等待(gpuDevice)%完成确保所有计算gpuPipeline = toc;重置(adsTrainGPU)流([“读、提取和增强训练集(CPU): % 0.2 f秒\ n '“读、提取和增强训练集(GPU): % 0.2 f秒\ n '加速(CPU时间)/ (GPU): % 0.3 f \ n \ n '),cpuPipeline、gpuPipeline cpuPipeline / gpuPipeline)
读取、提取和增强训练集(CPU): 110.80秒阅读,提取,并提高训练集(GPU): 34.65秒加速(CPU时间)/ (GPU): 3.198

读取数据存储大量的总体时间有助于管道。比较的提取和增强显示了一个更大的加速。比较只是特征提取上的GPU和CPU。

x =阅读(广告);提取(afe x);%支付初始化成本以外的时间循环抽搐2 = 1:元素个数(adsTrain.Files)特性= log10(提取(afe x) +偏移量);结束cpuFeatureExtraction = toc;x = gpuArray (x);%支付初始化成本以外的时间循环提取(afe x);抽搐2 = 1:元素个数(adsTrain.Files)特性= log10(提取(afe x) +偏移量);结束等待(gpuDevice)%完成确保所有计算gpuFeatureExtraction = toc;流([从训练集的提取特征(CPU): % 0.2 f秒\ n '从训练集的提取特征(GPU): % 0.2 f秒\ n '加速(CPU时间)/ (GPU): % 0.3 f \ n \ n '),cpuFeatureExtraction、gpuFeatureExtraction cpuFeatureExtraction / gpuFeatureExtraction)
从训练集提取特征(CPU): 50.57秒从训练集提取特征(GPU): 4.48秒加速(CPU时间)/ (GPU): 11.299

定义网络

定义一个卷积神经网络,以增强梅尔声谱图作为输入。这个网络应用一个卷积与3 x3的内核层组成的48个过滤器,紧随其后的是一批标准化层和ReLU激活层。然后使用max池崩溃时间维度层。最后,池层是减少使用的输出完全连接层softmax和分类层紧随其后。看到深度学习层的列表(深度学习工具箱)为更多的信息。

numClasses =元素个数(类别(adsTrain.Labels));图象尺寸= [numHops, afe.FeatureVectorLength];层= [imageInputLayer图象尺寸,“归一化”,“没有”现年48岁的)convolution2dLayer (3“填充”,“相同”)batchNormalizationLayer reluLayer maxPooling2dLayer ([numHops 1]) fullyConnectedLayer (numClasses) softmaxLayer classificationLayer (“类”类别(adsTrain.Labels));];

定义训练选项,使用trainingOptions(深度学习工具箱)。设置ExecutionEnvironmentmulti-gpu利用多个gpu,如果可用。否则,你可以设置ExecutionEnvironmentgpu。在这个例子中使用的计算机访问四个泰坦V GPU设备。在这个例子中,网络训练总是利用gpu。

miniBatchSize = 128;选择= trainingOptions (“亚当”,“洗牌”,“every-epoch”,“MaxEpochs”现年40岁的“LearnRateSchedule”,“分段”,“LearnRateDropPeriod”15岁的“LearnRateDropFactor”,0.2,“MiniBatchSize”miniBatchSize,“阴谋”,“训练进步”,“详细”假的,“ValidationData”adsValidationCPU,“ValidationFrequency”、装天花板(元素个数(adsTrain.Files) / miniBatchSize),“ExecutionEnvironment”,“multi-gpu”);

列车网络的

列车网络的使用CPU-Based预处理

调用trainNetwork(深度学习工具箱)列车网络为特征提取管道使用您的CPU。网络培训的执行环境是你GPU(年代)。

抽搐净= trainNetwork (adsTrainCPU层,选项);

cpuTrainTime = toc;

列车网络使用了基于gpu的预处理

培训方案的验证数据替换为基于gpu的管道。列车网络使用GPU (s)的特征提取。网络培训的执行环境是你GPU(年代)。

选项。ValidationData = adsValidationGPU;抽搐净= trainNetwork (adsTrainGPU层,选项);

gpuTrainTime = toc;

CPU相比,基于gpu的预处理

打印的计时结果使用CPU对特征提取和增强训练,和培训使用GPU (s)进行特征提取和扩充。

流([的培训时间(CPU): % 0.2 f秒\ n '培训时间(GPU): % 0.2 f秒\ n '加速(CPU时间)/ (GPU): % 0.3 f \ n \ n '),cpuTrainTime、gpuTrainTime cpuTrainTime / gpuTrainTime)
培训时间(CPU): 4242.82秒(GPU)培训时间:731.77秒加速(CPU时间)/ (GPU): 5.798

CPU和GPU推理性能进行比较

比较所花费的时间进行预测在一个大约3夹在特征提取GPU与CPU上执行。在这两种情况下,网络预测会发生在你的GPU。

signalToClassify =阅读(广告);gpuFeatureExtraction = gputimeit(@()预测(净,log10(提取(afe, gpuArray (signalToClassify)) +偏移量)));cpuFeatureExtraction = gputimeit(@()预测(净,log10(提取(afe (signalToClassify)) +偏移量)));流([预测时间3 s的数据(CPU)特征提取:% 0.2 f \ n的女士预测时间3 s的数据(特征提取在GPU): % 0.2 f \ n的女士加速(CPU时间)/ (GPU): % 0.3 f \ n \ n '),cpuFeatureExtraction * 1 e3, gpuFeatureExtraction * 1 e3, cpuFeatureExtraction / gpuFeatureExtraction)
预测时间3 s的数据(特征提取在CPU): 41.62女士预测时间3 s的数据(特征提取在GPU): 7.71毫秒加速(CPU时间)/ (GPU): 5.397

比较所花费的时间进行预测一组3秒钟视频特征提取在GPU上执行时(s)和CPU。在这两种情况下,网络预测发生在你的GPU (s)。

adsValidationGPU =变换(adsValidation @ (x) gpuArray (x));adsValidationGPU =变换(adsValidationGPU @ (x) {log10(提取(afe x) +偏移量)});adsValidationCPU =变换(adsValidation @ (x) {log10(提取(afe x) +偏移量)});gpuFeatureExtraction = gputimeit(@()预测(adsValidationGPU净,“ExecutionEnvironment”,“multi-gpu”));cpuFeatureExtraction = gputimeit(@()预测(adsValidationCPU净,“ExecutionEnvironment”,“multi-gpu”));流([验证的预测时间设置(CPU)特征提取:% 0.2 f s \ n”验证的预测时间设置在GPU(特征提取):% 0.2 f s \ n”加速(CPU时间)/ (GPU): % 0.3 f \ n \ n '),cpuFeatureExtraction、gpuFeatureExtraction cpuFeatureExtraction / gpuFeatureExtraction)
预测时间验证设置CPU(特征提取):34.11秒预测时间验证设置在GPU(特征提取):5.53秒加速(CPU时间)/ (GPU): 6.173

结论

众所周知,你可以减少所花费的时间训练一个网络利用GPU设备。这使您能够更快地迭代,最终系统开发。在许多培训设置,您可以获得额外的性能通过利用GPU设备进行特征提取和数据增大。这个例子显示了一个显著降低总体时间训练CNN时利用GPU设备进行特征提取和数据增大。此外,利用GPU设备特征提取在推理时,单个的观察数据和数据集,实现了显著的性能提升。

金宝app支持功能

混合

支持对象金宝app,混合,被放置在当前文件夹当你打开这个例子。

类型混合
classdef混合物<处理%混合物混合数据增加%混合器=混合物(augDatastore)创建了一个对象,可以在一组随机比例混合特性%,然后从概率设置输出%标签的两个原始信号。% %混合属性:% MixProbability -混合概率% AugDatastore增加数据存储% %混合方法:%组合,应用混合% % 2021年版权MathWorks公司性质(SetAccess =公共GetAccess =公共)% MixProbability混合概率%指定的概率混合应用的标量%范围[0,1]。如果未指定,MixProbability默认为1/3。MixProbability (1, 1) {mustBeNumeric} = 1/3;终端属性(SetAccess =不可变,GetAccess =公共)% AUGDATASTORE增加数据存储%指定一个数据存储的混合信号。%数据存储必须包含一个标签的信息回来阅读。%这个属性是不可变的,这意味着它不能改变%后施工。AugDatastore结束方法函数obj =混合物(AugDatastore) obj。AugDatastore = AugDatastore;结束函数[dataOut infoOut] =混合(obj, x, infoIn) %混合应用混合% [dataOut infoOut] =混合(搅拌机、x, infoIn) %概率混合输入,x,及其相关的标签中包含infoIn %随机信号的增强数据存储。%输出,dataOut,是一个两列的单元阵列。 The % first column contains the features and the second column % contains the label. if rand > obj.MixProbability % Only mix ~1/3 the dataset % Randomly set mixing coefficient. Draw from a normal % distribution with mean 0.5 and contained within [0,1]. lambda = max(min((randn./10)+0.5,1),0); % Read one file from the augmentation datastore. subDS = subset(obj.AugDatastore,randi([1,numel(obj.AugDatastore.UnderlyingDatastores{1}.Files)])); [y,yInfo] = read(subDS); % Mix the features element-by-element according to lambda. dataOut = lambda*x + (1-lambda)*y; % Set the output label probabilistically based on the mixing coefficient. if lambda < rand labelOut = yInfo.Label; infoOut.Label = labelOut; else labelOut = infoIn.Label; end infoOut.Label = labelOut; % Combine the output data and labels. dataOut = [{dataOut},{labelOut}]; else % Do not apply mixing dataOut = [{x},{infoIn.Label}]; infoOut = infoIn; end end end end

引用

[1]Verma Nishchal K。,等。基于“智能状态监测用空气压缩机的声学信号。”IEEE Transactions on Reliability, vol. 65, no. 1, Mar. 2016, pp. 291–309. DOI.org (Crossref), doi:10.1109/TR.2015.2459684.

[2]Huszar,费伦茨。“混合:视数据增大。”InFERENCe. November 03, 2017. Accessed January 15, 2019.https://www.inference.vc/mixup-data-dependent-data-augmentation/