赞
踩
Grad-CAM(梯度加权类激活映射)是深度学习中用于可视化和理解 CNN 做出的决策的一种技术。这项突破性的技术揭示了 CNN 做出的隐藏决定,将它们从不透明的模型转变为透明的讲故事者。把它想象成一个神奇的镜头,描绘出生动的热图,突出图像的本质,吸引神经网络的注意力。它是如何工作的?Grad-CAM 通过分析最后一个卷积层中的梯度来解码每个特征图对特定类别的重要性。
Grad-CAM 解释 CNN,揭示对预测的见解,帮助调试并提高性能。类区分和定位,它缺乏像素空间细节高亮。
Grad-CAM 代表梯度加权类激活映射。这是一种用于深度学习的技术,特别是卷积神经网络 (CNN),用于了解输入图像的哪些区域对于网络对特定类别的预测很重要。Grad-CAM 是一种技术,它保留了深度模型的架构,同时在不影响准确性的情况下提供可解释性。Grad-CAM 被强调为一种类判别定位技术,它为基于 CNN 的网络生成视觉解释,而无需更改架构或重新训练。本文将 Grad-CAM 与其他可视化方法进行了比较,强调了类判别和高分辨率在生成视觉解释中的重要性。
Grad-CAM 生成一个热图,通过分析流入 CNN 最后一个卷积层的梯度来突出显示图像的关键区域。通过计算预测的类分数与最后一个卷积层的特征图的梯度,Grad-CAM 确定每个特征图对特定类的重要性。
Grad-CAM 之所以受欢迎,是因为它满足了深度学习模型中对可解释性的关键需求,提供了一种可视化和理解这些模型如何得出预测的方法,而不会牺牲它们在各种计算机视觉任务中提供的准确性。
- +---------------------------------------+
- | |
- | Convolutional Neural Network |
- | |
- +---------------------------------------+
- |
- | +-------------+
- | | |
- +->| Prediction |
- | |
- +-------------+
- |
- |
- +-------------+
- | |
- | Grad-CAM |
- | |
- +-------------+
- |
- |
- +-----------------+
- | |
- | Class Activation|
- | Map |
- | |
- +-----------------+
Grad-CAM(梯度加权类激活映射)是一种用于计算机视觉领域的技术,特别是在基于卷积神经网络 (CNN) 的深度学习模型中。它通过突出显示输入图像中有助于网络预测的重要区域来解决这些复杂模型中可解释性的挑战。
Grad-CAM 生成称为类激活图的热图。这些地图突出显示了负责 CNN 做出特定预测的图像中的关键区域。
它通过分析流入 CNN 最终卷积层的梯度来做到这一点,重点关注这些梯度如何影响类预测。
Grad-CAM 因其类判别性质而在可视化技术中脱颖而出。与其他方法不同,它提供了特定于特定预测类的可视化效果,从而增强了可解释性。
Grad-CAM 计算与最后一个卷积层中的激活有关的预测类分数的梯度。这些梯度表示每个激活图对于预测特定类别的重要性。
它可以精确识别并突出显示输入图像中对特定类别的预测有重要贡献的区域,从而能够更深入地理解模型决策。
Grad-CAM 的适应性跨越各种 CNN 架构,无需更改架构或重新训练。它适用于处理不同输入和输出的模型,确保在不同任务中具有广泛的可用性。
Grad-CAM 允许在不牺牲其准确性的情况下理解复杂模型的决策过程,在模型可解释性和高性能之间取得平衡。
代码为 Keras 中预训练的 Xception 模型生成 Grad-CAM 热图。但是,代码中缺少一些部分,例如定义模型、加载图像和生成热图。
- from IPython.display import Image, display
- import matplotlib as mpl
- import matplotlib.pyplot as plt
- import numpy as np
- import tensorflow as tf
- import keras
-
- model_builder = keras.applications.xception.Xception
- img_size = (299, 299)
- preprocess_input = keras.applications.xception.preprocess_input
- decode_predictions = keras.applications.xception.decode_predictions
-
- last_conv_layer_name = "block14_sepconv2_act"
-
- ## The local path to our target image
-
- img_path= "<your_image_path>"
-
- display(Image(img_path))
- def get_img_array(img_path, size):
- ## `img` is a PIL image
- img = keras.utils.load_img(img_path, target_size=size)
- array = keras.utils.img_to_array(img)
- ## We add a dimension to transform our array into a "batch"
- array = np.expand_dims(array, axis=0)
- return array
-
-
- def make_gradcam_heatmap(img_array, model, last_conv_layer_name, pred_index=None):
- ## First, we create a model that maps the input image to the activations
- ## of the last conv layer as well as the output predictions
- grad_model = keras.models.Model(
- model.inputs, [model.get_layer(last_conv_layer_name).output, model.output]
- )
-
- ## Then, we compute the gradient of the top predicted class for our input image
- ## for the activations of the last conv layer
- with tf.GradientTape() as tape:
- last_conv_layer_output, preds = grad_model(img_array)
- if pred_index is None:
- pred_index = tf.argmax(preds[0])
- class_channel = preds[:, pred_index]
-
- ## We are doing transfer learning on last layer
- grads = tape.gradient(class_channel, last_conv_layer_output)
-
- ## This is a vector where each entry is the mean intensity of the gradient
- pooled_grads = tf.reduce_mean(grads, axis=(0, 1, 2))
-
- ## calculates a heatmap highlighting the regions of importance in an image
- ## for a specific
- ## predicted class by combining the output of the last convolutional layer
- ## with the pooled gradients.
- last_conv_layer_output = last_conv_layer_output[0]
- heatmap = last_conv_layer_output @ pooled_grads[..., tf.newaxis]
- heatmap = tf.squeeze(heatmap)
-
- ## For visualization purpose
- heatmap = tf.maximum(heatmap, 0) / tf.math.reduce_max(heatmap)
- return heatmap.numpy()
输出:
使用模型为图像创建热图
- ## Preparing the image
- img_array = preprocess_input(get_img_array(img_path, size=img_size))
-
- ## Making the model with imagenet dataset
- model = model_builder(weights="imagenet")
-
- ## Remove last layer's softmax(transfer learning)
- model.layers[-1].activation = None
-
- preds = model.predict(img_array)
- print("Predicted of image:", decode_predictions(preds, top=1)[0])
-
- ## Generate class activation heatmap
- heatmap = make_gradcam_heatmap(img_array, model, last_conv_layer_name)
-
- ## visulization of heatmap
- plt.matshow(heatmap)
- plt.show()
输出:
save_and_display_gradcam 函数采用图像路径和 Grad-CAM 热图。它将热图叠加在原始图像上,保存并显示新的可视化效果。
- def save_and_display_gradcam(img_path, heatmap, cam_path="save_cam_image.jpg", alpha=0.4):
- ## Loading the original image
- img = keras.utils.load_img(img_path)
- img = keras.utils.img_to_array(img)
-
- ## Rescale heatmap to a range 0-255
- heatmap = np.uint8(255 * heatmap)
-
- ## Use jet colormap to colorize heatmap
- jet = mpl.colormaps["jet"]
-
- jet_colors = jet(np.arange(256))[:, :3]
- jet_heatmap = jet_colors[heatmap]
-
- ## Create an image with RGB colorized heatmap
- jet_heatmap = keras.utils.array_to_img(jet_heatmap)
- jet_heatmap = jet_heatmap.resize((img.shape[1], img.shape[0]))
- jet_heatmap = keras.utils.img_to_array(jet_heatmap)
-
- ## Superimpose the heatmap on original image
- Superimposed_img = jet_heatmap * alpha + img
- Superimposed_img = keras.utils.array_to_img(Superimposed_img)
-
- ## Save the superimposed image
- Superimposed_img.save(cam_path)
-
- ## Displaying Grad CAM
- display(Image(cam_path))
-
-
- save_and_display_gradcam(img_path, heatmap)
输出:
Grad-CAM 在计算机视觉和模型可解释性领域有几个应用和用例:
梯度加权类激活映射 (Grad-CAM),旨在增强基于 CNN 的模型的可解释性。Grad-CAM 生成可视化解释,阐明这些模型的决策过程。将 Grad-CAM 与现有的高分辨率可视化方法相结合,创建了 Guided Grad-CAM 可视化,为原始模型提供了卓越的可解释性和保真度。它是一种有价值的工具,通过为深度学习模型的决策提供可视化解释,增强深度学习模型的可解释性,特别是卷积神经网络 (CNN)。尽管有其优势,但 Grad-CAM 也存在一系列挑战和局限性。
人体研究证明了这些可视化的有效性,展示了改进的阶级歧视、提高分类器可信度透明度以及识别数据集中的偏见。此外,该技术还识别了关键的神经元,并为模型决策提供了文本解释,有助于更全面地理解模型行为。Grad-CAM 对梯度的依赖、解释的主观性和计算开销带来了挑战,影响了其在实时应用或高度复杂模型中的可用性。
问题1. 什么是 Grad-CAM?
答:Grad-CAM 是梯度加权类激活映射的缩写,它通过使用热图突出显示关键图像区域来可视化 CNN 决策。
问题2. Grad-CAM 是如何工作的?
答:Grad-CAM 使用最后的 CNN 卷积层激活计算预测类分数的梯度,为重要图像区域生成热图。
问题3. Grad-CAM的意义是什么?
答:Grad-CAM 增强了模型的可解释性,有助于理解 CNN 预测、调试模型、建立信任和揭示偏见。
问题4. Grad-CAM 有限制吗?
答:是的,Grad-CAM 的有效性因网络架构、对序列模型的适用性以及对梯度信息的依赖(主要在图像域内)而异。
问题5. Grad-CAM 可以应用于各种 CNN 架构吗?
答:是的,Grad-CAM 与架构无关,无需结构修改或重新训练即可无缝适用于不同的 CNN 架构。
非常感谢大家的阅读,小Mo在这里祝你在末来的 Python 学习职业生涯中一切顺利!
后续小Mo会不定期更新书籍、视频等学习资源,以上这些书籍资料也可通过关注微信公众号免费获取哦!
欢迎关注我们的微信公众号:MomodelAl
同时,欢迎使用「Mo AI编程」微信小程序
以及登录官网,了解更多信息:Mo 人工智能教育实训平台
Mo,发现意外,创造可能
注:部分资源来源于互联网,若有侵权,请直接联系作者删除。
收藏
评论
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。