注意
转到底部 下载完整的示例代码。
使用 Captum 进行模型可解释性分析#
创建时间:2020 年 4 月 14 日 | 最后更新:2023 年 9 月 26 日 | 最后验证:未经验证
Captum 帮助您理解数据特征如何影响您的模型预测或神经元激活,从而阐明您的模型如何运行。
使用 Captum,您可以统一应用各种最先进的特征归因算法,例如 Guided GradCam
和 Integrated Gradients
。
在本教程中,您将学习如何使用 Captum 来
将图像分类器的预测归因于其对应的图像特征。
可视化归因结果。
开始之前#
请确保您的活动 Python 环境已安装 Captum。Captum 既可以在 GitHub 上找到,也可以作为 pip
包或 conda
包使用。有关详细说明,请参阅 https://captum.ai/ 的安装指南。
对于模型,我们使用了 PyTorch 内置的图像分类器。Captum 可以揭示样本图像的哪些部分支持模型做出的特定预测。
import torchvision
from torchvision import models, transforms
from PIL import Image
import requests
from io import BytesIO
model = torchvision.models.resnet18(weights=models.ResNet18_Weights.IMAGENET1K_V1).eval()
response = requests.get("https://image.freepik.com/free-photo/two-beautiful-puppies-cat-dog_58409-6024.jpg")
img = Image.open(BytesIO(response.content))
center_crop = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
])
normalize = transforms.Compose([
transforms.ToTensor(), # converts the image to a tensor with values between 0 and 1
transforms.Normalize( # normalize to follow 0-centered imagenet pixel RGB distribution
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]
)
])
input_img = normalize(center_crop(img)).unsqueeze(0)
计算归因#
模型的前三大预测类别是 208 和 283,分别对应狗和猫。
让我们使用 Captum 的 Occlusion
算法,将每个预测归因于输入中的相应部分。
from captum.attr import Occlusion
occlusion = Occlusion(model)
strides = (3, 9, 9) # smaller = more fine-grained attribution but slower
target=208, # Labrador index in ImageNet
sliding_window_shapes=(3,45, 45) # choose size enough to change object appearance
baselines = 0 # values to occlude the image with. 0 corresponds to gray
attribution_dog = occlusion.attribute(input_img,
strides = strides,
target=target,
sliding_window_shapes=sliding_window_shapes,
baselines=baselines)
target=283, # Persian cat index in ImageNet
attribution_cat = occlusion.attribute(input_img,
strides = strides,
target=target,
sliding_window_shapes=sliding_window_shapes,
baselines=0)
除了 Occlusion
,Captum 还提供了许多算法,例如 Integrated Gradients
、Deconvolution
、GuidedBackprop
、Guided GradCam
、DeepLift
和 GradientShap
。所有这些算法都是 Attribution
的子类,它期望您的模型在初始化时是一个可调用的 forward_func
,并且有一个 attribute(...)
方法,该方法以统一的格式返回归因结果。
让我们可视化在图像情况下计算出的归因结果。
可视化结果#
Captum 的 visualization
工具提供了开箱即用的方法来可视化图像和文本输入的归因结果。
import numpy as np
from captum.attr import visualization as viz
# Convert the compute attribution tensor into an image-like numpy array
attribution_dog = np.transpose(attribution_dog.squeeze().cpu().detach().numpy(), (1,2,0))
vis_types = ["heat_map", "original_image"]
vis_signs = ["all", "all"] # "positive", "negative", or "all" to show both
# positive attribution indicates that the presence of the area increases the prediction score
# negative attribution indicates distractor areas whose absence increases the score
_ = viz.visualize_image_attr_multiple(attribution_dog,
np.array(center_crop(img)),
vis_types,
vis_signs,
["attribution for dog", "image"],
show_colorbar = True
)
attribution_cat = np.transpose(attribution_cat.squeeze().cpu().detach().numpy(), (1,2,0))
_ = viz.visualize_image_attr_multiple(attribution_cat,
np.array(center_crop(img)),
["heat_map", "original_image"],
["all", "all"], # positive/negative attribution or all
["attribution for cat", "image"],
show_colorbar = True
)
如果您的数据是文本,visualization.visualize_text()
提供了一个专用视图来探索文本输入的归因。更多信息请访问 http://captum.ai/tutorials/IMDB_TorchText_Interpret
最后说明#
Captum 可以处理 PyTorch 中大多数模型类型,涵盖包括视觉、文本等多种模态。使用 Captum,您可以:* 将特定输出归因于模型输入(如上所示)。* 将特定输出归因于隐藏层神经元(请参阅 Captum API 参考)。* 将隐藏层神经元响应归因于模型输入(请参阅 Captum API 参考)。
有关支持方法的完整 API 和教程列表,请访问我们的网站 http://captum.ai
Gilbert Tanner 的另一篇有用博文:https://gilberttanner.com/blog/interpreting-pytorch-models-with-captum