主要内容

预加重过滤器使用深度学习学习

这个例子展示了如何使用一个卷积深网络学习语音识别的预加重过滤器。示例使用一个可学的短时傅里叶变换)层获得适合使用二维卷积时频表示层。使用基于可学的STFT使梯度优化的预加重滤波器权重。

数据

克隆或下载免费使用数字数据集(FSDD),可用https://github.com/Jakobovski/free-spoken-digit-dataset。FSDD是一个开放的数据集,这意味着它能随着时间的推移而增长。这个例子使用的版本在08/20/2020由3000录音的英语数字0到9获得6个扬声器。数据采样在8000赫兹。

这个示例假设您已经将数据下载到文件夹对应的值tempdir在MATLAB。如果你使用一个不同的文件夹,文件夹名称的替代tempdir在以下代码。使用audioDatastore来管理数据访问,确保数据随机分为训练集和测试集。

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

辅助函数helpergenLabels创建一个分类数组FSDD标签的文件。的源代码helpergenLabels列在附录中。列表的类和例子的数量在每个类。可能需要几分钟来生成这个数据集的所有标签。

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

把FSDD分成训练集和测试集维护平等类比例在每个子集。为可再生的效果,将随机数发生器设置为默认值。百分之八十,或2400录音,用于培训。剩余的600录音,占总数的20%,被测试。洗牌的文件数据存储以前创建的训练集和测试集。

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

FSDD不相等的记录长度。使用一个转换,以便每个读取8192个样本的数据存储垫或截断。这些数据是另外单精度和z分数归一化应用。

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

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

这个例子使用一个自定义训练循环使用以下深卷积网络。

numF = 12;dropoutProb = 0.2;层= [sequenceInputLayer (1,“名字”,“输入”,的最小长度,8192,“归一化”,“没有”1)convolution1dLayer(5日,“名称”,“pre-emphasis-filter”,“WeightsInitializer”@(深圳)kronDelta(深圳),“BiasLearnRateFactor”,0)stftLayer (“窗口”、汉明(1280)“OverlapLength”,900,“OutputMode”,“空间”,“名字”,“STFT”numF) convolution2dLayer(5日,“填充”,“相同”)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];dlnet = dlnetwork(层);

输入层是紧随其后的是一个一维卷积序列层组成的一个过滤器5系数。这是一个有限脉冲响应滤波器。默认情况下卷积层深度学习网络实现一个仿射操作输入功能。获得一个严格的线性(过滤)操作,使用默认值“BiasInitializer”这是“零”和设置的偏见学习速率因子层为0。这意味着偏见被初始化为0,培训期间从不改变。滤波器的网络使用一个自定义的初始化权重是一个按比例缩小的克罗内克符号序列。这是一个allpass过滤器,执行没有过滤的输入。allpass过滤重初始化的代码所示。

函数δ= kronDelta(深圳)%这个函数只用于“学习预加重过滤器使用%深度学习”的例子。它可能会改变或被删除%的未来版本。L =深圳(1);δ= 0 (L,深圳(2),深圳(3),“单一”);δ(1)= 1 /√(L);结束

stftLayer将过滤后的批输入信号和获得STFTs级。级STFT的二维表示信号,适合使用在二维卷积网络。

虽然STFT的重量没有改变在训练,层支持反向传播,这使得滤波器系数可以学到“pre-emphasis-filter”层。金宝app

网络训练

设置的培训选项定义培训循环。使用25时代,minibatch大小为128。设置初始学习率0.001。

NumEpochs = 25;miniBatchSize = 128;learnRate = 0.001;

在自定义训练循环,使用minibatchqueue对象。的processSpeechMB函数读入一个minibatch和一个炎热的编码方案适用于标签。

mbqTrain = minibatchqueue (transTrain 2“MiniBatchSize”miniBatchSize,“MiniBatchFormat”,{“认知行为治疗”,“CB”},“MiniBatchFcn”,@processSpeechMB);

培训网络和阴谋每个迭代的损失。优化器使用一个亚当更新网络可学的参数。情节损失的培训进度,设置的值进步在以下代码来“训练进步”。

进步=“最终损失”;如果进步= =“训练进步”图lineLossTrain = animatedline;ylim([0正])包含(“迭代”)ylabel (“损失”网格)结束%初始化一些培训循环变量。trailingAvg = [];trailingAvgSq = [];迭代= 0;lossByIteration = 0;%循环时期。时间的时代。开始=抽搐;时代= 1:NumEpochs重置(mbqTrain)洗牌(mbqTrain)%在mini-batches循环。hasdata (mbqTrain)迭代=迭代+ 1;%得到下一个minibatch和一个炎热的编码的目标[dlX Y] =下一个(mbqTrain);%梯度和损失评估模型(渐变、损失、状态)= dlfeval (@modelGradSTFT, dlnet dlX Y);如果进步= =“最终损失”lossByIteration(迭代)=损失;结束%更新网络状态dlnet。=状态;%更新网络参数优化器使用一个亚当。[dlnet, trailingAvg trailingAvgSq] = adamupdate (dlnet、渐变trailingAvg trailingAvgSq,迭代,learnRate);%显示培训进展。D =持续时间(0,0,toc(开始),“格式”,“hh: mm: ss”);如果进步= =“训练进步”addpoints (lineLossTrain、迭代、失去)标题(”时代:“+时代+”,过去:“+字符串(D))结束结束disp (“培训损失后时代”+时代+”:“+损失);结束
培训损失后时代1:0.78417培训损失时代2:0.33268培训损失时代3:0.28916培训损失时代4:0.1111培训损失时代5:0.14384培训损失时代6:0.030357培训损失时代7:0.020752培训损失时代8:0.04275培训损失时代9:0.022452培训损失时代10:0.060283培训损失时代11:0.013778培训损失时代12:0.018867培训损失时代13:0.02545培训损失时代14:0.0073273培训损失时代15:0.0020516培训损失时代16:0.0058642培训损失时代17:0.0021439培训损失时代18:0.016893时代19后培训损失:0.017999培训损失时代20:0.014562时代21后培训损失:0.007233时代22后培训损失:0.00099405时代23后培训损失:0.0053691时代24后培训损失:0.00087165时代25后培训损失:0.00034627
如果进步= =“最终损失”阴谋(1:迭代,lossByIteration)网格标题(的训练迭代的损失)包含(“迭代”)ylabel (“损失”)结束

