类激活图(CAM, Class Activation Mapping)

文章介绍了类激活图(CAM)在深度学习中的应用,它帮助解释模型如何根据视觉或时间序列特征定位关键决策区域。通过实例展示了其在识别关键模式和优化模型中的价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类激活图(CAM, Class Activation Mapping)是一种可视化技术,主要用于深度学习中的卷积神经网络,以识别和解释图像或时间序列数据中哪些区域对于模型的决策过程最为关键。它特别适用于帮助理解网络如何根据视觉或时间序列特征做出分类决策。

原理简述

在一个典型的卷积神经网络中,最后一个卷积层后通常接一个全局平均池化层(Global Average Pooling, GAP),紧接着是一个 softmax 层进行分类。CAM 的思想基于这样的观察:尽管全局平均池化层简化了数据,但依然保留了空间或时间上的信息。

  1. 全局平均池化的作用
    • 对每个卷积特征图进行平均,提取出全局信息,减少参数数量,防止过拟合。
  2. 类激活映射的生成
    • 在网络的最后一个卷积层中,每个过滤器都可能专注于检测数据中的不同特征。通过这些过滤器的激活和对应类别的权重,我们可以反向推断出对分类结果贡献最大的区域。
    • 使用公式表示,对于类别 ccc,类激活映射 Mc(x)M_c(x)Mc(x) 计算如下:
      Mc(x)=∑kwkcSk(x) M_c(x) = \sum_k w_k^c S_k(x) Mc(x)=kwkcSk(x)
      其中,wkcw_k^cwkc 是从全局平均池化层到 softmax 层对应类别 ccc 的权重,Sk(x)S_k(x)Sk(x) 是最后一个卷积层中第 kkk 个过滤器在位置 xxx 的激活。
  3. 解释与应用
    • CAM 通过这种方式揭示了每个类别的决策依据区域,使得我们能够直观地看到模型在做出分类决策时,哪些位置的特征起了决定性作用。
    • 这不仅有助于理解模型的工作机制,也对模型的进一步优化和错误分析提供了信息。

实际应用与可视化

在实践中,类激活映射可用于识别影响时间序列分类的关键子序列,如在医学信号处理或股市趋势预测中,特定模式的识别对于分类至关重要。通过CAM,我们可以可视化这些关键模式,并据此优化模型结构或数据处理流程,以提高预测准确性。
总之,CAM 提供了一种强大的工具,使研究人员和开发人员能够洞察并优化卷积网络在各种任务中的行为,特别是在复杂的分类问题中,它帮助揭示了决策背后的关键因素。

### 实现CAM图 为了在PyTorch中实现类激活映射(Class Activation Mapping),需要准备并加载预训练模型以及定义辅助函数用于提取特征和计算权重。 #### 加载所需库与配置环境变量 ```python import os import torch from torchvision import models, transforms from PIL import Image import matplotlib.pyplot as plt %matplotlib inline os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE" # Mac OS X fix for PyTorch multiprocessing error[^1] ``` #### 定义数据转换流程 ```python preprocess = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), ]) ``` #### 准备预训练模型 这里以VGG为例展示如何操作,其他模型如ResNet也可以按照相似的方式处理。 ```python model = models.vgg16(pretrained=True).eval() last_conv_layer = model.features[-1] # 获取最后的卷积层 fc_params = list(model.classifier.parameters())[-2:] # 提取全连接层参数 ``` #### 计算类别激活映射 对于原始CAM来说,在最后一层卷积之后应用全局平均池化,并利用这些值作为权重量化不同通道的重要性。下面给出一段简化版代码片段来说明这一过程: ```python def get_cam(feature_map, weight_fc, class_idx): """ :param feature_map: (N,C,H,W) tensor output of last conv layer. :param weight_fc: Weights from the fully connected layer corresponding to each channel. :param class_idx: Index of target category. """ bz, nc, h, w = feature_map.shape cam = weight_fc[class_idx].dot(feature_map.reshape((nc,h*w))) cam = cam.reshape(h,w) cam = cam - torch.min(cam) cam_img = cam / torch.max(cam) return cam_img.detach().numpy() # 假设我们已经得到了某个输入图片对应的feature map `output` 和想要可视化的类别索引 `target_class` cam_output = get_cam(output.squeeze(0), fc_params[0], target_class) plt.imshow(cam_output, cmap='jet') plt.axis('off') plt.show() ``` 上述方法适用于具有标准架构的传统CNNs,其中包含一系列卷积层后面跟着几个完全连通层。然而,随着更复杂网络设计的发展,比如带有跳跃连接或分支路径的设计,可能需要采用改进版本的方法,例如Grad-CAM[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不正经的码狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值