使用Grad-CAM解释深度学习时间序列分类
这个例子展示了如何使用gradient-weighted类激活映射(Grad-CAM)技术理解的分类决策时间序列数据的一维卷积神经网络训练。
Grad-CAM[1]使用分类评分的梯度对卷积特性取决于网络理解哪部分数据分类是最重要的。对于时间序列数据,Grad-CAM最重要的时间步长计算的分类决定网络。
这张图片显示了一个示例Grad-CAM colormap重要性顺序。地图上强调了地区的网络使用分类的决定。
这个示例使用监督学习分类的标签数据时间序列数据为“正常”或“传感器失败”。您还可以使用一个autoencoder网络执行时间序列对无标号数据异常检测。有关更多信息,请参见使用深度学习时间序列异常检测。
加载波形数据
加载波形数据集WaveformData.mat
。这些数据集包含可变长度的综合生成的波形。每个波形有三个渠道。
rng (“默认”)加载WaveformData{1}numChannels =大小(数据,1);numObservations =元素个数(数据);
可视化最初几个序列在一个阴谋。
图tiledlayout (2, 2)为i = 1:4 nexttile stackedplot(数据{我}’,DisplayLabels =“通道”+ (1:numChannels));标题(“观察”+ i)包含(“时间步”)结束
模拟传感器故障
创建一个新的数据集通过手动编辑的一些序列来模拟传感器故障。
创建一个修改的数据的副本。
dataUnmodified =数据;
随机选择10%的序列来修改。
failureFraction = 0.1;numFailures =圆(numObservations * failureFraction);failureIdx = randperm(元素个数(数据),numFailures);
模拟传感器故障,介绍一个小添加剂异常身高0.25至2。每个异常发生在一个随机的顺序和步骤4至20次发生。
anomalyHeight = (0.25 - 2);anomalyPatchSize = 20 [4];anomalyHeightRange = anomalyHeight (2) - anomalyHeight (1);
修改序列。
failureLocation =细胞(大小(数据));为i = 1: numFailures X =数据{failureIdx (i)};%生成传感器故障的位置。patchLength =兰迪(anomalyPatchSize, 1);patchStart =兰迪(长度(X) -patchLength);idxPatch = patchStart:(patchStart + patchLength);%产生异常高。patchExtraHeight = anomalyHeight (1) + anomalyHeightRange *兰德(1,1);(:,idxPatch) = X (:, idxPatch) + patchExtraHeight;%保存修改后的序列。数据{failureIdx(我)}= X;%保存失败的位置。failureLocation {failureIdx (i)} = idxPatch;结束
修改的序列,设置类标签正常的
。修改后的序列,设置类标签传感器故障
。
标签= repmat (“正常”numObservations 1);标签(failureIdx) =“传感器失败”;=分类标签(标签);
可视化类标签使用直方图分布。
图直方图(标签)
可视化传感器故障
比较序列与原序列的选择修改。虚线表示的区域传感器故障。
numFailuresToShow = 2;为图t =我= 1:numFailuresToShow tiledlayout (numChannels, 1);idx = failureIdx(我);modifiedSignal = {idx}数据;originalSignal = dataUnmodified {idx};为j = 1: numChannels nexttile情节(modifiedSignal (j,:))在情节(originalSignal (j,:)) ylabel (“通道”+ j)包含(“时间步”)参照线(failureLocation {idx} (1),”:“)参照线(failureLocation {idx}(结束),”:“)举行从结束标题(t)“观察”+ failureIdx(我))传说(“修改”,“原始”,…位置=“southoutside”,…NumColumns = 2)结束
修改和原始信号匹配除了异常块对应传感器故障。
准备数据
准备培训的数据把数据分成训练集和验证集。使用90%的数据进行训练和10%的数据进行验证。
trainFraction = 0.9;idxTrain = 1:地板(trainFraction * numObservations);idxValidation = (idxTrain(结束)+ 1):numObservations;XTrain =数据(idxTrain);TTrain =标签(idxTrain);XValidation =数据(idxValidation);TValidation =标签(idxValidation);failureLocationValidation = failureLocation (idxValidation);
定义网络体系结构
定义一维卷积神经网络架构。
使用序列输入层和一个输入大小相匹配的渠道数量的输入数据。
ReLU指定两个街区的一维卷积,卷积层和层归一化层,有一个过滤器的大小3。为第一和第二指定32和64过滤器卷积层,分别。对卷积层,left-pad输入,输出有相同的长度(因果填充)。
减少卷积层单一的输出向量,用一个一维全球平均池层。
输出映射到一个向量的概率,指定一个完全连接层和一个输出大小匹配的类的数量,其次是softmax层和一层分类。
类=类别(TTrain);numClasses =元素个数(类);filterSize = 3;numFilters = 32;层= […sequenceInputLayer numChannels convolution1dLayer (filterSize numFilters,填充=“因果”)reluLayer layerNormalizationLayer (OperationDimension =“batch-excluded”)convolution1dLayer (2 * numFilters filterSize,填充=“因果”)reluLayer layerNormalizationLayer (OperationDimension =“batch-excluded”)globalAveragePooling1dLayer fullyConnectedLayer (numClasses) softmaxLayer classificationLayer];
指定培训选项
使用自适应动量列车网络(亚当)。时代的最大数量设置为15和使用mini-batch 27的大小。Left-pad mini-batch中所有序列长度相同。使用验证数据来验证网络在训练。监控培训进展情节和抑制详细的输出。
miniBatchSize = 27个;选择= trainingOptions (“亚当”,…MiniBatchSize = MiniBatchSize,…MaxEpochs = 15,…SequencePaddingDirection =“左”,…ValidationData = {XValidation, TValidation},…情节=“训练进步”,…Verbose = false);
列车网络的
火车的卷积网络使用指定的选项trainNetwork
函数。
网= trainNetwork (XTrain、TTrain层,选择);
测试网络
验证数据使用同一个mini-batch大小进行分类和顺序填充选项用于培训。
XValidation YValidation =分类(净,…MiniBatchSize = MiniBatchSize,…SequencePaddingDirection =“左”);
计算预测的分类精度。
精度=意味着(YValidation = = TValidation)
精度= 0.9500
可视化预测混淆矩阵。
图confusionchart (TValidation YValidation)
使用Grad-CAM解释分类结果
使用Grad-CAM来可视化网络使用的部分序列进行分类决策。
找到正确的一个子集序列网络分类为“传感器失败”。
numFailuresToShow = 2;isCorrect = TValidation = =“传感器失败”& YValidation = =“传感器失败”;idxValidationFailure =找到(isCorrect numFailuresToShow);
对于每一个观察,计算和可视化Grad-CAM地图。计算重要性Grad-CAM地图,使用gradCAM
。显示一个colormap代表Grad-CAM使用重要性plotWithColorGradient
helper函数,定义在这个例子。添加虚线显示的真实位置传感器故障。
为图t =我= 1:numFailuresToShow tiledlayout (numChannels, 1);idx = idxValidationFailure(我);modifiedSignal = XValidation {idx};modifiedSignal重要性= gradCAM(净,“传感器失败”);为j = 1: numChannels nexttile plotWithColorGradient (modifiedSignal (j,:)、重要性);ylabel (“通道”+ j)包含(“时间步骤”)如果~ isempty (failureLocationValidation {idx})参照线(failureLocationValidation {idx} (1),”:“)参照线(failureLocationValidation {idx}(结束),”:“)结束结束标题(t)“Grad-CAM:验证观察”+ idx) c = colorbar;c.Layout。瓦=“东”;c.Label。字符串=“Grad-CAM重要性”;结束
Grad-CAM地图显示,网络是正确使用传感器故障区域的序列进行分类决策。使用正确的区域表明网络学习如何区分正常和失败的数据。网络是用失败来决定,而不是虚假的背景特征。
使用Grad-CAM调查误分类
您还可以使用Grad-CAM调查分类错误的序列。
找到一个网络的传感器故障序列子集分类为“正常”。
numFailuresToShow = 2;isIncorrect = TValidation = =“传感器失败”& YValidation = =“正常”;idxValidationFailure =找到(isIncorrect numFailuresToShow);
对于每个错误分类,计算和可视化Grad-CAM地图。分类错误的传感器故障序列,Grad-CAM地图显示网络并找到故障区域。但是,与正确分类序列,网络不使用整个失败地区分类决策。
为i = 1:长度(idxValidationFailure)图t = tiledlayout (numChannels, 1);idx = idxValidationFailure(我);modifiedSignal = XValidation {idx};modifiedSignal重要性= gradCAM(净,“传感器失败”);为j = 1: numChannels nexttile plotWithColorGradient (modifiedSignal (j,:)、重要性);ylabel (“通道”+ j)包含(“时间步骤”)如果~ isempty (failureLocationValidation {idx})参照线(failureLocationValidation {idx} (1),”:“)参照线(failureLocationValidation {idx}(结束),”:“)结束结束标题(t)“Grad-CAM:验证观察”+ idx) c = colorbar;c.Layout。瓦=“东”;c.Label。字符串=“Grad-CAM重要性”;结束
Helper函数
的plotWithColorGradient
函数作为输入序列与一个单通道和一个地图的重要性相同数量的步骤序列。函数使用序列映射到颜色的重要性。
设置的最后一个条目y
和c
来南
这片创建一条线而不是一个封闭的多边形。
函数plotWithColorGradient(顺序、重要性)x = 1:尺寸(序列,1)+ 1;y =[序列;南);c =[重要性;南);补丁(x, y, c, EdgeColor =“插值函数”);结束
[1]Selvaraju, Ramprasaath R。,Michael Cogswell, Abhishek Das, Ramakrishna Vedantam, Devi Parikh, and Dhruv Batra. “Grad-CAM: Visual Explanations from Deep Networks via Gradient-Based Localization.” International Journal of Computer Vision 128, no. 2 (February 2020): 336–59. https://doi.org/10.1007/s11263-019-01228-7.
另请参阅
gradCAM
|imageLIME
|occlusionSensitivity
|deepDreamImage