python学习之卷积神经网络的可视化

推荐链接:https://blog.csdn.net/qq_43433255/article/details/94411842

我们将介绍另一种可视化技术,它有助于理解给定图像的哪些部分引导convnet做出最终的分类决策。这有助于“调试”convnet的决策过程,特别是在分类错误的情况下。它还允许您在图像中定位特定对象。
这类技术被称为“类激活图”(CAM)可视化,它包括在输入图像上生成“类激活”的热图。“类激活”heatmap是与特定输出类相关联的二维分数网格,针对任何输入图像中的每个位置进行计算,表明每个位置对所考虑的类有多重要。例如,假设一个图像输入到我们的“猫对狗”convnet中,类激活映射可视化允许我们为类“cat”生成一个heatmap,指示图像中猫的不同部分是怎样的,同样,对于类“dog”,指示图像中狗的不同部分是怎样的。
我们将使用的具体实现是Grad Cam中描述的:您为什么这么说?通过基于梯度的定位从深层网络进行可视化解释。它非常简单:它包括获取给定输入图像的卷积层的输出特征映射,并通过类相对于通道的梯度来加权该特征映射中的每个通道。直观地说,理解这个技巧的一种方法是,我们通过“每个通道对类的重要性”来加权“输入图像激活不同通道的强度”的空间图,从而得出“输入图像激活类的强度”的空间图。

from keras.applications.vgg16 import VGG16
K.clear_session()
from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input, decode_predictions
import numpy as np
import cv2

#注意,我们在顶部包括了密接分类器;
#以前,我们一直在丢弃它。
model = VGG16(weights='imagenet')
'''
让我们将此图像转换为VGG16模型可以读取的内容:该模型是在224x244大小的图像上训练的,根据实用程序keras.applications.vgg16.preprocess输入中打包的一些规则进行预处理。因此,我们需要加载图像,将其大小调整为224x224,将其转换为numpy float32张量,并应用这些预处理规则。
'''
#目标图像的本地路径
img_path = '/Users/fchollet/Downloads/creative_commons_elephant.jpg'
#` img`是224x224大小的PIL图像
img = image.load_img(img_path, target_size=(224, 224))
#` x`是一个float32 numpy形状数组(224、224、3)
x = image.img_to_array(img)
#我们添加了一个维度来将数组转换为“批处理”
# 大小 (1, 224, 224, 3)
x = np.expand_dims(x, axis=0)
preds = model.predict(x)
print('Predicted:', decode_predictions(preds, top=3)[0])
np.argmax(preds[0])
#这是预测向量中的“非洲象”条目
african_elephant_output = model.output[:, 386]
#是“block5_conv3”层的输出功能图,
#VGG16中的最后一个卷积层
last_conv_layer = model.get_layer('block5_conv3')
#这是关于“非洲象”阶级
#'block5_conv3的输出特征图`
grads = K.gradients(african_elephant_output, last_conv_layer.output)[0]
#这是一个形状向量(512,),其中每个条目
#是特定功能图通道上渐变的平均强度
pooled_grads = K.mean(grads, axis=(0, 1, 2))
#此函数允许我们访问刚刚定义的数量值:
#`“block5-conv3”的集合“梯度”和输出特征图,
#给出一个样本图像
iterate = K.function([model.input], [pooled_grads, last_conv_layer.output[0]])
#这是这两个量的值,作为numpy数组,
#以两头大象为例
pooled_grads_value, conv_layer_output_value = iterate([x])
#我们将特征映射数组中的每个通道相乘
#“这条通道对大象阶级有多重要”
for i in range(512):
    conv_layer_output_value[:, :, i] *= pooled_grads_value[i]
# 结果特征图的信道平均值
#是我们的热启动
heatmap = np.mean(conv_layer_output_value, axis=-1)
#最后我们对批进行预处理
#(这将进行通道颜色规范化)
x = preprocess_input(x)
heatmap = np.maximum(heatmap, 0)
heatmap /= np.max(heatmap)
plt.matshow(heatmap)
plt.show()

在这里插入图片描述
下载的有点慢,实在不行就找梯子!
python学习之卷积神经网络的可视化_第1张图片

#我们使用cv2加载原始图像
img = cv2.imread(img_path)
#我们将heatmap的大小调整为与原始图像相同的大小
heatmap = cv2.resize(heatmap, (img.shape[1], img.shape[0]))
#我们把热图转换成RGB。
heatmap = np.uint8(255 * heatmap)
#我们将热图应用于原始图像
heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET)
#0.4这里是一个热图强度因子
superimposed_img = heatmap * 0.4 + img
#将图像保存到磁盘
cv2.imwrite('G:/2018and2019two/qianrushi/elephant_cam.jpg', superimposed_img)
#展示图片
cv2.imshow('im',superimposed_img)

你可能感兴趣的:(wuluo,python3)