SHAP--Explain ResNet50 using the Partition explainer

SHAP--Explain ResNet50 using the Partition explainer_第1张图片

SHAP:Shapley additive explanations.一种博弈论方法,用于解释任何机器学习模型的输出。

官方解释文档:Welcome to the SHAP documentation — SHAP latest documentation

下面笔者将实例进行简单的运用讲解:

实例:用ResNet50网络对Imagenet50数据集进行分类

#导入必要库
import json
import numpy as np
import tensorflow as tf
from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input
import shap

# 加载预训练模型和数据集
model = ResNet50(weights='imagenet')
X, y = shap.datasets.imagenet50()

# 获取 ImageNet 1000 class names
url = "https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json"
with open(shap.datasets.cache(url)) as file:
    class_names = [v[1] for v in json.load(file).values()]

#python function:获取模型输出;此处可替换为自己的模型.
def f(x):
    tmp = x.copy()
    preprocess_input(tmp)
    return model(tmp)

接下来要创建一个masker,用以覆盖在图像上,以显示重要区域。 

官方释义:shap.maskers.Image — SHAP latest documentation

#创建一个masker覆盖图像
masker = shap.maskers.Image("inpaint_telea", X[0].shape)

# 创建解释器
explainer = shap.Explainer(f, masker, output_names=class_names)

# 举例解释两张图片的分类情况,用SHAP value
#outputs=shap.Explanation.argsort.flip[:4]:依次输出概率最大的四个可能的类别
shap_values = explainer(X[1:3], max_evals=100, batch_size=50, outputs=shap.Explanation.argsort.flip[:4])

# 输出
shap.image_plot(shap_values)

 运行结果为:

SHAP--Explain ResNet50 using the Partition explainer_第2张图片

第一张图,鸟被判别为了美洲白鹭(American Egret)。原因是脖子处弯曲的形状,这一特征对于其分类结果起着重要的作用,就如图中该处鲜艳的红色一般。

第二张图,船被判别为了快艇(speedboat)。原因是船的形状,同上,这一特征对于其分类结果起着重要的作用,就如图中该处鲜艳的红色一般。

下面,将max_evals调到500,首先时间由17s变为25s,运行时间变长。

shap_values = explainer(X[1:3], max_evals=500, batch_size=50, outputs=shap.Explanation.argsort.flip[:4])

 得到结果如下:

SHAP--Explain ResNet50 using the Partition explainer_第3张图片 可以直观看出方形块变小,更为细致显示了各处特征对于最终分类结果的贡献度。

你可能感兴趣的:(SHAP,python,深度学习,tensorflow,pytorch,经验分享)