主要内容

基于GPU加速的小波时间散射语音数字识别

这个例子展示了如何使用小波散射特征加速计算gpuArray(并行计算工具箱).您必须具有并行计算工具箱™和受支持的GPU。金宝app看到GPU计算要求(并行计算工具箱)获取详细信息。本例使用计算能力为7.0的NVIDIA Titan V GPU。如果您希望比较GPU和CPU的性能,计算散射变换的示例部分提供了使用GPU或CPU的选项。

中发现的散射变换的独占CPU版本基于小波散射和深度学习的语音数字识别

数据

克隆或下载免费语音数字数据集(FSDD),可在https://github.com/Jakobovski/free-spoken-digit-dataset.FSDD是一个开放的数据集,这意味着它可以随着时间的推移而增长。本例使用了在2020年8月20日提交的版本,该版本包含了从6位说话者获得的3000个英语数字0到9的录音。采样频率为8000hz。

使用audioDatastore管理数据访问,确保录音随机分为训练集和测试集。设置位置属性到计算机上FSDD录音文件夹的位置。在本例中,数据存储在下面的文件夹中tempdir

位置= fullfile(tempdir,“free-spoken-digit-dataset”“录音”);ads = audioDatastore(location);

辅助函数,helpergenLabels,定义在本例的末尾,它从FSDD文件创建标签的分类数组。列出类和每个类中的示例数量。

ads. labels = helpergenLabels(广告);总结(ads.Labels)
0 300 1 300 2 300 3 300 4 300 5 300 6 300 7 300 8 300 9 300

FSDD数据集由10个平衡的类组成,每个类有300个记录。FSDD中的录音时长不相等。通读FSDD文件,构造一个信号长度的直方图。

