主要内容

语音数字识别与自定义日志声谱图层更深的学习

这个例子展示了如何使用深度分类说数字卷积神经网络(CNN)和一个自定义日志声谱图层。自定义层使用dlstft函数来计算短时傅里叶变换的方式支持自动反向传播。金宝app

数据

克隆或下载免费使用数字数据集(FSDD),可用https://github.com/Jakobovski/free-spoken-digit-dataset。FSDD是一个开放的数据集,这意味着它能随着时间的推移而增长。这个例子使用的版本8月12日,2020年,3000年由数字0到9的英文录音来自6个扬声器。每个数字都是说每个演讲者50倍。数据采样在8000赫兹。

使用audioDatastore管理数据访问。设置位置房地产的位置FSDD录音文件夹在您的计算机上。这个示例使用MATLAB的返回的基础文件夹tempdir命令。

pathToRecordingsFolder = fullfile (tempdir,“free-spoken-digit-dataset”,“录音”);位置= pathToRecordingsFolder;广告= audioDatastore(位置);

辅助函数helpergenLabels创建一个分类数组FSDD标签的文件。的源代码helpergenLabels列在附录中。列表的类和例子的数量在每个类。

ads.Labels = helpergenLabels(广告);总结(ads.Labels)
0 300 300 300 300 300 4 300 5 6 300 7 300 300 300 9

提取4个音频文件对应于不同的数字。使用stft绘制分贝的声音。差异的共振峰结构话语中明显的光谱图。这使得光谱图合理区分学习数字信号表示在一个很深的网络。

adsSample =子集(广告,[1301601901]);SampleRate = 8000;我= 1:4 (audioSamples,信息)=读(adsSample);次要情节(2,2,我)stft (audioSamples SampleRate,“FrequencyRange”,“单向的”);标题(的数字:+字符串(info.Label))结束

把FSDD分成训练集和测试集,同时保持相同的标签的比例在每个子集。为可再生的效果,将随机数发生器设置为默认值。百分之八十,或2400录音,用于培训。剩余的600录音,占总数的20%,被测试。

rng默认的;广告= shuffle(广告);[adsTrain, adsTest] = splitEachLabel(广告,0.8);

确认这两个训练集和测试集包含每个类的正确的比例。

disp (countEachLabel (adsTrain))
标签数_____ _____ 0 240 240 240 240 240 4 240 5 6 240 7 240 240 240 9
disp (countEachLabel (adsTest))
标签数_____ _____ 60 0 60 60 60 1 60 2 3 4 5 6 60 60 60 60 60 7 8 9

录音在FSDD样本中没有统一的长度。利用谱图信号表示在深网络,需要一个一致的输入长度。录音的分析在这个版本的FSDD表明一个常见的8192个样本的长度是适当的,以确保没有剪除。录音口语数字大于8192个样本长度截到8192样本,虽然少于8192个样本的录音是对称的长度为8192。辅助函数helperReadSPData截断或垫数据8192个样本和规范每个记录的最大值。的源代码helperReadSPData列在附录中。这个helper函数应用于每个记录通过变换数据存储在一起audioDatastore

transTrain =变换(adsTrain @ (x,信息)helperReadSPData (x,信息),“IncludeInfo”,真正的);transTest =变换(adsTest @ (x,信息)helperReadSPData (x,信息),“IncludeInfo”,真正的);

自定义日志声谱图层

当任何信号处理网络外的预处理步骤,有更大的机会网络的预测是由不同的预处理设置比用于网络培训。这可以产生重大影响网络性能,通常比预期导致性能降低。将光谱图或任何其他预处理计算网络内一层给你一个独立的模型,简化了部署的管道。它可以让你有效地训练、部署或分享您的网络包括所有所需的信号处理操作。在这个例子中,主要的信号处理操作的计算谱图。计算网络内的光谱图的能力是有用的推论和设备存储空间不足时保存谱图。计算的光谱图网络只需要足够的内存分配当前批色。然而,应该指出的是,这不是最优选择的训练速度。如果你有足够的内存,训练时间明显减少并不是预先计算的所有谱图和存储这些结果。训练网络,读谱图“图像”从存储,而不是原始的音频和网络中直接输入谱图。 Note that while this results in the fastest training time, the ability to perform signal processing inside the network still has considerable advantages for the reasons previously cited.

