主要内容

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

本例使用转换后的数据存储在内存不足的听觉谱图上训练语音数字识别网络。在本例中,您使用以下方法从音频中提取听觉谱图audioDatastore(音频工具箱)而且audioFeatureExtractor(音频工具箱),然后将它们写入磁盘。然后使用signalDatastore(信号处理工具箱)在培训期间访问功能。当训练特性不适合内存时,工作流是有用的。在这个工作流程中,您只提取一次特征,如果您正在迭代深度学习模型设计,这将加快您的工作流程。

数据

下载免费语音数字数据集(FSDD)。FSDD由2000个录音组成,四个说话者用英语说数字0到9。

downloadFolder = matlab.internal.examples.downloadSupportFile (“音频”“FSDD.zip”);dataFolder = tempdir;unzip(downloadFolder,dataFolder) dataset = fullfile(dataFolder,“FSDD”);

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

广告= audioDatastore(数据集,IncludeSubfolders = true);

显示类和每个类中的示例数量。

(~,文件名)= fileparts (ads.Files);ads.Labels =分类(extractBefore(文件名,“_”));总结(ads.Labels)
0 200 1 200 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

减少训练数据集

要用整个数据集训练网络并达到尽可能高的精度,请设置speedupExample.要快速运行此示例,请设置speedupExample真正的

speedupExample =如果adsTrain = splitEachLabel(adsTrain,2);adsTest = splitEachLabel (adsTest 2);结束

设置听觉谱图提取

CNN接受mel频率谱图。

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

fs = 8000;frameDuration = 0.22;frameLength =圆(frameDuration * fs);hopDuration = 0.01;hopLength =圆(hopDuration * fs);segmentLength = 8192;numBands = 40;fftLength = 2048;

创建一个audioFeatureExtractor(音频工具箱)对象从输入音频信号计算mel频率谱图。

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

设置mel频率谱图参数。

setExtractorParameters (afe“melSpectrum”NumBands = NumBands FrequencyRange = [50 fs / 2], WindowNormalization = true);

创建一个转换的数据存储,从音频数据计算mel频率谱图。支持函数,getSpeechSpectrogram,使录音长度标准化,并使音频输入的振幅规范化。getSpeechSpectrogram使用audioFeatureExtractor对象afe获得基于对数的mel频率谱图。

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

将听觉谱图写入磁盘

使用writeall(音频工具箱)把听觉谱图写入磁盘。集UseParallel为true以并行执行写入。

outputLocation = fullfile (tempdir,“FSDD_Features”);writeall (adsSpecTrain、outputLocation WriteFcn = @myCustomWriter UseParallel = true);

设置训练信号数据存储

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

sds = signalDatastore (outputLocation IncludeSubfolders = true,...SignalVariableNames = [“规范”“标签”), ReadOutputOrientation =“行”);

验证数据

验证数据集装入内存中。预先执行验证功能。

adsTestT =变换(adsTest @ (x) {getSpeechSpectrogram (x, afe segmentLength)});XTest = readall (adsTestT);XTest =猫(4 XTest {:});

获取验证标签。

欧美= adsTest.Labels;

CNN架构定义

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

深圳=大小(XTest);specSize =深圳(1:2);imageSize = [specSize 1];numClasses =元素个数(类别(欧美));dropoutProb = 0.2;numF = 12;layers = [imageInputLayer(imageSize, normalized = .“没有”) convolution2dLayer (5 numF填充=“相同”maxPooling2dLayer(3,Stride=2,Padding= .“相同”) convolution2dLayer (3 2 * numF填充=“相同”maxPooling2dLayer(3,Stride=2,Padding= .“相同”) convolution2dLayer(3、4 * numF填充=“相同”maxPooling2dLayer(3,Stride=2,Padding= .“相同”) convolution2dLayer(3、4 * numF填充=“相同”) batchNormalizationLayer reluLayer convolution2dLayer(3,4*numF,Padding= .“相同”(2) dropoutLayer(dropoutProb) fullyConnectedLayer(numClasses) softmaxLayer classificationLayer(Classes=categories(YTest));];

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

miniBatchSize = 50;选择= trainingOptions (“亚当”...InitialLearnRate = 1的军医,...MaxEpochs = 30,...LearnRateSchedule =“分段”...LearnRateDropFactor = 0.1,...LearnRateDropPeriod = 15,...MiniBatchSize = MiniBatchSize,...洗牌=“every-epoch”...情节=“训练进步”...Verbose = false,...ValidationData = {XTest,欧美},...ValidationFrequency =装天花板(元素个数(adsTrain.Files) / miniBatchSize),...ExecutionEnvironment =“汽车”...DispatchInBackground = true);

通过传递训练数据存储来训练网络trainNetwork

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

使用训练过的网络对测试集的数字标签进行预测。

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

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

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

支持功能

得到语音谱图

函数X = getSpeechSpectrogram (X, afe segmentLength)函数的语音谱图%信号x使用audioFeatureExtractor安全。x = scaleAndResize(单(x), segmentLength);规范=提取(afe, x) ';X = log10(spec + 1e-6);结束

规模和调整

函数x = scaleAndResize (x, segmentLength)% scaleAndResize(x,segmentLength)根据x的最大绝对值和力缩放x%它的长度是segmentLength通过修剪或零填充。L = segmentLength;N =大小(x, 1);如果N > L x = x(1:L,:);elseifN < L pad = L - N;前置液=地板(垫/ 2);postpad =装天花板(垫/ 2);x =[0(前置液,1),x; 0 (postpad 1)];结束x = x / max (abs (x));结束

自定义编写函数

函数myCustomWriter(规范、writeInfo ~)% myCustomWriter(spec,writeInfo,~)写入听觉谱图/标签%对到MAT文件。文件名= strrep (writeInfo。SuggestedOutputName,“wav”“.mat”);标签= writeInfo.ReadInfo.Label;保存(文件名,“标签”“规范”);结束
Baidu
map