AI 大模型之 计算机视觉 模型可解释性 注意力可视化 / 错误归因

AI人工智能阿木 发布于 2025-07-12 12 次阅读


摘要:

随着深度学习在计算机视觉领域的广泛应用,模型的可解释性成为了一个重要的研究方向。本文将围绕注意力可视化和错误归因两个方面,探讨如何提高计算机视觉模型的可解释性,并给出相应的代码实现。

一、

计算机视觉模型在图像分类、目标检测、语义分割等领域取得了显著的成果,但模型的可解释性却一直是一个难题。模型的可解释性指的是模型决策过程的透明度和可理解性,这对于模型的信任度、调试和改进具有重要意义。本文将介绍注意力可视化和错误归因两种技术,并给出相应的代码实现。

二、注意力可视化

1.

注意力可视化是提高模型可解释性的重要手段,它可以帮助我们理解模型在处理图像时关注了哪些区域。本文将介绍两种注意力可视化方法:基于类别的注意力可视化和基于位置的注意力可视化。

2. 基于类别的注意力可视化

代码实现:

python

import torch


import torchvision.transforms as transforms


import torchvision.models as models


import matplotlib.pyplot as plt

加载预训练模型


model = models.resnet18(pretrained=True)


model.eval()

加载图像


image = Image.open("path/to/image.jpg")


transform = transforms.Compose([transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor()])


image = transform(image).unsqueeze(0)

获取模型输出


with torch.no_grad():


output = model(image)

获取注意力权重


class_weights = output[0].softmax(0)


class_attention = torch.sum(class_weights image, dim=1)

可视化


plt.imshow(class_attention.squeeze().numpy(), cmap="jet")


plt.colorbar()


plt.show()


3. 基于位置的注意力可视化

代码实现:

python

import torch


import torchvision.transforms as transforms


import torchvision.models as models


import matplotlib.pyplot as plt

加载预训练模型


model = models.resnet18(pretrained=True)


model.eval()

加载图像


image = Image.open("path/to/image.jpg")


transform = transforms.Compose([transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor()])


image = transform(image).unsqueeze(0)

获取模型输出


with torch.no_grad():


output = model(image)

获取注意力权重


location_attention = output[0].squeeze()

可视化


plt.imshow(location_attention.squeeze().numpy(), cmap="jet")


plt.colorbar()


plt.show()


三、错误归因

1.

错误归因是分析模型错误决策原因的重要方法,它可以帮助我们理解模型在哪些方面存在缺陷。本文将介绍两种错误归因方法:基于梯度的错误归因和基于激活的误差传播。

2. 基于梯度的错误归因

代码实现:

python

import torch


import torchvision.transforms as transforms


import torchvision.models as models


import matplotlib.pyplot as plt

加载预训练模型


model = models.resnet18(pretrained=True)


model.eval()

加载图像


image = Image.open("path/to/image.jpg")


transform = transforms.Compose([transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor()])


image = transform(image).unsqueeze(0)

加载标签


label = torch.tensor([1]).unsqueeze(0)

获取模型输出


with torch.no_grad():


output = model(image)

计算损失


loss = torch.nn.CrossEntropyLoss()(output, label)

计算梯度


grad = torch.autograd.grad(loss, image, create_graph=True)

可视化


plt.imshow(grad[0].squeeze().numpy(), cmap="jet")


plt.colorbar()


plt.show()


3. 基于激活的误差传播

代码实现:

python

import torch


import torchvision.transforms as transforms


import torchvision.models as models


import matplotlib.pyplot as plt

加载预训练模型


model = models.resnet18(pretrained=True)


model.eval()

加载图像


image = Image.open("path/to/image.jpg")


transform = transforms.Compose([transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor()])


image = transform(image).unsqueeze(0)

加载标签


label = torch.tensor([1]).unsqueeze(0)

获取模型输出


with torch.no_grad():


output = model(image)

计算损失


loss = torch.nn.CrossEntropyLoss()(output, label)

计算误差传播


error_propagation = torch.zeros_like(image)


for i in range(3):


for j in range(3):


error_propagation[:, i, :, :] += output[:, j].unsqueeze(1) (output[:, j].unsqueeze(1) - output[:, label].unsqueeze(1)).unsqueeze(2).unsqueeze(3)

可视化


plt.imshow(error_propagation.squeeze().numpy(), cmap="jet")


plt.colorbar()


plt.show()


四、总结

本文介绍了注意力可视化和错误归因两种技术,并给出了相应的代码实现。通过这些技术,我们可以更好地理解计算机视觉模型在处理图像时的决策过程,从而提高模型的可解释性。在实际应用中,我们可以根据具体需求选择合适的方法,以提高模型的性能和可靠性。

注意:以上代码仅供参考,实际应用中可能需要根据具体情况进行调整。