导入
真实标签一致性——特征匹配
学习使用Top-k特征一致性指标来评估解释结果与真实情况的一致性。
FA_{k}(S, S_g) = \frac{ \vert \text{topK}(S, k) \cap \text{topK}(S_g, k) \vert }{k}
1import torch 2import torchvision 3import torchvision.transforms as T 4from torchvision.models import mobilenet_v2 5from PIL import Image 6import json 7import matplotlib.pyplot as plt 8import numpy as np 9from utils import * 10 11k = 100 12 13def get_feature_agreement(attrA, attrB, k): 14 attrA = attrA.detach().numpy().reshape(-1) 15 attrB = attrB.detach().numpy().reshape(-1) 16 17 topk_idA = np.argsort(-np.abs(attrA))[0:k] 18 topk_idB = np.argsort(-np.abs(attrB))[0:k] 19 20 topk_setsA = set(topk_idA) 21 topk_setsB = set(topk_idB) 22 23 # 检查:相同 ID 的比例 24 metric_distr = len(topk_setsA.intersection(topk_setsB)) / k 25 return metric_distr 26 27image = Image.open("dog.jpg").resize((224, 224)) # 原始图像 28transform = T.Compose([ 29 T.Resize((224, 224)), 30 T.ToTensor(), 31 T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), 32]) 33 34image = transform(image) # 变换并归一化 35 36model = mobilenet_v2() # 加载 MobileNetV2 模型 37ckpt = torch.load("./mobilenet_v2-b0353104.pth", map_location="cpu") 38model.load_state_dict(ckpt) 39model.eval() 40 41integrated_grad = get_integrated_gradients(model, image, num_steps=20) 42smooth_grad = get_smooth_gradients(model, image, num_samples=20, alpha=0.01) 43vanilla_grad = get_vanilla_gradients(model, image) 44 45fa_ig_sg = get_feature_agreement(smooth_grad, integrated_grad, k=k) 46print("Top-{} 特征一致性(IG 与 SG 之间)为:".format(k), fa_ig_sg) 47 48fa_ig_vg = get_feature_agreement(vanilla_grad, integrated_grad, k=k) 49print("Top-{} 特征一致性(IG 与 VG 之间)为:".format(k), fa_ig_vg)