在训练中深层网络,通常有利于使用信号的对数表示,因为对数行为像一个动态范围压缩,提高代表值,有小震级(振幅),但背负着重要的信息。在这个例子中,日志声谱图执行比光谱图。因此,这个示例创建一个自定义日志后光谱图层,并将其插入到网络的输入层。指定义定制的深度学习层(深度学习工具箱)为更多的信息关于如何创建一个自定义层。

声明的参数和创建构造函数

logSpectrogramLayer一层没有可学的参数,所以只有non-learnable属性是必要的。这里唯一所需的属性是那些需要光谱图计算。宣布他们的属性部分。层的预测函数,dlarray支金宝app持短时傅里叶变换函数dlstft用于计算光谱图。为更多的细节dlstft和这些参数,请参考dlstft文档。创建的函数结构层和初始化层属性。指定任何变量需要创建构造函数作为输入层。

classdeflogSpectrogramLayer < nnet.layer.Layer属性%(可选)层属性。%光谱窗口窗口% smaples重叠OverlapLength%的DFT点FFTLength%信号长度SignalLength结束方法函数层= logSpectrogramLayer (sigLength NVargs)参数sigLength{mustBeNumeric}NVargs.Window{mustBeFloat, mustBeNonempty, mustBeFinite、mustBeReal mustBeVector}=损害(128“周期”)NVargs.OverlapLength{mustBeNumeric}= 96 NVargs.FFTLength{mustBeNumeric}= 128 NVargs.Name字符串=“logspec”结束层。类型=“logSpectrogram”;层。= NVargs.Name名称;层。SignalLength = sigLength;层。窗口= NVargs.Window;层。OverlapLength = NVargs.OverlapLength;层。FFTLength = NVargs.FFTLength;结束结束

预测功能

如前所述,自定义层使用dlstft获取STFT,然后计算平方级的对数STFT获得对数谱图。你也可以删除日志函数如果你愿意或添加任何其他dlarray-supported功能定制输出。金宝app你可以复制logSpectrogramLayer.m到一个不同的文件夹,如果你想尝试不同的输出的预测函数。建议保存自定义层在一个不同的名称,以防止任何与本例中使用的版本冲突。

函数Z =预测(层,X)%前进通过层预测时间和输入数据%输出结果。%%的输入:%层-层向前传播% X -输入数据,指定为一个1-by-1-by-C-by-N% dlarray,其中N是mini-batch大小。%输出:% Z -输出层函数返回%深圳(1)-by-sz (2) -by-sz (3)×n dlarray,%深圳在哪层输出大小和N% mini-batch大小。%使用dlstft计算短时傅里叶变换。%指定数据格式作为SSCB匹配的输出% imageInputLayer。X =紧缩(X);(年,易)= dlstft (X,“窗口”layer.Window,“FFTLength”layer.FFTLength,“OverlapLength”layer.OverlapLength,“DataFormat”,“确认”);%这段代码需要处理二维卷积这一事实%预计SSCB DAG网络年=排列(年[1 4 2 3]);易=排列(咦,[1 4 2 3]);%的对数平方级短时傅里叶%变换。日志(年Z =。^ 2 +易。^ 2);结束

因为logSpectrogramLayer使用相同的训练和预测前进传球(推理),只有预测功能是必需的,没有向前函数是必需的。另外,因为预测函数使用dlstft,它支持金宝appdlarray可以自动完成,分化向后传播。这意味着,你不需要写落后的函数。这是一个很大的优势在编写一个自定义层支持金宝appdlarray。支持的功能列表金宝appdlarray对象,看到与dlarray支持函数的列表金宝app(深度学习工具箱)

深卷积神经网络(DCNN)架构

