如何最有效地可视化一维卷积?

5
我目前在Keras中使用一维卷积神经网络对多元时间序列进行分类。特别地,每个实例由9个等长时间序列(每个序列300个点)表示。
据我所读的文献,当在图像上使用二维卷积时,可以得到一个提示,指示网络为了分类而查看哪些部分:例如,您可以使用所谓的类激活映射,例如:

https://rajpurkar.github.io/mlx/visualizing-cnns/class_activation_maps.png

有没有类似的工具能够可视化给定多元时间序列中最“有意义”的部分?
这是我的当前网络架构:
Input shape: 300 9
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d_1 (Conv1D)            (None, 292, 128)          10496     
_________________________________________________________________
batch_normalization_1 (Batch (None, 292, 128)          512       
_________________________________________________________________
activation_1 (Activation)    (None, 292, 128)          0         
_________________________________________________________________
max_pooling1d_1 (MaxPooling1 (None, 58, 128)           0         
_________________________________________________________________
conv1d_2 (Conv1D)            (None, 50, 128)           147584    
_________________________________________________________________
batch_normalization_2 (Batch (None, 50, 128)           512       
_________________________________________________________________
activation_2 (Activation)    (None, 50, 128)           0         
_________________________________________________________________
max_pooling1d_2 (MaxPooling1 (None, 10, 128)           0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 1280)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 300)               384300    
=================================================================
Total params: 543,404
Trainable params: 542,892
Non-trainable params: 512
_________________________________________________________________

目前为止,我已经成功地将网络中的激活函数可视化。例如,以下代码片段打印了第一个激活层(128个中的第1个)中第一个激活函数的结果,给定输入实例:

from keras import models

layer_outputs = [layer.output for layer in model.layers[:2]]
activation_model = models.Model(inputs=model.input, outputs=layer_outputs)
activations = activation_model.predict(X_train_windows[0:1])
first_layer_activation = activations[0]
print(first_layer_activation.shape)

plt.plot(first_layer_activation[0, :, 0])

以下是长度为292的时间序列结果:

https://i.ibb.co/TqK6g9D/Schermata-2019-01-15-alle-10-24-39-2.png

然而,我发现很难直观地解释这个图表。
我该如何给这样的时间序列赋予意义?是否有一种方法可以像CAMs一样突出显示输入?
谢谢!
1个回答

3
您可以使用类似Keras-Vis Library的工具。
基本上,您需要找到最大化某个类别的输入,这将导致一些1D序列(在您的情况下为300个元素的9个向量序列)。
然后,您可以单独绘制每个通道或将其叠加在一起,以了解此内容的外观。然后,您需要具备领域知识,尝试理解其含义(如果有意义的话)。 如果您想要了解某个类别的输入是什么样子,这很有用
您也可以使用激活图显著性地图)(使用同一链接的库计算)来完成相同的操作。 如果您想了解信息在哪里(在空间中)的位置,这很有用
现在,不了解数据的性质,领域或上下文,很难说更多... 编辑: 我现在明白你的问题了。尝试将这个问题视为多实例学习也许值得一试。
你还可以尝试使用LSTM注意力机制

1
谢谢。尝试使用Saliency(keras-vis / examples / resnet / attention.ipynb)可能是一个不错的选择。我正在处理医学数据集。每个实例都是一个患者,由9个读数(脉搏,氧饱和度等)描述,所有读数都由同一监测器记录(因此它们全部在同一时间开始,并具有相同的长度)。基于这样的信息,我将对应于记录的整个时间间隔与检测到特定异常的时刻进行标记。这种方法效果很好。现在有趣的是了解神经网络如何做出这样的决策。 - Andrea
好的,我现在明白你的问题了。或许将这个问题视为多实例学习也值得一试:https://en.m.wikipedia.org/wiki/Multiple_instance_learning - Luca Angioloni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接