测试了测试集上的训练网络,使用minibatchqueue对象与minibatch大小为32。

miniBatchSize = 32;mbqTest = minibatchqueue (transTest 2“MiniBatchSize”miniBatchSize,“MiniBatchFormat”,{“认知行为治疗”,“CB”},“MiniBatchFcn”,@processSpeechMB);

遍历测试集和每个minibatch预测类标签。

numObservations =元素个数(adsTest.Files);类=字符串(独特(adsTest.Labels));预测= [];%在mini-batches循环。hasdata (mbqTest)% mini-batch读取的数据。dlX =下一个(mbqTest);% minibatch作出预测dlYPred =预测(dlnet dlX);%确定相应的类。predBatch = onehotdecode (dlYPred类1);预测=[预测predBatch];结束

评估分类精度的600例伸出测试集。

精度=意味着(预测' = =分类(adsTest.Labels))
精度= 0.9783

测试性能大约是98%。可以注释掉一维卷积层和培训网络没有预加重过滤器。没有预加重过滤器的测试性能也是优秀的约96%,但预加重过滤器的使用使一个小的改进。这是值得注意的,虽然学会了预加重过滤器的使用只有略微提高了测试精度,这是通过将只有5可学的参数添加到网络。

检查了预加重过滤器,提取一维卷积层的权重。频率响应。回想一下,数据是8 kHz的采样频率。因为我们初始化过滤器一个按比例缩小的克罗内克符号序列(allpass过滤器),我们可以很容易地比较初始化滤波器的频率响应与学习的反应。

FIRFilter = dlnet.Layers (2) .Weights;[H, W] = freqz (FIRFilter 1 [], 8000);δ= kronDelta ([1 5 1]);Hinit = freqz(δ1 [],4000);情节(W, 20 * log10 (abs ([H Hinit])),“线宽”,2)网格包含(“赫兹”)ylabel (“数据库”)传说(学会过滤的,“初始过滤”,“位置”,“东南”)标题(“学会了预加重过滤”)

这个例子展示了如何学习预加重滤波器作为预处理步骤二维卷积网络基于短时傅里叶变换的信号。的能力stftLayer支持基金宝app于反向传播使梯度内滤波器权重优化网络。虽然这导致只有一小改善网络性能的测试集,它实现改进与微不足道的增加可学的参数的数量。

附录:辅助函数

函数标签= helpergenLabels(广告)%这个函数只用于“学习预加重过滤器使用%深度学习”的例子。它可能会改变或被删除%的未来版本。tmp =细胞(元素个数(ads.Files), 1);表达=“[0 - 9]+ _”;nf = 1:元素个数(ads.Files) idx = regexp (ads.Files {nf},表达式);tmp {nf} = ads.Files {nf} (idx);结束标签=分类(tmp);结束函数[,信息]= helperReadData (x,信息)%这个函数只用于“学习预加重过滤器使用%深度学习”的例子。它可能会改变或被删除%的未来版本。N =元素个数(x);x =单(x);如果N > 8192 x = x (1:8192);elseifN < 8192垫= 8192 - N;前置液=地板(垫/ 2);postpad =装天花板(垫/ 2);x =[0(前置液,1);x;0 (postpad 1)];结束x = (x-mean (x))。/性病(x);x = x (:) ';= {x, info.Label};结束函数[dlX,海底]= processSpeechMB(伊势亚Ycell)%这个函数只用于“学习预加重过滤器使用%深度学习”的例子。它可能会改变或被删除%的未来版本。伊势亚= cellfun (@ (x)重塑(x, 1, 1,[]),伊势亚,“大学”、假);dlX =猫(2,伊势亚{:});海底=猫(2,Ycell {:});海底= onehotencode(海底,1);结束函数(毕业生、损失、状态)= modelGradSTFT(净,X, T)%这个函数只用于“学习预加重过滤器使用%深度学习”的例子。它可能会改变或被删除%的未来版本。[y,状态]= net.forward (X);损失= crossentropy (y, T);毕业生= dlgradient(损失、net.Learnables);损失=双(收集(extractdata(损失)));结束

另请参阅

应用程序

对象

功能

相关的话题