主要内容

利用内存不足特征训练语音数字识别网络

这个例子使用转换后的数据存储在内存不足的听觉谱图上训练一个口语数字识别网络。在本例中,使用以下方法从音频中提取听觉频谱图audioDatastoreaudioFeatureExtractor,然后将它们写入磁盘。然后使用asignalDatastore在训练期间访问特征。当训练特性不适合内存时,工作流是有用的。在这个工作流中,您只提取一次特征,如果您在深度学习模型设计上进行迭代,这将加快您的工作流。

数据

下载自由语音数字数据集(FSDD)。FSDD是由4人用英语说出0到9的2000段录音组成的。

url =“https://ssd.mathworks.com/万博1manbetxsupportfiles/audio/FSDD.zip”;downloadFolder = tempdir;datasetFolder = fullfile (downloadFolder,“FSDD”);如果~存在(datasetFolder“dir”) disp (“下载FSDD…”解压缩(url, downloadFolder)结束

创建一个audioDatastore这指向了数据集。

pathToRecordingsFolder = fullfile (datasetFolder,“录音”);位置= pathToRecordingsFolder;广告= audioDatastore(位置);

辅助功能,helperGenerateLabels,从FSDD文件创建标签的分类数组。的源代码helperGenerateLabels列在附录中。显示类和每个类中的示例数量。

ads.Labels = helperGenerateLabels(广告);
使用“local”配置文件启动并行池(parpool)…连接到并行池(工作人员数量:8)。
总结(ads.Labels)
2 200 3 200 4 200 5 200 6 200 7 200 8 200 9 200

将FSDD分解为训练集和测试集。将80%的数据分配给训练集,并保留20%给测试集。您可以使用训练集来训练模型,使用测试集来验证训练过的模型。

rng默认的广告= shuffle(广告);[adsTrain, adsTest] = splitEachLabel(广告,0.8);countEachLabel (adsTrain)
ans =10×2表标签计数_____ _____ 0 160 1 160 2 160 3 160 4 160 5 160 6 160 7 160 8 160 9 160
countEachLabel (adsTest)
ans =10×2表标签数_____ _____ 0 40 1 40 2 40 3 40 4 40 5 40 6 40 7 40 8 40 9 40

减少训练数据集

要用整个数据集训练网络,并达到尽可能高的精度,集合reduceDataset为假。要快速运行此示例,请设置reduceDataset为true。

reduceDataset =“假”如果reduceDataset = =“真正的”adsTrain = splitEachLabel (adsTrain 2);adsTest = splitEachLabel (adsTest 2);结束

建立听觉图谱提取

CNN接受梅尔频率谱图。

定义用于提取梅尔频率谱图的参数。使用220毫秒的窗口和10毫秒的窗口间跳转。使用2048点DFT和40个频段。

fs = 8000;frameDuration = 0.22;hopDuration = 0.01;参数个数。segmentLength = 8192;segmentDuration = params.segmentLength * (1 / fs);参数个数。numHops =装天花板((segmentDuration-frameDuration) / hopDuration);参数个数。numBands = 40; frameLength = round(frameDuration*fs); hopLength = round(hopDuration*fs); fftLength = 2048;

创建一个audioFeatureExtractor目的:从输入的音频信号中计算梅尔频率谱图。

afe = audioFeatureExtractor (“melSpectrum”,真的,“SampleRate”fs);afe。窗口=汉明(frameLength,“周期”);afe。OverlapLength = frameLength-hopLength;afe。FFTLength = FFTLength;

设置mel-frequency谱图参数。

setExtractorParams (afe“melSpectrum”“NumBands”params.numBands,“FrequencyRange”(50 fs / 2),“WindowNormalization”,真正的);

创建一个转换数据存储,从音频数据计算梅尔频率谱图。辅助功能,getSpeechSpectrogram(见附录),将录音长度标准化,并将音频输入的振幅标准化。getSpeechSpectrogram使用audioFeatureExtractor对象afe得到基于对数的梅尔频率谱图。

adsSpecTrain =变换(adsTrain @ (x) getSpeechSpectrogram (x, afe params));

将听觉谱图写入磁盘

使用writeall将声谱图写入磁盘。集UseParallel以并行的方式进行写作。

writeall (adsSpecTrain pwd,“WriteFcn”@myCustomWriter,“UseParallel”,真正的);

建立训练信号数据存储

创建一个signalDatastore这就指向了内存不足的特性。自定义read函数返回一个谱图/标签对。

sds = signalDatastore (“录音”“ReadFcn”, @myCustomRead);

验证数据

验证数据集适合内存,您可以使用helper函数预计算验证特性getValidationSpeechSpectrograms(见附录)。

XTest = getValidationSpeechSpectrograms (afe adsTest, params);

获取验证标签。

欧美= adsTest.Labels;

CNN架构定义

构建一个小的CNN作为层的数组。使用卷积和批处理归一化层,并使用最大池化层对特征映射进行向下采样。为了减少网络记忆训练数据的特定特征的可能性,在最后一个完全连接层的输入中添加少量的dropout。

