使用深度学习可解释性技术研究音频分类
这个例子展示了如何使用可解释性技术来研究被训练来分类音频数据的深度神经网络的预测。
深度学习网络通常被描述为“黑盒子”,因为网络做出某种决定的原因并不总是显而易见的。您可以使用可解释性技术将网络行为转换为人们可以解释的输出。这个可解释的输出可以回答关于网络预测的问题。这个例子使用了可解释性技术,该技术使用网络正在“看”什么东西的可视化表示来解释网络预测。然后,您可以使用这些可视化表示来查看网络正在使用输入图像的哪些部分进行决策。
这个例子使用迁移学习重新训练VGGish,一个预先训练的卷积神经网络,来分类一组新的音频信号。
加载数据
下载并解压环境声音分类数据集。该数据集由标记为10种不同音频声音类别(ESC-10)之一的录音组成。下载esc - 10. - zip
从MathWorks网站下载zip文件,然后解压缩该文件。
rng (“默认”) zipFile = matlab.internal.examples.downloadSupportFile(“音频”,“esc - 10. - zip”);filepath = fileparts (zipFile);dataFolder = fullfile (filepath,“ESC-10”);解压缩(zipFile dataFolder)
创建一个audioDatastore
对象来管理数据并将其划分为训练集和验证集。使用countEachLabel
显示声音类别的分布和唯一标签的数量。
广告= audioDatastore (dataFolder IncludeSubfolders = true, LabelSource =“foldernames”);labelTable = countEachLabel(广告)
labelTable =10×2表标签计数______________ _____电锯40钟滴答40噼里啪啦火40哭闹婴儿40狗40直升机40雨40公鸡38海浪40打喷嚏40
确定类的总数。
类= labelTable.Label;numClasses =大小(labelTable, 1);
使用splitEachLabel
将数据集分为训练集和验证集。使用80%的数据进行训练,20%进行验证。
[adsTrain, adsValidation] = splitEachLabel(广告,0.8,0.2);
VGGish预训练网络需要将音频信号预处理成log mel谱图。支持函数helperAudioPreprocess
,在本例的末尾定义,它以an作为输入audioDatastore
对象和log mel谱图之间的重叠百分比,并返回适合输入到VGGish网络的预测器和响应矩阵。每个音频文件被分成几个片段,以输入VGGish网络。
overlapPercentage = 75;[trainFeatures, trainLabels] = helperAudioPreprocess (adsTrain overlapPercentage);[validationFeatures, validationLabels segmentsPerFile] = helperAudioPreprocess (adsValidation overlapPercentage);
可视化数据
查看数据的随机样本。
numImages = 9;idxSubset =兰迪(元素个数(trainLabels), 1, numImages);viewingAngle =(90 -90);图tiledlayout (“流”TileSpacing =“紧凑”);为i = 1:numImages img = trainFeatures(:,:,:, idx子集(i));标签= trainLabels (idxSubset (i));nexttile冲浪(img EdgeColor =“没有”)视图(viewingAngle)标题(”类:“+字符串(标签),翻译=“没有”)结束colormapparula
构建网络
这个例子使用迁移学习重新训练VGGish,一个预先训练的卷积神经网络,来分类一组新的音频信号。
下载VGGish网络
下载并解压VGGish的Audio Toolbox™模型。
类型vggish
在命令窗口中。如果未安装VGGish的Audio Toolbox模型,则该函数提供指向网络权重位置的链接。要下载模型,请单击链接。将文件解压缩到MATLAB路径上的某个位置。
加载VGGish模型并将其转换为layerGraph
对象。
pretrainedNetwork = vggish;lgraph = layerGraph (pretrainedNetwork.Layers);
为迁移学习准备网络
用适合新数据的新层替换最后的层,为迁移学习准备网络。您可以通过编程方式或使用深度网络设计器交互地为新数据调整VGGish。有关演示如何使用深度网络设计器与音频分类网络执行迁移学习的示例,请参见深度网络设计器中预训练音频网络的迁移学习.
使用removeLayers
从图中删除最后的回归输出层。删除回归层之后,图的新最后一层是名为EmbeddingBatch
.
lgraph = removeLayers (lgraph,“regressionoutput”);lgraph.Layers(结束)
ans = ReLULayer,属性:Name: EmbeddingBatch
使用addLayers
添加一个fullyConnectedLayer
,一个softmaxLayer
和一个classificationLayer
到图层图。
lgraph = addLayers (lgraph fullyConnectedLayer (numClasses Name =“FCFinal”));lgraph = addLayers (lgraph softmaxLayer (Name =“softmax”));lgraph = addLayers (lgraph classificationLayer (Name =“classOut”));
使用connectLayers
将完全连接层、softmax层和分类层附加到层图中。
lgraph = connectLayers (lgraph,“EmbeddingBatch”,“FCFinal”);lgraph = connectLayers (lgraph,“FCFinal”,“softmax”);lgraph = connectLayers (lgraph,“softmax”,“classOut”);
指定培训选项
要定义培训选项,请使用trainingOptions
函数。设置解算器为“亚当”
训练5个小批次128个。指定初始学习率为0.001,并在两个阶段后通过乘以0.5因子降低学习率。通过指定验证数据和验证频率来监控训练过程中的网络准确性。
miniBatchSize = 128;选择= trainingOptions (“亚当”,...MaxEpochs = 5,...MiniBatchSize = MiniBatchSize,...InitialLearnRate = 0.001,...LearnRateSchedule =“分段”,...LearnRateDropPeriod = 2,...LearnRateDropFactor = 0.5,...ValidationData = {validationFeatures, validationLabels},...ValidationFrequency = 50,...洗牌=“every-epoch”);
列车网络的
要训练网络,请使用trainNetwork
函数。默认情况下,trainNetwork
如果有图形处理器,使用图形处理器。否则,它使用CPU。GPU培训需要并行计算工具箱™和支持的GPU设备。有关支持的设备的信息,请参见GPU计算的需求(并行计算工具箱).方法还可以指定执行环境ExecutionEnvironment
名称-值参数trainingOptions
.
[净,netInfo] = trainNetwork (trainFeatures、trainLabels lgraph,选项);
单GPU训练。|======================================================================================================================| | 时代| |迭代时间| Mini-batch | |验证Mini-batch | |验证基地学习 | | | | ( hh: mm: ss) | | | | |损失损失精度精度 | |======================================================================================================================| | 1 | 1 | 00:00:17 | | 3.91% 20.07% | 2.4103 | 2.1531 | 0.0010 | | 2 | 50 | 00:00:22 |96.88% | 82.57% | 0.1491 | 0.7013 | 0.0010 | | 3 | 100 | 00:00:27 | | 92.19% 83.75% | 0.1730 | 0.7196 | 0.0005 | | 150 | | 00:00:32 | | 94.53% 85.15% | 0.1654 | 0.8350 | 0.0005 | | 200 | | 00:00:37 | | 96.09% 85.96% | 0.1747 | 0.8034 | 0.0003 | | 210 | | 00:00:38 93.75% | | | 0.1643 | 0.7835 | 0.0003 86.03% | |======================================================================================================================| 培训完成:马克思时代完成。
测试网络
利用训练过的网络对验证谱图进行分类。
[validationPredictions, validationScores] =(网络,validationFeatures)进行分类;
每个音频文件产生多个mel声谱图。使用多数规则决策将验证集中的每个音频文件的预测结合起来,并计算分类精度。
idx = 1;validationPredictionsPerFile =分类;为ii = 1:numel(adsValidation.Files) validationPredictionsPerFile(ii,1) =模式(validationprediction (idx:idx+segmentsPerFile(ii)-1));idx = idx + segmentsPerFile(ii);结束精度=意味着(validationPredictionsPerFile = = adsValidation.Labels) * 100
精度= 92.5000
使用confusionchart
在验证集上评估网络的性能。
图(单位=“归一化”,位置=[0.2 0.2 0.5 0.5]);厘米= confusionchart (adsValidation.Labels validationPredictionsPerFile);厘米。标题= sprintf ("验证数据混淆矩阵\nAccuracy = %0.2f %%"、准确性);厘米。ColumnSummary =“column-normalized”;厘米。RowSummary =“row-normalized”;
可视化预测
查看具有真实和预测类标签的输入数据的随机样本。
numImages =9;idxSubset =兰迪(元素个数(validationLabels), 1, numImages);viewingAngle =(90 -90);图t1 = tiledlayout(“流”TileSpacing =“紧凑”);为i = 1:numImages img = validationFeatures(:,:,:, idx子集(i));YPred = validationPredictions (idxSubset (i));YTrue = validationLabels (idxSubset (i));nexttile冲浪(img EdgeColor =“没有”)视图(viewingAngle)标题({“真正的:“+字符串(YTrue),预测:“+字符串(YPred)},翻译=“没有”)结束colormapparula
的x-轴表示时间y-轴表示频率,colormap表示分贝。对于其中的几个类,您可以看到可解释的特性。例如,光谱图clock_tick
类在时间中显示一个重复的模式,表示时钟的滴答声。第一张谱图来自直升机
类具有持续的、响亮的、低频的直升机引擎声音和代表直升机桨叶旋转的重复高频声音。
由于该网络是一个具有图像输入的卷积神经网络,在进行分类决策时,网络可能会使用这些特征。您可以使用深度学习可解释性技术来研究这个假设。
调查预测
研究验证mel谱图的预测。对于每个输入,生成Grad-CAM (gradCAM
)、石灰(imageLIME
)和遮挡敏感度(occlusionSensitivity
)预测类别的地图。这些方法接受一个输入图像和一个类标签,并生成一个映射,指示图像中对指定类的得分重要的区域。每种可视化方法都有确定其产生的输出的特定方法。
Grad-CAM -使用分类分数相对于网络确定的卷积特征的梯度来理解图像的哪些部分对分类最重要。梯度较大的地方是最终得分最依赖于数据的地方。
使用更简单、更可解释的模型,如线性模型或回归树,近似深度学习网络的分类行为。简单模型确定输入数据的特征的重要性,作为特征对深度学习网络的重要性的代理。
遮挡敏感度——用遮挡遮罩替换输入的小区域,通常是一个灰色的正方形。当掩模在图像中移动时,该技术测量给定类的概率得分的变化。
比较不同可解释性技术的结果对于验证您的结论很重要。有关这些技术的更多信息,请参见深度学习可视化方法.
使用配套功能helperPlotMaps
,在本例的最后定义,绘制输入log MEL谱图和三个可解释性图的选择图像及其预测类。
viewingAngle =(90 -90);imgIdx = [250 500 750];numImages =长度(imgIdx);图t2 = tiledlayout(numImages,4, tilespading = .“紧凑”);为i = 1:numImages img = validationFeatures(:,:,:,imgIdx(i));YPred = validationPredictions (imgIdx (i));YTrue = validationLabels (imgIdx (i));mapClass = YPred;mapClass mapGradCAM = gradCAM(净,img,...OutputUpsampling =“最近的”);mapClass mapLIME = imageLIME(净,img,...OutputUpsampling =“最近的”,...分割=“网格”);mapClass mapOcclusion = occlusionSensitivity(净,img,...OutputUpsampling =“最近的”);地图= {mapGradCAM, mapLIME mapOcclusion};mapNames = [“Grad-CAM”,“石灰”,“闭塞敏感性”];helperPlotMaps (img, YPred YTrue、地图、mapNames, viewingAngle, mapClass)结束
可解释性映射突出了每个谱图的预测类标签感兴趣的区域。
为
clock_tick
类中,所有三个方法都关注相同的兴趣领域。该网络使用与滴答声相对应的区域来进行预测。为
直升机
类,所有三种方法都聚焦于光谱图底部的同一区域。为
crying_baby
类中,这三种方法突出显示光谱图的不同区域,可能是因为这个光谱图包含许多小的特征。像Grad-CAM这样的方法生成的地图分辨率较低,可能很难挑选出有意义的特征。这个例子强调了使用可解释性方法来理解单个网络预测的局限性。
由于训练的结果具有随机性,如果您再次运行此示例,您可能会看到不同的结果。此外,为了为不同的图像产生可解释的输出,您可能需要调整遮挡灵敏度和LIME映射的映射参数。Grad-CAM不需要参数调优,但它可以产生比其他两种方法更低的分辨率映射。
调查对特定班级的预测
研究来自特定类别的光谱图的可解释性图。
找到对应的光谱图直升机
类。
classToInvestigate =“直升飞机”;idxClass = find(classes == classToInvestigate);idxSubset = validationLabels = =类(idxClass);subsetLabels = validationLabels (idxSubset);subsetImages = validationFeatures (:,:,:, idxSubset);subsetPredictions = validationPredictions (idxSubset);imgIdx = [25 50 100];numImages =长度(imgIdx);
使用输入光谱图和预测的类标签生成和绘制可解释性图。
viewingAngle =(90 -90);图t3 = tiledlayout(numImages,4,“TileSpacing”,“紧凑”);为i = 1:numImages img = subsetImages(:,:,:,imgIdx(i));YPred = subsetPredictions (imgIdx (i));YTrue = subsetLabels (imgIdx (i));mapClass = YPred;mapClass mapGradCAM = gradCAM(净,img,...OutputUpsampling =“最近的”);mapClass mapLIME = imageLIME(净,img,...OutputUpsampling =“最近的”,...分割=“网格”);mapClass mapOcclusion = occlusionSensitivity(净,img,...OutputUpsampling =“最近的”);地图= {mapGradCAM, mapLIME mapOcclusion};mapNames = [“Grad-CAM”,“石灰”,“闭塞敏感性”];helperPlotMaps (img, YPred YTrue、地图、mapNames, viewingAngle, mapClass)结束
每张图像的地图显示网络聚焦在高强度和低频率的区域。这个结果是令人惊讶的,因为你可能会认为网络也对随着时间重复的高频噪声感兴趣。发现这样的模式对于理解网络用来进行预测的特征很重要。
调查错误分类
使用可解释性图来调查错误分类。
用真正的班级研究光谱图电锯
但是预测的班级直升机
.
trueClass =“电锯”;predictedClass =“直升飞机”;incorrectIdx = find(validationforecasts == predictedClass & validationLabels' == trueClass);idxToInvestigate = incorrectIdx (1);YPred = validationPredictions (idxToInvestigate);YTrue = validationLabels (idxToInvestigate);
为真正的类(电锯
)和预测的类(直升机
).
图t4 = tiledlayout(2,4,“TileSpacing”,“紧凑”);img = validationFeatures (:,:,:, idxToInvestigate);为mapClass = [YPred, YTrue] mapGradCAM = gradCAM(net,img,mapClass,...OutputUpsampling =“最近的”);mapClass mapLIME = imageLIME(净,img,...OutputUpsampling =“最近的”,...分割=“网格”);mapClass mapOcclusion = occlusionSensitivity(净,img,...OutputUpsampling =“最近的”);地图= {mapGradCAM, mapLIME mapOcclusion};mapNames = [“Grad-CAM”,“石灰”,“闭塞敏感性”];helperPlotMaps (img, YPred YTrue、地图、mapNames, viewingAngle, mapClass)结束
该网络主要针对低频区域进行研究直升机
类。的结果与生成的可解释性映射相匹配直升机
类。视觉检查对于调查网络使用输入的哪些部分来做出分类决策是很重要的。
支持功能
helperPlotMaps
支持函数helperPlotMap
生成输入图像和指定可解释性映射的图形。
函数helperPlotMaps (img, YPred YTrue、地图、mapNames, viewingAngle, mapClass) nexttile冲浪(img EdgeColor =“没有”)视图(viewingAngle)标题({“真正的:“+字符串(YTrue),预测:“+字符串(YPred)},...翻译=“没有”) colormapparulanumMaps =长度(地图);为i = 1:numMaps map = maps{i};mapName = mapNames(我);nexttile冲浪(地图,EdgeColor =“没有”)视图(viewingAngle)标题(mapName mapClass,翻译=“没有”)结束结束
helperAudioPreprocess
支持函数helperAudioPreprocess
作为输入audioDatastore
对象和log mel谱图之间的重叠百分比,并返回适合输入到VGGish网络的预测器和响应矩阵。
函数[predictor,response,segmentsPerFile] = helperAudioPreprocess(ads,overlap) numFiles = numel(ads. files);为每个文件提取预测器和响应为ii = 1:numFiles [audioIn,info] = read(ads);fs = info.SampleRate;特性= vggishPreprocess (fs, audioIn OverlapPercentage =重叠);numSpectrograms =大小(功能,4);预测{2}=功能;响应{2}= repelem (info.Label numSpectrograms);segmentsPerFile (ii) = numSpectrograms;结束将预测器和响应连接到数组中。预测预测=猫(4日{:});响应=猫(2、响应{:});结束
另请参阅
gradCAM
|imageLIME
|occlusionSensitivity
|trainNetwork