主要内容

使用深度学习可解释性技术研究音频分类

这个例子展示了如何使用可解释性技术来调查训练为分类音频数据的深度神经网络的预测。

深度学习网络通常被描述为“黑盒”,因为网络做出某种决定的原因并不总是显而易见的。您可以使用可解释性技术将网络行为转换为人们可以解释的输出。这个可解释的输出可以回答关于网络预测的问题。这个例子使用了可解释性技术,该技术使用网络正在“观察”的视觉表示来解释网络预测。然后,您可以使用这些可视化表示来查看网络正在使用输入图像的哪些部分来进行决策。

这个例子使用迁移学习重新训练VGGish,一个预训练的卷积神经网络,来分类一组新的音频信号。

加载数据

下载并解压缩环境声音分类数据集。该数据集由标记为10种不同音频声音类别之一的录音组成(ESC-10)。下载esc - 10. - zipzip文件,然后解压缩该文件。

rng (“默认”) zipFile = matlab.internal.examples.download金宝appSupportFile(“音频”“esc - 10. - zip”);filepath = fileparts(zipFile);dataFolder = fullfile(文件路径,“ESC-10”);解压缩(zipFile dataFolder)

创建一个audioDatastore对象来管理数据并将其分割为训练集和验证集。使用countEachLabel显示声音类别的分布和唯一标签的数量。

ads = audioDatastore(dataFolder, inclesubfolders =true,LabelSource=“foldernames”);labelTable = countEachLabel(广告)
labelTable =10×2表标签计数______________ _____链锯40时钟滴答40噼里啪啦火40哭泣的婴儿40狗40直升机40雨40公鸡38海浪40打喷嚏40

确定类的总数。

classes = labelTable.Label;numClasses = size(labelTable,1);

使用splitEachLabel将数据集分成训练集和验证集。使用80%的数据进行训练,20%的数据进行验证。

[adsTrain,adsValidation] = splitEachLabel(ads,0.8,0.2);

VGGish预训练网络需要将音频信号预处理成log mel谱图。支持函数金宝apphelperAudioPreprocess,在本例的末尾定义,它接受输入anaudioDatastore对象和log mel谱图之间的重叠百分比,并返回适合输入到VGGish网络的预测器和响应矩阵。每个音频文件被分割成几个片段,馈送到VGGish网络。

overlapPercentage = 75;[trainFeatures,trainLabels] = helperAudioPreprocess(adsTrain,overlapPercentage);[validationFeatures,validationLabels,segmentsPerFile] = helperAudioPreprocess(adsValidation,overlapPercentage);

可视化数据

查看数据的随机样本。

