这个例子展示了如何使用局部可解释模型未知解释(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图。
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
类,其中网络不区分信号中的三个频率和低频背景。
imageLIME
|pspectrum
(信号处理工具箱)|trainNetwork