赞
踩
最近希望通过观察特征的重要性进行模型分析,通过下面这篇文章了解了神经网络当中存在一些可视化操作,Keras实现卷积神经网络(CNN)可视化,包括有:
主要的四种可视化模式:
卷积核输出和卷积核可视化都比较简单,这里主要是想实现一下类激活图的可视化。
主要参考了这篇博客:keras CAM和Grad-cam原理简介与实现
两种类型的分类模型。feature extraction+Flatten+softmax和feature extraction+GAP+softmax,我使用的是第二种:
代码如下:
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如下图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。