numImages = 9;idx子集= randi(numel(trainLabels),1,numImages);viewingAngle =(90 -90);图tiledlayout (“流”TileSpacing =“紧凑”);i = 1:numImages img = trainFeatures(:,:,:, idx子集(i));label = trainLabels(idx子集(i));nexttile冲浪(img EdgeColor =“没有”view(视角)”类:“+字符串(标签),翻译=“没有”结束colormapparula

构建网络

这个例子使用迁移学习重新训练VGGish,一个预训练的卷积神经网络,来分类一组新的音频信号。

下载VGGish Network

下载并解压缩VGGish的Audio Toolbox™模型。

类型vggish在命令窗口。如果没有安装VGGish的Audio Toolbox模型,则该函数将提供到网络权重位置的链接。要下载模型,请单击链接。将文件解压缩到MATLAB路径上的某个位置。

加载VGGish模型并将其转换为layerGraph对象。

pretrainedNetwork = vggish;lgraph = layerGraph(pretrainedNetwork.Layers);

为迁移学习准备网络

通过将最后的层替换为适合新数据的新层,为迁移学习准备网络。您可以使用深度网络设计器以编程方式或交互方式调整VGGish以适应新数据。有关显示如何使用深度网络设计器执行音频分类网络迁移学习的示例,请参见深度网络设计器中预训练音频网络的迁移学习

使用removeLayers从图中删除最后的回归输出层。在删除回归层之后,图形的新最终层是一个名为ReLU的层EmbeddingBatch

lgraph = removeLayers(“regressionoutput”);lgraph.Layers(结束)
ans = ReLULayer属性:名称:` 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(“EmbeddingBatch”“FCFinal”);lgraph = connectLayers(“FCFinal”“softmax”);lgraph = connectLayers(“softmax”“classOut”);

指定培训项目

若要定义培训选项,请使用trainingOptions函数。设置解算器为“亚当”并训练5个周期,迷你批次大小为128。指定初始学习率为0.001,并在两个epoch之后通过乘以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使用GPU(如果有的话)。否则,它使用CPU。在GPU上进行训练需要并行计算工具箱™和受支持的GPU设备。金宝app有关受支持设备的信息,请参见金宝appGPU计算要求(并行计算工具箱).属性指定执行环境ExecutionEnvironment的名称-值参数trainingOptions

[net,netInfo] = trainNetwork(trainFeatures,trainLabels,lgraph,options);
单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%  | |======================================================================================================================| 培训完成:马克思时代完成。

测试网络

利用训练好的网络对验证谱图进行分类。

[validationforecasts,validationScores] = category (net,validationFeatures);

每个音频文件产生多个mel谱图。使用多数规则决策结合验证集中每个音频文件的预测并计算分类精度。

Idx = 1;validationPredictionsPerFile = category;ii = 1:numel(adsValidation.Files) validationPredictionsPerFile(ii,1) = mode(validationPredictions(idx:idx+segmentsPerFile(ii)-1));idx = idx + segmentsPerFile(ii);结束accuracy = mean(validationPredictionsPerFile==adsValidation.Labels)*100
准确度= 92.5000

使用confusionchart在验证集上评估网络的性能。

图(单位=“归一化”,Position=[0.2 0.2 0.5 0.5]);cm = confusionchart(adsValidation.Labels,validationPredictionsPerFile);厘米。标题= sprintf("验证数据的混淆矩阵\nAccuracy = %0.2f %%"、准确性);厘米。ColumnSummary =“column-normalized”;厘米。RowSummary =“row-normalized”

可视化预测

使用真实和预测的类标签查看输入数据的随机样本。

numImages =9;idx子集= randi(nummel (validationLabels),1,numImages);viewingAngle =(90 -90);图t1 = tiledlayout(“流”TileSpacing =“紧凑”);i = 1:numImages img = validationFeatures(:,:,:, idx子集(i));YPred = validationforecasts (idx子集(i));YTrue = validationLabels(idx子集(i));nexttile冲浪(img EdgeColor =“没有”)视图(视角)标题({“真正的:“+字符串(YTrue),预测:“+字符串(YPred)},翻译=“没有”结束colormapparula

x-axis表示时间,则y-轴表示频率,颜色图表示分贝。对于其中几个类,您可以看到可解释的特性。例如,光谱图clock_tick类在时间上显示了一个重复的模式,表示时钟的滴答声。第一张光谱图直升机Class有持续的、响亮的、低频的直升机发动机声音和重复的高频声音,代表直升机桨叶的旋转。

由于网络是一个带有图像输入的卷积神经网络,网络在进行分类决策时可能会使用这些特征。你可以使用深度学习可解释性技术来研究这个假设。

调查预测

研究验证梅尔谱图的预测。对于每个输入,生成Grad-CAM (gradCAM)、青柠(imageLIME),以及遮挡敏感度(occlusionSensitivity)预测类别的映射。这些方法获取一个输入图像和一个类标签,并生成一个映射,指示图像中对指定类的分数重要的区域。每种可视化方法都有特定的方法来决定其产生的输出。

  • Grad-CAM -使用分类分数相对于由网络确定的卷积特征的梯度来了解图像的哪些部分对分类最重要。梯度较大的地方是最终得分最依赖于数据的地方。

  • LIME -使用更简单、更可解释的模型(如线性模型或回归树)近似深度学习网络的分类行为。简单模型确定输入数据的特征的重要性,作为特征对深度学习网络重要性的代理。

  • 遮挡敏感性-用遮挡罩(典型的灰色方块)代替输入的小区域来干扰它们。当掩码在图像上移动时,该技术测量给定类的概率分数的变化。

比较不同可解释性技术的结果对于验证你的结论是很重要的。有关这些技术的更多信息,请参见深度学习可视化方法

使用支持函数金宝apphelperPlotMaps,在本例结束时定义,绘制输入log MEL谱图和三个可解释性图,用于选择图像及其预测类别。

viewingAngle =(90 -90);imgIdx = [250 500 750];numImages = length(imgIdx);figure t2 = tiledlayout(numImages,4, tilespace =“紧凑”);i = 1:numImages img = validationFeatures(:,:,:,imgIdx(i));YPred = validationforecasts (imgIdx(i));YTrue = validationLabels(imgIdx(i));mapClass = YPred;mapGradCAM = gradCAM(net,img,mapClass,...OutputUpsampling =“最近的”);mapLIME = imageLIME(net,img,mapClass,...OutputUpsampling =“最近的”...分割=“网格”);mapOcclusion = occlusionSensitivity(net,img,mapClass,...OutputUpsampling =“最近的”);maps = {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(class == classToInvestigate);idx子集= validationLabels==classes(idxClass);subsetLabels = validationLabels(idx子集);subsetImages = validationFeatures(:,:,:, idx子集);subsetforecasts = validationforecasts (idx子集);imgIdx = [25 50 100];numImages = length(imgIdx);

使用输入谱图和预测的类别标签生成并绘制可解释性图。

viewingAngle =(90 -90);figure t3 = tiledlayout(numImages,4,“TileSpacing”“紧凑”);i = 1:numImages img = subsetImages(:,:,:,imgIdx(i));YPred = subsetforecasts (imgIdx(i));YTrue = subsetLabels(imgIdx(i));mapClass = YPred;mapGradCAM = gradCAM(net,img,mapClass,...OutputUpsampling =“最近的”);mapLIME = imageLIME(net,img,mapClass,...OutputUpsampling =“最近的”...分割=“网格”);mapOcclusion = occlusionSensitivity(net,img,mapClass,...OutputUpsampling =“最近的”);maps = {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 = validationforecasts (idxToInvestigate);YTrue = validationLabels(idxToInvestigate);

生成并绘制真实类的映射(电锯)和预测的类别(直升机).

图t4 = tiledlayout(2,4,“TileSpacing”“紧凑”);img = validationFeatures(:,:,:,idxToInvestigate);mapClass = [YPred, YTrue] mapGradCAM = gradCAM(net,img,mapClass,...OutputUpsampling =“最近的”);mapLIME = imageLIME(net,img,mapClass,...OutputUpsampling =“最近的”...分割=“网格”);mapOcclusion = occlusionSensitivity(net,img,mapClass,...OutputUpsampling =“最近的”);maps = {mapGradCAM,mapLIME,mapOcclusion};mapNames = [“Grad-CAM”“石灰”“闭塞敏感性”];helperPlotMaps (img, YPred YTrue、地图、mapNames, viewingAngle, mapClass)结束

该网络主要针对低频区域直升机类。方法生成的可解释性映射与结果相匹配直升机类。视觉检查对于研究网络使用输入的哪些部分来做出分类决策是很重要的。

金宝app支持功能

helperPlotMaps

支持函数金宝apphelperPlotMap生成输入图像和指定的可解释性映射的图形。

函数helperPlotMaps(img,YPred,YTrue,地图,mapNames,viewingAngle,mapClass) nexttile冲浪(img,EdgeColor=“没有”)视图(视角)标题({“真正的:“+字符串(YTrue),预测:“+字符串(YPred)},...翻译=“没有”) colormapparulanumMaps =长度(地图);i = 1:numMaps map = maps{i};mapName = mapNames(i);nexttile冲浪(地图,EdgeColor =“没有”) view(viewingAngle) title(mapName,mapClass,interpreter=“没有”结束结束

helperAudioPreprocess

支持函数金宝apphelperAudioPreprocess作为输入audioDatastore对象和log mel谱图之间的重叠百分比,并返回适合输入到VGGish网络的预测器和响应矩阵。

函数[predictor,response,segmentsPerFile] = helperAudioPreprocess(ads,overlap) numFiles = numel(ads. files);为每个文件提取预测器和响应ii = 1:numFiles [audioIn,info] = read(ads);fs = info.SampleRate;features = vggishPreprocess(audioIn,fs,OverlapPercentage=overlap);numSpectrograms = size(features,4);预测器{ii} =特征;response{ii} = repelem(info.Label,numSpectrograms);segmentsPerFile(ii) = numSpectrograms;结束将预测器和响应连接到数组中预测器= cat(4,预测器{:});Response = cat(2, Response {:});结束

另请参阅

|||

相关的话题