1. 磐创AI-开放猫官方网站首页
  2. Medium

PyTorch中的GradCAM


在本文中,我们将学习如何在PyTorch中绘制GradCam[1]。

要获得GradCam输出,我们需要激活图和这些激活图的梯度。

让我们直接跳到代码中去吧!!

进口商品

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import torch
import torch.nn as nn
from torchvision import models
from skimage.io import imread
from skimage.transform import resize

型号

我们将使用钩子分别从所需的层和张量获得激活图和梯度。在本教程中,我们将从ResNet50的Layer4获取激活图,并使用与其输出张量相关的渐变。

我们向ResNet50模型的层添加了一个前向挂钩。前向挂钩以层的输入和层的输出作为参数。对于输出张量,我们使用register_hook方法注册一个钩子。此方法将后向挂钩注册到张量,并在每次计算相对于张量的梯度时调用。它的输入变元是相对于该输出张量的梯度。

声明一个模型实例

gcmodel = GradCamModel().to(‘cuda:0’)

读取图像

img = imread(‘/content/tiger.jfif’) #'bulbul.jpg'
img = resize(img, (224,224), preserve_range = True)
img = np.expand_dims(img.transpose((2,0,1)),0)
img /= 255.0
mean = np.array([0.485, 0.456, 0.406]).reshape((1,3,1,1))
std = np.array([0.229, 0.224, 0.225]).reshape((1,3,1,1))
img = (img — mean)/std
inpimg = torch.from_numpy(img).to(‘cuda:0’, torch.float32)

计算梯度类激活图

out, acts = gcmodel(inpimg)

现在,需要调整热图的大小并对其进行颜色映射。

调整热图大小

heatmap_j = resize(heatmap_j,(224,224),preserve_range=True)

颜色映射

cmap = mpl.cm.get_cmap(‘jet’,256)
heatmap_j2 = cmap(heatmap_j,alpha = 0.2)

打印

fig, axs = plt.subplots(1,1,figsize = (5,5))
axs.imshow((img*std+mean)[0].transpose(1,2,0))
axs.imshow(heatmap_j2)
plt.show()

结果

Gradcam的其他可视化类型

heatmap_j3 = (heatmap_j > 0.75)

打印

fig, axs = plt.subplots(1,1,figsize = (5,5))
axs.imshow(((img*std+mean)[0].transpose(1,2,0))*heatmap_j3)
plt.show()

结果

去掉钩子

for h in gcmodel.layerhook:
h.remove()
for h in gcmodel.tensorhook:
h.remove()
[1] R. R. Selvaraju, M. Cogswell, A. Das, R. Vedantam, D. Parikh and D. Batra, “Grad-CAM: Visual Explanations from Deep Networks via Gradient-Based Localization,” 2017 IEEE International Conference on Computer Vision (ICCV), 2017, pp. 618–626, doi: 10.1109/ICCV.2017.74.

原创文章,作者:fendouai,如若转载,请注明出处:https://panchuang.net/2021/08/01/pytorch%e4%b8%ad%e7%9a%84gradcam/

联系我们

400-800-8888

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息