从CNN(卷积神经网络),又名CAM获取热图

一、说明

卷积神经网络(CNN)令人难以置信。如果你想知道它如何看待世界(图像),有一种方法是可视化它。
这个想法是,我们从最后的密集层中得到权重,然后乘以最终的CNN层。这需要全局平均池化(GAP)才能发挥作用。

二、选择型号

在本教程中,我们将 Keras 与 Tensorflow 和 ResNet50 结合使用。

因为 ResNet50 有一个全局平均池化 (GAP) 层(稍后会解释),所以它适合我们的演示。这很完美。
测试图像

三、热图如何工作

来自CNN的热图,又名类激活映射(CAM)。这个想法是我们收集卷积层的每个输出(作为图像),并将其组合在一个镜头中。(我们稍后会逐步展示代码)
卷积层输出

因此,以下是全局平均池化 (GAP) 或全局最大池化的工作方式(取决于您使用哪个,但它们是相同的想法)。

在一些特征提取后的模型中,我们使用与神经网络的扁平层(完全连接)来预测结果。但这一步就像丢弃图像维度和一些信息。

相比之下,使用全局平均池 (GAP) 或全局最大池 (GMP) 在这里起作用。它保留图像维度信息,并使神经网络决定哪个CNN通道(特征图像)对于预测结果更为关键。

四、示例和代码

让我们从Keras中的ResNet50开始。

ax 复制代码
from tensorflow.keras.applications import ResNet50
res_model = ResNet50()
res_model.summary() 

ResNet-50 摘要

如您所见(上图):

  • 红色:我们将使用此层作为"转移倾斜"。
  • 绿色:全球平均池化(GAP)。这项工作至关重要。

并导入库和图像供以后使用。

ax 复制代码
import cv2
import matplotlib.pyplot as plt
from scipy.ndimage import zoom
from tensorflow.keras.applications.resnet50 import preprocess_input, decode_predictions
img = cv2.imread('./test_cat.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
X = np.expand_dims(img, axis=0).astype(np.float32)
X = preprocess_input(X)

我们使用"from scipy.ndimage import zoom"。为了调整由于CNN而调整热图的大小,特征提取图像的形状小于原始图像。

4.1 迁移学习

现在提取我们将使用的图层。
P.S:你可以从头开始训练你的模型,但需要很长时间,特征提取可能也需要大量的调优。

ax 复制代码
from tensorflow.keras.models import Model
conv_output = res_model.get_layer("conv5_block3_out").output
pred_ouptut = res_model.get_layer("predictions").output
model = Model(res_model.input, outputs=[conv_ouptut, pred_layer])

这里我们有两个输出(如上所述,图中的红色部分)。

  • 首先是卷积网络输出
  • 二是预测结果

并做预测

ax 复制代码
conv, pred = model.predict(X)
decode_predictions(pred)

结果如下所示。还不错

ax 复制代码
[[('n02123159', 'tiger_cat', 0.7185241),
  ('n02123045', 'tabby', 0.1784818),
  ('n02124075', 'Egyptian_cat', 0.034279127),
  ('n03958227', 'plastic_bag', 0.006443105),
  ('n03793489', 'mouse', 0.004671723)]]

4.2 输出

现在,让我们看看一些CNN输出。

ax 复制代码
scale = 224 / 7
plt.figure(figsize=(16, 16))
for i in range(36):
    plt.subplot(6, 6, i + 1)
    plt.imshow(img)
    plt.imshow(zoom(conv[0, :,:,i], zoom=(scale, scale)), cmap='jet', alpha=0.3)

CNN 输出

我们首先显示地面图像(plt.imshow(img) ),因此我们可以将其与地面图像进行比较。
(如果你不这样做,会得到这样的结果)
图无背景图像

4.3 输出的一次性组合

这是关键的。我们使用预测结果指数(目标)来获取权重。并乘以每个特征图与权重(点积)

ax 复制代码
target = np.argmax(pred, axis=1).squeeze()
w, b = model.get_layer("predictions").weights
weights = w[:, target].numpy()
heatmap = conv.squeeze() @ weights

然后显示带有地面图像的热图。

ax 复制代码
scale = 224 / 7
plt.figure(figsize=(12, 12))
plt.imshow(img)
plt.imshow(zoom(heatmap, zoom=(scale, scale)), cmap='jet', alpha=0.5)

CNN的热图

这就是我们想要的结果。

五、参考资源

海沌

相关推荐
神策数据1 分钟前
打造 AI Growth Team: 以 Data + AI 重塑品牌零售增长范式
人工智能·零售
2501_941333103 分钟前
数字识别与检测_YOLOv3_C3k2改进模型解析
人工智能·yolo·目标跟踪
逐梦苍穹11 分钟前
速通DeepSeek论文mHC:给大模型装上物理阀门的架构革命
人工智能·deepseek·mhc
运维小欣19 分钟前
Agentic AI 与 Agentic Ops 驱动,智能运维迈向新高度
运维·人工智能
Honmaple1 小时前
OpenClaw 迁移指南:如何把 AI 助手搬到新电脑
人工智能
wenzhangli71 小时前
Ooder A2UI 第一性原理出发 深度解析核心逻辑
人工智能·开源
网络安全研究所1 小时前
AI安全提示词注入攻击如何操控你的智能助手?
人工智能·安全
数据猿1 小时前
硬盘价格涨疯了,AI存储何去何从?
人工智能
zhangfeng11331 小时前
氨基酸序列表示法,蛋白质序列表达 计算机中机器学习 大语言模型中的表达,为什么没有糖蛋白或者其他基团磷酸化甲基化乙酰化泛素化
人工智能·机器学习·语言模型
陈天伟教授2 小时前
人工智能应用- 语言理解:06.大语言模型
人工智能·语言模型·自然语言处理