LenSig = 0(数字(ads.Files),1);Nr = 1;Hasdata(广告)数字=读(广告);LenSig(nr) =数字(数字);Nr = Nr +1;结束重置(广告)直方图(LenSig)网格包含(“信号长度(样本)”) ylabel (“频率”

直方图显示记录长度的分布正偏。为了分类,本例使用8192个样本的公共信号长度。值8192是一个保守的选择,确保截断较长的录音不会影响(切断)语音内容。如果信号长度大于8192个样本,即1.024秒,则记录被截断为8192个样本。如果信号的长度小于8192个样本,则信号被对称前置,并在长度为8192个样本的基础上附加零。

小波时间散射

使用0.22秒的不变尺度创建一个小波时间散射网络。由于特征向量将通过对所有时间样本的散射变换求平均值来创建,因此设置OversamplingFactor2。将该值设置为2将导致每条路径的散射系数数量相对于临界下采样值增加4倍。

小波散射(“SignalLength”, 8192,“InvarianceScale”, 0.22,...“SamplingFrequency”, 8000,“OversamplingFactor”2);

散射网络的设置导致了326条路径。您可以用下面的代码来验证这一点。

[~,npaths] = paths(sn);总和(npaths)
Ans = 326

将FSDD分为训练集和测试集。将80%的数据分配给训练集,并保留20%的数据给测试集。训练数据用于训练基于散射变换的分类器。测试数据用于评估模型泛化未见数据的能力。

rng默认的;广告= shuffle(广告);[adsTrain,adsTest] = splitEachLabel(ads,0.8);总结(adsTrain.Labels)
0 240 1 240 2 240 3 240 4 240 5 240 6 240 7 240 8 240 9 240
总结(adsTest.Labels)
0 60 1 60 2 60 3 60 4 60 5 60 6 60 7 60 8 60 9 60

形成一个8192 × 2400的矩阵,其中每一列都是一个语音数字记录。辅助函数helperReadSPData将数据截断或填充为8192的长度,并按其最大值对每条记录进行规范化。helper函数将数据强制转换为单一精度。

Xtrain = [];scatds_Train = transform(adsTrain,@(x)helperReadSPData(x));hasdata(scatds_Train) smat = read(scatds_Train);Xtrain = cat(2,Xtrain,smat);结束

对保留的测试集重复该过程。得到的矩阵是8192 × 600。

Xtest = [];scatds_Test = transform(adsTest,@(x)helperReadSPData(x));hasdata(scatds_Test) smat = read(scatds_Test);Xtest = cat(2,Xtest,smat);结束

将散射变换应用于训练集和测试集。将训练和测试数据集移动到使用的GPUgpuArray.使用gpuArray支持cuda的NVIDIA GPU提供了显著的加速。利用这种散射网络、批处理大小和GPU, GPU实现计算散射特征的速度比CPU版本快大约15倍。如果不需要使用该图形处理器,请设置useGPU.的值也可以替换useGPU比较GPU和CPU的性能。

useGPU =真正的如果useGPU Xtrain = gpuArray(Xtrain);Strain = sn.featureMatrix(Xtrain);Xtrain = gather(Xtrain);Xtest = gpuArray(Xtest);Stest = sn.featureMatrix(Xtest);Xtest = gather(Xtest);其他的Strain = sn.featureMatrix(Xtrain);Stest = sn.featureMatrix(Xtest);结束

获得训练集和测试集的散射特征。

TrainFeatures = Strain(2:end,:,:);TrainFeatures = squeeze(mean(TrainFeatures,2))';TestFeatures = Stest(2:end,:,:);TestFeatures = squeeze(mean(TestFeatures,2))';

这个例子使用了一个二次多项式核的支持向量金宝app机(SVM)分类器。将支持向量机模型与散射特征进行拟合。

template = templateSVM(...“KernelFunction”多项式的...“PolynomialOrder”2,...“KernelScale”“汽车”...“BoxConstraint”, 1...“标准化”,真正的);分类svm = fitcecoc(...TrainFeatures,...adsTrain。标签,...“学习者”模板,...“编码”“onevsone”...“类名”分类({' 0 '' 1 '' 2 '“3”“4”“5”“6”“7”“8”“9”}));

使用k-fold交叉验证来预测模型的泛化精度。将训练集分成五组进行交叉验证。

partitionedModel = crossval(classificationSVM,“KFold”5);[validationforecasts, validationScores] = kfoldPredict(partitionedModel);validationAccuracy = (1 - kfoldLoss(partitionedModel,“LossFun”“ClassifError”)) * 100
validationAccuracy = 97.2500

估计泛化精度约为97%。现在使用SVM模型来预测保留测试集。

predLabels = predict(classificationSVM,TestFeatures);testAccuracy = sum(predLabels==adsTest.Labels)/numel(predLabels)*100
testAccuracy = 97

在保留测试集上,准确度也约为97%。

用混淆图总结模型在测试集上的表现。通过使用列和行摘要显示每个类的精度和召回率。混淆图底部的表格显示了每个类的精度值。混淆图右侧的表格显示召回值。

图(“单位”“归一化”“位置”,[0.2 0.2 0.5 0.5]);ccscat = confusionchart(adsTest.Labels,predLabels);ccscat。Title =“小波散射分类”;ccscat。ColumnSummary =“column-normalized”;ccscat。RowSummary =“row-normalized”

作为最后一个例子,从数据集中读取前两条记录,计算散射特征,并使用散射特征训练的SVM预测语音数字。

重置(广告);sig1 = helperReadSPData(read(ads));scat1 = sn.featureMatrix(sig1);Scat1 = mean(Scat1 (2:end,:),2)';plab1 = predict(classificationSVM,scat1);

读下一条记录并预测数字。

sig2 = helperReadSPData(read(ads));scat2 = sn.featureMatrix(sig2);Scat2 = mean(Scat2 (2:end,:),2)';plab2 = predict(classificationSVM,scat2);
T = 0:1/8000:(8192*1/8000)-1/8000;Plot (t,[sig1 sig2])网格传奇(char (plab1), char (plab2))标题(“语音数字预测- GPU”

附录

本例中使用了以下helper函数。

helpergenLabels—根据FSDD中的文件名生成标签。

函数标签= helpergenLabels(广告)此函数仅在小波工具箱示例中使用。可能是这样%将在将来的版本中更改或删除。tmp = cell(数字(ads.Files),1);表达=“[0 - 9]+ _”nf = 1: number (ads.Files) idx = regexp(ads.Files{nf},表达式);tmp{nf} = ads.Files{nf}(idx);结束标签=分类(tmp);结束

helperReadSPData-确保每个语音数字录音长度为8192个样本。

函数x = helperReadSPData(x)此函数仅用于使用小波工具箱的示例。它可能会改变%将在未来的版本中删除。N =数字(x);如果N > 8192 x = x(1:8192);elseifN < 8192 pad = 8192-N;Prepad =地板(pad/2);Postpad = cell (pad/2);X = [0 (prepad,1);x;0 (postpad 1)];结束X = single(X /max(abs(X)));结束

另请参阅

相关的例子

更多关于