您可以使用一个自定义层以同样的方式与其他层深度学习工具。构建一个小型DCNN层阵列,包括自定义层logSpectrogramLayer。利用卷积和批归一化层和downsample使用max池层特征图。为了防止过度拟合,添加少量的辍学最后完全连接的输入层。

sigLength = 8192;dropoutProb = 0.2;numF = 12;层= [imageInputLayer ([sigLength 1]) logSpectrogramLayer (sigLength,“窗口”、汉明(1280)“FFTLength”,1280,“OverlapLength”,900)convolution2dLayer (5 numF“填充”,“相同”)batchNormalizationLayer reluLayer maxPooling2dLayer (3“步”2,“填充”,“相同”)convolution2dLayer (3 2 * numF“填充”,“相同”)batchNormalizationLayer reluLayer maxPooling2dLayer (3“步”2,“填充”,“相同”)convolution2dLayer (3、4 * numF,“填充”,“相同”)batchNormalizationLayer reluLayer maxPooling2dLayer (3“步”2,“填充”,“相同”)convolution2dLayer (3、4 * numF,“填充”,“相同”)batchNormalizationLayer reluLayer convolution2dLayer (3、4 * numF,“填充”,“相同”)batchNormalizationLayer reluLayer maxPooling2dLayer (2) dropoutLayer (dropoutProb) fullyConnectedLayer(元素个数(类别(ads.Labels))) softmaxLayer classificationLayer (“类”类别(ads.Labels));];

设置hyperparameters用于训练网络。使用mini-batch大小50和学习的速度1的军医。指定亚当优化。集UsePrefetch真正的启用异步预取和排队的数据优化训练性能。后台数据调度和使用GPU来训练网络需要并行计算工具箱™。

UsePrefetch =真正的;选择= trainingOptions (“亚当”,“InitialLearnRate”1的军医,“MaxEpochs”30岁的“MiniBatchSize”,50岁,“洗牌”,“every-epoch”,“DispatchInBackground”UsePrefetch,“阴谋”,“训练进步”,“详细”、假);

培训网络。

[trainedNet, trainInfo] = trainNetwork (transTrain层,选项);

使用训练网络预测的数字标签测试集,计算出预测精度。

(YPred,聚合氯化铝)= (trainedNet transTest)进行分类;cnnAccuracy = (YPred = = adsTest.Labels) /元素个数之和(YPred) * 100
cnnAccuracy = 97

总结训练网络的性能测试集的混乱。显示每个类的精度和召回通过使用列和行摘要。表底部的混乱图表显示精度值。桌子右边的图表显示混乱召回值。

图(“单位”,“归一化”,“位置”(0.2 - 0.2 0.5 - 0.5));ccDCNN = confusionchart (adsTest.Labels YPred);ccDCNN。Title =“DCNN混乱图”;ccDCNN。ColumnSummary =“column-normalized”;ccDCNN。RowSummary =“row-normalized”;

总结

这个例子展示了如何创建一个定制的声谱图层使用dlstft。使用功能,支持金宝appdlarray,这个例子演示了如何嵌入网络内的信号处理操作的支持gpu的反向传播和使用。金宝app

附录:辅助函数

函数标签= helpergenLabels(广告)%这个函数只用于“语音数字识别%定制日志声谱图层和深层学习”的例子。它可能改变或%在将来的版本中被删除。tmp =细胞(元素个数(ads.Files), 1);表达=“[0 - 9]+ _”;nf = 1:元素个数(ads.Files) idx = regexp (ads.Files {nf},表达式);tmp {nf} = ads.Files {nf} (idx);结束标签=分类(tmp);结束
函数[,信息]= helperReadSPData (x,信息)%这个函数只用于“语音数字识别%定制日志声谱图层和深层学习”的例子。它可能改变或%在将来的版本中被删除。N =元素个数(x);如果N > 8192 x = x (1:8192);elseifN < 8192垫= 8192 - N;前置液=地板(垫/ 2);postpad =装天花板(垫/ 2);x =[0(前置液,1);x;0 (postpad 1)];结束x = x / max (abs (x));出= {x / max (abs (x)), info.Label};结束