深圳=大小(XTest);specSize =深圳(1:2);imageSize = [specSize 1];numClasses =元素个数(类别(欧美));dropoutProb = 0.2;numF = 12;imageInputLayer = [imageInputLayer(imageSize,“归一化”“没有”numF) convolution2dLayer(5日,“填充”“相同”maxPooling2dLayer(3,“步”,2,“填充”“相同”) convolution2dLayer (3 2 * numF“填充”“相同”maxPooling2dLayer(3,“步”,2,“填充”“相同”) convolution2dLayer(3、4 * numF,“填充”“相同”maxPooling2dLayer(3,“步”,2,“填充”“相同”) convolution2dLayer(3、4 * numF,“填充”“相同”) batchNormalizationLayer reluLayer卷积2dlayer (3,4*numF,“填充”“相同”) batchNormalizationLayer reluLayer maxPooling2dLayer(2) dropoutLayer(dropoutProb) fulllyconnectedlayer (numClasses) softmaxLayer classificationLayer(“类”类别(欧美));];

设置用于训练网络的超参数。使用50个小批量和1e-4的学习速率。指定的亚当的优化。若要使用并行池读取已转换的数据存储,请设置DispatchInBackground真正的.有关更多信息,请参见trainingOptions(深度学习工具箱)

miniBatchSize = 50;选择= trainingOptions (“亚当”...“InitialLearnRate”1的军医,...“MaxEpochs”30岁的...“LearnRateSchedule”“分段”...“LearnRateDropFactor”、1。...“LearnRateDropPeriod”15岁的...“MiniBatchSize”miniBatchSize,...“洗牌”“every-epoch”...“阴谋”“训练进步”...“详细”假的,...“ValidationData”{XTest,欧美},...“ValidationFrequency”、装天花板(元素个数(adsTrain.Files) / miniBatchSize),...“ExecutionEnvironment”“图形”...“DispatchInBackground”,真正的);

通过将训练数据存储传递给trainNetwork

trainedNet = trainNetwork (sds、层、期权);

使用经过训练的网络来预测测试集的数字标签。

(Ypredicted,聚合氯化铝)= (trainedNet XTest)进行分类;cnnAccuracy = (Ypredicted = =次)/元素个数之和(欧美)* 100
cnnAccuracy = 97

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

图(“单位”“归一化”“位置”,[0.2 0.2 1.5 1.5]);ccDCNN = confusionchart(欧美,Ypredicted);ccDCNN。Title =“DCNN的困惑图”;ccDCNN。ColumnSummary =“column-normalized”;ccDCNN。RowSummary =“row-normalized”

附录:辅助函数

函数标签= helperGenerateLabels(广告)%此函数仅在本例中使用。它可能会改变%将在未来的版本中移除。文件= ads.Files;tmp =细胞(元素个数(文件),1);表达=“[0 - 9]+ _”parfor/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /tmp文件{nf} = {nf} (idx);结束标签=分类(tmp);结束%------------------------------------------------------------函数X = getValidationSpeechSpectrograms(广告、afe params)%此函数仅在本例中使用。它可能会改变或被改变%将在未来的版本中移除。% getValidationSpeechSpectrograms(ads,afe)计算语音谱图%使用audioFeatureExtractor afe在数据存储广告中的文件。numFiles =长度(ads.Files);X = 0 ([params.numBands params.numHops 1, numFiles],“单一”);i = 1:numFiles x = read(ads);规范= getSpeechSpectrogram (x, afe params);X(:: 1、我)=规范;结束结束%--------------------------------------------------------------------------函数X = getSpeechSpectrogram (X, afe params)%此函数仅在本例中使用。它可能会改变或被改变%将在未来的版本中移除。% getSpeechSpectrogram(x,afe)为信号计算一个语音谱图% x使用audioFeatureExtractor afe。X = 0 ([params.numBands, params.numHops],“单一”);x = normalizeAndResize(单(x),参数);规范=提取(afe, x) ';%如果声谱图小于numHops,则输入声谱图X的中间。w =大小(规范,2);地板左= ((params.numHops-w) / 2) + 1;印第安纳州=左:左+ w1;X(:,ind) = log10(spec + 1e-6);结束%--------------------------------------------------------------------------函数x = normalizeAndResize (x, params)%此函数仅在本例中使用。它可能会改变%将在未来的版本中移除。L = params.segmentLength;N =元素个数(x);如果N > L x = x(1:L);elseifN < L pad = L-N;前置液=地板(垫/ 2);postpad =装天花板(垫/ 2);X = [0 (prepad,1);x;0 (postpad 1)];结束x = x / max (abs (x));结束%--------------------------------------------------------------------------函数myCustomWriter(规范、writeInfo ~)%此函数仅在本例中使用。它可能会改变%将在未来的版本中移除。%定义自定义书写功能,书写听觉谱图/标签对%到MAT文件。文件名= strrep (writeInfo。SuggestedOutputName,“wav”“.mat”);标签= writeInfo.ReadInfo.Label;保存(文件名,“标签”“规范”);结束%--------------------------------------------------------------------------函数(数据、信息)= myCustomRead(文件名)%此函数仅在本例中使用。它可能会改变%将在未来的版本中移除。负载(文件名,“规范”“标签”);数据={规范、标签};信息。SampleRate = 8000;结束