主要内容

小波时间散射与GPU加速 - 口语数字识别

此示例显示如何加速使用小波散射功能的计算GPUArray.(并行计算工具箱)。您必须具有并行计算工具箱™和支持的GPU。金宝app看GPU通金宝app过发布支持(并行计算工具箱)有关详细信息。此示例使用NVIDIA Titan V GPU,具有计算能力7.0。如果您希望比较GPU与CPU性能,计算散射变换的示例的部分提供了使用GPU或CPU的选项。

此示例再现在发现的散射变换的完全CPU版本用小波散射和深度学习的口语数字识别

数据

克隆或下载免费口语数字数据集(FSDD),可用https://github.com/jakobovski/free-spoken-digit-dataset.。FSDD是一个打开的数据集,这意味着它可以随着时间的推移而增长。此示例使用08/20/2020提交的版本,该版本由六位扬声器获​​得的英语数字0到9的3000个录制组成。数据以8000 Hz采样。

采用audiodatastore.管理数据访问并确保将录制随机分为培训和测试集。设定地点属性到计算机上FSDD录制文件夹的位置。在此示例中,数据存储在文件夹中Tempdir.

位置= fullfile(tempdir,'自由发言 -  DataSet''录音');广告= audiodatastore(位置);

辅助功能,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 = Zeros(Numel(Ads.Files),1);nr = 1;尽管hasdata(广告)数字=读取(广告);lensig(nr)= numel(数字);nr = nr + 1;结尾重置(广告)直方图(Lensig)网格Xlabel('信号长度(样本)')ylabel('频率'

直方图表明记录长度的分布是正倾斜的。对于分类,该示例使用8192个样本的公共信号长度。值8192,保守的选择,确保截断较长的记录不会影响语音内容的(切断)。如果信号大于8192个样本,或者长度为1.024秒,则记录被截断至8192个样本。如果信号长度小于8192个样品,则信号对称前后,并附有零化为8192个样品的长度。

小波时间散射

使用0.22秒的不变刻度创建小波时间散射网络。因为将通过在所有时间样本上平均散射变换来创建特征向量,所以设置过度采伐物料2.将值设置为2将导致每个路径的散射系数的数量增加,相对于批判性下采样值。

Sn =小波示踪剂('signallength'8192,'invariarcescale',0.22,......'采样频率',8000,“过度采样物料”,2);

散射网络的设置导致326个路径。您可以使用以下代码验证此代码。

[〜,npaths] =路径(SN);总和(npaths)
ANS = 326.

将FSDD拆分为培训和测试集。将80%的数据分配给培训集并保留测试集20%。培训数据用于基于散射变换训练分类器。测试数据用于评估模型概括到未完成数据的能力。

RNG.默认;广告= Shuffle(广告);[adstrain,adstest] = splitheachlabel(广告,0.8);摘要(adstrain.labels)
0 240 1 240 2 240 3 240 4 240 5 240 6 240 7 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,并按其最大值标准化每个记录。辅助功能将数据投入到单精度。

XTrain = [];scatds_train = transform(adstrain,@(x)helperreadspdata(x));尽管hasdata(scatds_train)smat = read(scatds_train);Xtrain =猫(2,XTrain,Smat);结尾

重复保持测试集的过程。得到的矩阵为8192-by-600。

xtest = [];scatds_test = transform(adstest,@(x)helperreadspdata(x));尽管hasdata(scatds_test)smat = read(scatds_test);xtest =猫(2,xtest,smat);结尾

将散射变换应用于训练和测试集。将培训和测试数据集移动到GPUGPUArray.。指某东西的用途GPUArray.使用CUDA的NVIDIA GPU提供了显着的加速度。通过这种散射网络,批量大小和GPU,GPU实现将散射特征计算大约比CPU版本快15倍。如果您不希望使用GPU,请设置使用gpu.错误的。您也可以替代值使用gpu.比较GPU与CPU性能。

使用gpu =真的;如果使用gpu xtrain = gpuarray(xtrain);应变= sn.featurematrix(xtrain);XTrain =聚集(XTrain);xtest = gpuarray(xtest);stest = sn.featurematrix(xtest);xtest =聚集(xtest);别的应变= sn.featurematrix(xtrain);stest = sn.featurematrix(xtest);结尾

获取培训和测试集的散射功能。

训练=菌株(2:结束,:,:);训练费用=挤压(平均(训练训练,2))';testfeatures =最好(2:结束,:,:);testfeatures =挤压(平均值(testfeatures,2))';

此示例使用带有二次多项式内核的支持向量机金宝app(SVM)分类器。将SVM模型适合散射功能。

template = templatesvm(......'骨箱''多项式'......'polynomialOrder'2,......'kernelscale''汽车'......'boxconstraint',1,......'标准化', 真的);Classificationsvm = fitcecoc(......训练疗法,......adstrain.labels,......'学习者', 模板,......'编码''Onevsone'......'classnames',分类({'0';'1';'2';'3';'4';'5';'6';'7';'8';'9'}));

采用K.- 折叠交叉验证以预测模型的泛化精度。将培训拆分成五组进行交叉验证。

partitionedmodel = crossval(分类vm,'kfold'5);[验证预期,验证算法] = kfoldpredict(partitionedmodel);ValidationAccuracy =(1  -  Kfoldloss(PartitionedModel,'lockfun''classiferror'))* 100
ValidationAccuracy = 97.2500.

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

predlabels = predict(分类,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 ='列 - 归一化';ccscat.rowsummary ='行标准化';

作为最后的示例,读取数据集的前两个记录,计算散射功能,并使用具有散射功能的SVM培训的SVM预测所说的数字。

重置(广告);sig1 = helperreadspdata(读取(广告));scat1 = sn.featurematrix(sig1);Scat1 =平均值(Scat1(2:结束,:)');plab1 = predict(分类vm,scat1);

阅读下一个记录并预测数字。

sig2 = helperreadspdata(读取(广告));scat2 = sn.featurematrix(sig2);Scat2 =平均值(Scat2(2:结束,:)');plab2 =预测(分类vm,scat2);
t = 0:1/8000:(8192 * 1/8000)-1/8000;图(t,[sig1 sig2])网格紧的传奇(char(plab1),char(plab2))标题(“口语数字预测 -  GPU”

附录

在此示例中使用以下辅助功能。

Helpergenlabels.- 基于FSDD中的文件名生成标签。

功能Labels = HelpergenLabels(广告)%此函数仅适用于小波工具箱示例。可能是%在未来的释放中更改或删除。tmp = cell(numel(ads.files),1);表达=“[0-9] + _”;为了nf = 1:numel(ads.files)idx = regexp(ads.files {nf},表达式);tmp {nf} = ads.files {nf}(idx);结尾标签=分类(TMP);结尾

HelperReadspdata.- 确保每位发言录制为8192个样品。

功能x = HelperReadspdata(x)%此函数仅适用于使用小波工具箱示例。它可能会改变或%在将来的释放中删除。n = numel(x);如果n> 8192 x = x(1:8192);eleesifn <8192垫= 8192-n;预付费=楼层(垫/ 2);postpad = CEIL(PAD / 2);x = [零(prepad,1);X ;零(Postpad,1)];结尾x =单个(x./max(abs(x)));结尾

也可以看看

相关话题