《Python 深度学习》刷书笔记 Chapter 5 Part-5 卷积神经网络的可视化 (非洲象热力图)


可视化类激活的热力图


对于卷积神经网络,还存在着另外一种可视化的方法,有助于我们了解一张图片的那一部分让卷积神经网络做出了最终的决策,这种通用的技术被称为类激活图(CAM),其特点如下:

  • 输出与特定类别相关的二维分数网格
  • 对于输入图像的每一个位置都需要计算
  • 表示每个位置对该类别的重要程度
  • 表现了输入图像对不同通道的激活强度

5-40 加载带有预训练权重的VGG16网络


# 注意,这个网络中包含了密集连接分类器,但是在前面的例子我们都丢弃了这个分类器
# 下面的引入网络也和原来的版本有所变化,才能正确执行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')

5-41 为VGG16模型预处理一张输入图像


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

5-42 应用Grad-CAM算法


# 要加上这两句,注意此处与原书不同,仅供参考
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)

5-43 热力图后处理


heatmap = np.maximum(heatmap, 0)
heatmap /= np.max(heatmap)

plt.matshow(heatmap)
<matplotlib.image.AxesImage at 0x1863bed2ac8>

1

5-44 将热力图与原始图像叠加


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

经过最后处理的非洲象热力图

heat


总结

观察上图,不难发现,小象的耳朵部分的激活强度相当大,呈现亮红色,这很可能是由于神经网络找到的印度象和非洲象的不同之处


写在最后

注:本文代码来自《Python 深度学习》,做成电子笔记的方式上传,仅供学习参考,作者均已运行成功,如有遗漏请练习本文作者

各位看官,都看到这里了,麻烦动动手指头给博主来个点赞8,您的支持作者最大的创作动力哟!
<(^-^)>
才疏学浅,若有纰漏,恳请斧正
本文章仅用于各位同志作为学习交流之用,不作任何商业用途,若涉及版权问题请速与作者联系,望悉知

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值