对于卷积神经网络,还存在着另外一种可视化的方法,有助于我们了解一张图片的那一部分让卷积神经网络做出了最终的决策,这种通用的技术被称为类激活图(CAM),其特点如下:
# 注意,这个网络中包含了密集连接分类器,但是在前面的例子我们都丢弃了这个分类器
# 下面的引入网络也和原来的版本有所变化,才能正确执行4-41
# 运行这段代码的时候是有warning 的,不需要管
from tensorflow.keras.applications import VGG16
from tensorflow.keras import backend as K
import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
tf.compat.v1.disable_eager_execution()
model = VGG16(weights = 'imagenet')
from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input, decode_predictions
import numpy as np
img_path = r'E:\code\PythonDeep\DataSet\creative_commons_elephant.jpg'
img = image.load_img(img_path, target_size = (224, 224))
# 将三维张量改编为float32格式的numpy数组
x = image.img_to_array(img)
# 添加一个维度使其变为4D向量
x = np.expand_dims(x, axis = 0)
# 对数据进行批量处理
x = preprocess_input(x)
# 运行预训练的VGG16网络
preds = model.predict(x)
print('predict:', decode_predictions(preds, top = 3)[0])
# 打印索引编号
np.argmax(preds[0])
predict: [('n02504458', 'African_elephant', 0.9334816), ('n01871265', 'tusker', 0.06098435), ('n02504013', 'Indian_elephant', 0.00540654)]
386
# 要加上这两句,注意此处与原书不同,仅供参考
tf.compat.v1.disable_eager_execution()
# K.clear_session()
# 预测向量中“非洲象”的元素
african_elephant_output = model.output[:, 386]
# 输出最后一个卷积层对应的特征图
last_conv_layer = model.get_layer('block5_conv3')
# 非洲象类别对于block5_conv3的梯度特征图
grads = K.gradients(african_elephant_output, last_conv_layer.output)[0]
# 特征通道的平均梯度大小
pooled_grads = K.mean(grads, axis = (0, 1, 2))
# 访问刚刚定义的量
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)
heatmap = np.maximum(heatmap, 0)
heatmap /= np.max(heatmap)
plt.matshow(heatmap)
import cv2
# 用cv2加载图像
img = cv2.imread(img_path)
# 将热力图的大小调整为与原始图像相同
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(r'E:\code\PythonDeep\DataSet\creative_commons_elephant_heat.jpg', superimposed_img)
True
观察上图,不难发现,小象的耳朵部分的激活强度相当大,呈现亮红色,这很可能是由于神经网络找到的印度象和非洲象的不同之处
注:本文代码来自《Python 深度学习》,做成电子笔记的方式上传,仅供学习参考,作者均已运行成功,如有遗漏请练习本文作者
各位看官,都看到这里了,麻烦动动手指头给博主来个点赞8,您的支持作者最大的创作动力哟!
<(^-^)>
才疏学浅,若有纰漏,恳请斧正
本文章仅用于各位同志作为学习交流之用,不作任何商业用途,若涉及版权问题请速与作者联系,望悉知