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

时间:2019-01-15 09:27:21

标签: python keras

我目前正在使用一维卷积神经网络对Keras中的多元时间序列进行分类。特别是,每个实例都由9个等长的时间序列(每个300点)表示。

正如我在文献中阅读的那样,在图像上使用2D卷积时,可能会提示网络在哪里以进行分类:例如,您可以使用所谓的Class激活图,例如:

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上的第一个):

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

但是,我发现很难直观地解释图形。

如何给这样的时间序列赋予含义? 有没有办法像在CAM中那样突出显示输入?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用Keras-Vis Library

之类的东西

基本上,您尝试找到最大化某个类的输入,这会产生一些一维序列(在您的情况下,是300个9个元素的向量的序列)。

然后可以分别绘制9个通道中的每个通道,也可以在另一个通道上绘制,以了解此事物的外观。然后,您需要具有领域知识,以尝试理解这意味着什么(如果有任何含义)。 如果您想了解某个类的输入是什么样子,这很有用。

您可以对激活图显着图)进行相同的操作(可以使用链接的相同库进行计算)。 如果您想了解信息在空间中的位置,这很有用

现在,在不知道数据的性质,域或上下文的情况下,很难说更多...

修改

好,我现在了解您的问题。将这个问题视为Multiple Instance Learning

可能也是值得的

您还可以尝试将 LSTM 注意机制一起使用。