主要内容

研究使用LIME进行谱图分类

这个例子展示了如何使用局部可解释模型未知解释(LIME)来研究训练用于分类频谱图的深度卷积神经网络的鲁棒性。LIME是一种技术,用于可视化观测的哪些部分有助于网络的分类决策。本例使用imageLIME函数,以了解频谱图数据中哪些特征对分类最重要。

在这个例子中,你创建并训练一个神经网络来分类四种模拟时间序列数据:

  • 单频的正弦波

  • 三个正弦波的叠加

  • 时间序列中的宽高斯峰

  • 时间序列中的高斯脉冲

为了使这个问题更加现实,时间序列包括了添加的混杂信号:一个恒定的低频背景正弦信号和大量的高频噪声。噪声时间序列数据是一个具有挑战性的序列分类问题。您可以先将时间序列数据转换为时间-频率谱图,以揭示时间序列数据中的潜在特征,从而解决这个问题。然后,您可以将光谱图输入到图像分类网络。

生成波形和频谱图

为这四个类生成时间序列数据。本例使用helper函数generateSpectrogramData生成时间序列和相应的频谱图数据。本例中使用的helper函数作为支持文件附加。金宝app

numObsPerClass = 500;类别=分类([“SingleFrequency”“ThreeFrequency”“高斯”“脉搏”]);numClasses =长度(类);[noisyTimeSeries,频谱图,标签]= generateSpectrogramData(numObsPerClass,classes);

计算光谱图图像的大小和观测的次数。

inputSize = size(频谱图,[1 2]);numObs =大小(谱图,4);

图生成数据

绘制添加了噪声的时间序列数据的子集。由于噪声具有与信号相当的振幅,因此数据在时域中表现为噪声。这一特点使分类成为一个具有挑战性的问题。

figure numPlots = 12;i=1:numPlots subplot(3,4,i) plot(noisyTimeSeries(i,:)) title(labels(i))结束

以与时间序列图相同的顺序绘制噪声数据的时频谱图。横轴是时间,纵轴是频率。

数字I =1:12 subplot(3,4, I) imshow(spectrograms(:,:,1, I)) hold住colormapparula标题(标签(i))结束

每个类的特征都清晰可见,说明了为什么从时域图像转换为光谱图图像对这类问题是有益的。例如,SingleFrequency类在基频处有一个单峰,在谱图中可见为水平条。为ThreeFrequency类,三个频率是可见的。

所有类别都在低频(靠近图像顶部)显示一个微弱的带,对应于背景正弦波。

分割数据

使用splitlabels函数将数据划分为训练数据和验证数据。使用80%的数据进行训练,20%的数据进行验证。

splitindexes = splitlabels(标签,0.8);trainLabels = labels(splitIndices{1});trainSpectrograms = spectrograms(:,:,:,splitIndices{1});valLabels =标签(splitIndices{2});valSpectrograms = spectrograms(:,:,:,splitIndices{2});

定义神经网络架构

用卷积块、批归一化和ReLU层创建卷积神经网络。

dropoutProb = 0.2;numFilters = 8;图层= [imageInputLayer(inputSize) convolution2dLayer(3,numFilters,“填充”“相同”maxPooling2dLayer(3,“步”2,“填充”“相同”) convolution2dLayer (3 2 * numFilters“填充”“相同”(3,4*numFilters,“填充”“相同”) batchNormalizationLayer reluLayer globalMaxPooling2dLayer dropoutLayer(dropoutProb) fullyConnectedLayer(numClasses) softmaxLayer classificationLayer];

明确培训选择

使用SGDM优化器定义训练选项。属性来在每个纪元洗牌数据“洗牌”选项“every-epoch”.通过设置监控培训进度“阴谋”选项“训练进步”.若要抑制详细输出,请设置“详细”

选项= trainingOptions(“个”...“洗牌”“every-epoch”...“阴谋”“训练进步”...“详细”假的,...“ValidationData”, {valSpectrograms, valLabels});

列车网络的

训练网络对谱图图像进行分类。

net = trainNetwork(trainSpectrograms,trainLabels,layers,options);

精度

使用训练过的网络对验证观测数据进行分类。

predLabels =分类(net,valSpectrograms);

通过绘制与的混淆矩阵来研究网络性能confusionchart

图confusionchart (valLabels predLabels,“归一化”“row-normalized”

该网络准确地分类验证谱图,大多数类别的准确率接近100%。

调查网络预测

使用imageLIME函数,以了解图像数据中哪些特征对分类最重要。

LIME技术将图像分割成几个特征,并通过随机包含或排除特征来生成合成观测。将被排除特征中的每个像素替换为平均图像像素的值。该网络将这些合成的观察数据进行分类,并使用预测类别的结果分数,以及特征的存在或不存在,作为响应和预测因子,用一个更简单的模型(本例中为回归树)来训练回归问题。回归树试图在单个观察上近似网络的行为。它会学习哪些特征是重要的,并且会显著影响课程分数。

定义自定义分割地图

默认情况下,imageLIME使用超像素分割将图像划分为特征。此选项适用于自然图像,但对于频谱图数据效果较差。属性可以指定自定义分割映射“分割”与图像大小相同的数字数组的名称-值参数,其中每个元素都是一个整数,对应于像素所在的特征的索引。

对于谱图数据,谱图图像在y维(频率)上具有比x维(时间)更精细的特征。生成240段的分割图,在40 × 6的网格中,以提供更高的频率分辨率。方法将网格上采样到图像的大小imresize函数,指定上采样方法为“最近的”

featureIdx = 1:240;segmentationMap =重塑(featureIdx,6,40)';segmentationMap = imresize(segmentationMap,inputSize,“最近的”);

计算LIME地图

绘制光谱图并计算每个类的两个观测的LIME图。

obsToShowPerClass = 2;j = 1: obsToShowPerClass图i=1:长度(类)idx = find(valLabels ==类(i),obsToShowPerClass);读取测试图像和标签。testSpectrogram = valSpectrograms(:,:,:,idx(j));testLabel = valLabels(idx(j));计算LIME重要性图。map = imagelme (net,testSpectrogram,testLabel,...“NumSamples”, 4096,...“分割”, segmentationMap);将映射缩放到图像的大小。mapRescale = uint8(255*rescale(map));在LIME图旁边绘制光谱图图像。。subplot(2,2,i) imshow(imtile({testSpectrogram,mapRescale})) title(string(testLabel))颜色映射parula结束结束

LIME图表明,对于大多数类,网络集中在分类的相关特征上。例如,对于SingleFrequency类,网络重点关注与正弦波功率谱对应的频率,而不是虚假的背景细节或噪声。

SingleFrequency类,网络用频率来分类。为脉冲高斯类,网络额外关注频谱图的正确频率部分。对于这三类,网络不会被所有频谱图顶部附近可见的背景频率所混淆。这个信息对区分这些类没有帮助(因为它存在于所有类中),所以网络会忽略它。相反,对于ThreeFrequency类,恒定的背景频率与网络的分类决策相关。对于这个类,网络并没有忽略这个频率,而是将它与三个实际频率同等重要。

imageLIME结果表明,该网络正确地利用了时频谱图中的波峰,并且没有被杂散背景正弦波所混淆ThreeFrequency类,其中网络不区分信号中的三个频率和低频背景。

另请参阅

|(信号处理工具箱)|

相关的话题