CAM图pytorch
时间: 2025-04-29 17:24:12 浏览: 9
### 实现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]。
阅读全文
相关推荐


















