可视化学习笔记11-pytorch-GradCAM可视化自己的网络

对视觉类论文详解(免费)感兴趣的同学,可以关注微信公众号 李卓璐随手记,将会不定期发布,注意查收哦~

可视化笔记2-pytorch 可视化卷积网络中间特征层的基础上使用CAM方法可视化网络对待测对象关注的位置。

1.定义GradCAM类

注意:代码中需要改的3个地方已经用注释标清,大家使用时注意修改。

class GradCAM(nn.Module):
    def __init__(self):
        super(GradCAM, self).__init__()
        # 获取模型的特征提取层
        self.feature = nn.Sequential(OrderedDi
  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是基于CNN回归模型的GradCam可视化PyTorch代码,带有详细的注释。 ```python import torch import torch.nn.functional as F from torchvision import models class GradCam: def __init__(self, model, target_layer): self.model = model self.target_layer = target_layer self.feature_maps = None self.gradient = None self.model.eval() # 设置模型为评估模式 def forward(self, x): """ 前向传播,获取目标层的特征图 """ for name, module in self.model.named_children(): x = module(x) if name == self.target_layer: self.feature_maps = x # 保存目标层的特征图 break def backward(self, index): """ 反向传播,计算目标层的梯度 """ one_hot = torch.zeros_like(self.model.output) # 创建一个形状和模型输出一样的全0张量 one_hot[0][index] = 1 # 将指定索引处的值设置为1 self.model.zero_grad() # 将模型梯度清零 self.model.output.backward(one_hot, retain_graph=True) # 反向传播,计算梯度 self.gradient = self.target_layer.grad.detach().cpu().numpy()[0] # 保存目标层的梯度 def get_heatmap(self): """ 获取热力图 """ weights = F.adaptive_avg_pool2d(self.gradient, 1) # 对梯度进行自适应平均池化 heatmap = (self.feature_maps * weights).sum(dim=1, keepdim=True) # 计算特征图和权重的加权和 heatmap = F.relu(heatmap) # 对热力图进行ReLU激活 heatmap /= torch.max(heatmap) # 归一化 return heatmap.squeeze() # 去除维度为1的维度,返回热力图 if __name__ == '__main__': # 定义一个简单的回归模型 class RegressionModel(torch.nn.Module): def __init__(self): super(RegressionModel, self).__init__() self.conv1 = torch.nn.Conv2d(3, 16, kernel_size=3, padding=1) self.conv2 = torch.nn.Conv2d(16, 32, kernel_size=3, padding=1) self.fc1 = torch.nn.Linear(32 * 8 * 8, 512) self.fc2 = torch.nn.Linear(512, 1) def forward(self, x): x = F.relu(self.conv1(x)) x = F.max_pool2d(x, 2) x = F.relu(self.conv2(x)) x = F.max_pool2d(x, 2) x = x.view(-1, 32 * 8 * 8) x = F.relu(self.fc1(x)) x = self.fc2(x) return x # 加载预训练的模型 model = RegressionModel() # 设置目标层 target_layer = 'conv2' # 创建GradCam实例 grad_cam = GradCam(model, target_layer) # 获取一张测试图片 img = torch.rand(1, 3, 32, 32) # 前向传播 grad_cam.forward(img) # 反向传播 grad_cam.backward(index=0) # 假设回归结果为0 # 获取热力图 heatmap = grad_cam.get_heatmap() ``` 注释中已经说明了每一步的作用,这里简单介绍一下GradCam的实现流程: 1. 前向传播,获取目标层的特征图。 2. 反向传播,计算目标层的梯度。 3. 对梯度进行自适应平均池化,得到特征图上每个通道的权重。 4. 计算特征图和权重的加权和,得到热力图。 5. 对热力图进行ReLU激活和归一化处理,得到最终的热力图。 希望能帮到你,有问题可以继续提问哦!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值