心电图分类(一维数组)实现类激活图CAM可视化

最近希望通过观察特征的重要性进行模型分析,通过下面这篇文章了解了神经网络当中存在一些可视化操作,Keras实现卷积神经网络(CNN)可视化,包括有:
主要的四种可视化模式:

  1. 卷积核输出的可视化,即可视化卷积操作后的结果,帮助理解卷积核的作用。
  2. 卷积核的可视化,对卷积核本身进行可视化,对卷积核学习到的行为进行解释。
  3. 类激活图可视化,通过热度图,了解图像分类问题中图像哪些部分起到了关键作用,同时可以定位图像中物体的位置。
  4. 特征可视化,与第一种方法类似,但是输出的不再是卷积层的激活值,而是使用反卷积与反池化来可视化输入图像的激活特征。

卷积核输出和卷积核可视化都比较简单,这里主要是想实现一下类激活图的可视化。
主要参考了这篇博客:keras CAM和Grad-cam原理简介与实现
两种类型的分类模型。feature extraction+Flatten+softmax和feature extraction+GAP+softmax,我使用的是第二种:
心电图分类(一维数组)实现类激活图CAM可视化_第1张图片

代码如下:

x = X_test[0]#这里是获取的测试集的某一个样本作为输入
x = np.expand_dims(x,axis=0)#扩展维度
model = load_model('multilabel_model_0907.h5',custom_objects={'acc_loss': acc_loss, 'f1': f1, 'acc': acc})#下载保存的模型
pred = model.predict(x)
class_idx = np.argmax(pred[0])

class_output = model.output[:,class_idx]
last_conv_layer = model.get_layer("multiply_11")#这里是最后一个特征提取操作
gap_weights = model.get_layer("average_pooling")#模型的GAP操作
tf.compat.v1.disable_eager_execution()
import tensorflow.keras.backend as K
import tensorflow as tf
grads = K.gradients(class_output,gap_weights.output)[0]
iterate = K.function([model.input],[grads,last_conv_layer.output[0]])
pooled_grads_value, conv_layer_output_value = iterate([x])
pooled_grads_value = np.squeeze(pooled_grads_value,axis=0)
for i in range(256):#最后一个特征提取层的卷积核数量
    conv_layer_output_value[:,i] *= pooled_grads_value[i]
heatmap = np.mean(conv_layer_output_value, axis=-1)
heatmap = np.maximum(heatmap,0)#relu激活。
heatmap /= np.max(heatmap)
import cv2
from PIL import Image
img = np.uint8(255*X_test[0])
heatmap = cv2.resize(heatmap,(img.shape[1],img.shape[0]))
heatmap = np.uint8(255*heatmap)
heatmap = cv2.applyColorMap(heatmap,cv2.COLORMAP_JET)
img = cv2.applyColorMap(img,cv2.COLORMAP_JET)#由蓝色到红色,越红关注度越高
superimposed_img = cv2.addWeighted(img,0.6,heatmap,0.4,0)
cv2.imwrite('heatmap.png',heatmap)
cv2.imwrite('img.png',img)
cv2.imwrite('Grad-cam.png',superimposed_img)

最终我得到的heatmap如下图:
在这里插入图片描述

你可能感兴趣的