当前提供解释方法及给解释方法进行评估的度量Python API,已提供的解释方法可以通过mindspore_xai.explanation包获取,度量方法可以通过mindspore_xai.benchmark包获取。我们需要准备好待解释的黑盒模型和数据,在脚本中根据需要实例化解释方法及度量方法,调用API用于收集解释结果和解释度量结果。
MindSpore XAI还提供mindspore_xai.runner.ImageClassificationRunner运行模块,支持自动化运行所有解释方法和度量方法。用户将实例化的解释方法及度量方法进行注册,即可自动运行解释方法及度量方法,并生成及保存包含解释结果及解释度量结果的解释日志。
下面以ResNet50及带有20类多标签数据为例,用户初始化explanation中解释方法及benchmark中度量方法,调用ImageClassificationRunner进行解释和度量。
其样例代码如下:
# 必须先把当前目录切换到 xai/examples/
import mindspore.nn as nn
from mindspore import context
from mindspore import load_checkpoint, load_param_into_net
from mindspore_xai.explanation import GradCAM, GuidedBackprop
from mindspore_xai.benchmark import Faithfulness
from mindspore_xai.runner import ImageClassificationRunner
from common.resnet import resnet50
from common.dataset import classes, load_dataset
context.set_context(mode=context.PYNATIVE_MODE)
num_classes = 20
net = resnet50(num_classes)
param_dict = load_checkpoint("xai_examples_data/ckpt/resnet50.ckpt")
load_param_into_net(net, param_dict)
# 构造解释器及加载黑盒模型
gradcam = GradCAM(net, layer='layer4')
guidedbackprop = GuidedBackprop(net)
# 构造度量方法去为解释器评分
# 需要用激活函数去构造 Faithfulness 度量方法, Faithfulness 会使用激活函数把模型输出的 logit 转换为分类慨率
activation_fn = nn.Sigmoid() # for multi-label classification
faithfulness = Faithfulness(num_labels=num_classes, metric='InsertionAUC', activation_fn=activation_fn)
# 构造要解释的数据集对象, 如果要使用 Localization 评分, 数据集需要提供界框资讯
# 数据集要提供以下其中一种的资讯列组合: [图], [图, 标签] 或 [图, 标签, 界框] (资讯列的先后次序必须跟从)
# 请参阅 'mindspore.dataset.project' 的API文档了解如何管理资讯列
test_dataset = load_dataset('xai_examples_data/test')
data = (test_dataset, classes)
explainers = [gradcam, guidedbackprop]
benchmarkers = [faithfulness]
# 构造 runner 时要指定 summary_dir 文件夹路径
runner = ImageClassificationRunner(summary_dir='./summary_dir', network=net, activation_fn=activation_fn, data=data)
runner.register_saliency(explainers, benchmarkers)
# 调用 runner.run() 会产生解释及评分结果并会保存到 summary_dir 文件夹
runner.run()
使用限制
当前只支持图片分类下的CNN网络模型,比如:Lenet、Resnet、Alexnet。
输入的图片数据必须为单通道、三通道或四通道格式。
仅支持GPU和Ascend设备下的PyNative运行模式。
不同的 ImageClassificationRunner 对象需要使用不同的解释方法及度量方法对象,所以用户必须针对每个 ImageClassificationRunner 对象实例化独占的解释方法及度量方法对象,否则可能会产生错误。下方是一个正确的实例化示例。
代码如下:
gradcam = GradCAM(net, layer='layer4')
guidedbackprop = GuidedBackprop(net)
runner = ImageClassificationRunner(summary_dir='./summary_dir_1', network=net, activation_fn=activation_fn, data=data)
runner.register_saliency(explainers=[gradcam, guidedbackprop])
runner.run()
# 只使用 GradCAM 构造另一個 runner
runner2 = ImageClassificationRunner(summary_dir='./summary_dir_2', network=net, activation_fn=activation_fn, data=data)
# 在另一个 runner 中重用解释器对象可能会引致异常或错误, 例如:
# runner2.register_saliency(explainers=[gradcam])
# 使用新构造的 GradCAM 对象是正确的做法
gradcam2 = GradCAM(net, layer='layer4')
runner2.register_saliency(explainers=[gradcam2])
runner2.run()
启动 MindInsight
启动MindInsight系统,在顶部选择进入“模型解释”模块。可以看到所有的解释日志路径,当日志满足条件时,操作列会有“显著图可视化”的功能入口。
如下图:
页面及功能介绍
显著图可视化
显著图可视化用于展示对模型决策结果影响最为显著的图片区域,通常高亮部分可视为图片被标记为目标分类的关键特征。
进入显著图可视化界面,会展示:
用户通过Dataset的Python API接口设置的目标数据集。
真实标签、预测标签,以及模型对对应标签的预测概率。根据具体情况,系统会在对应标签的左上角增加TP,FN,FP(含义见界面提示信息)的旗标。
选中的解释方法给出的显著图
界面操作:
通过界面上方的解释方法勾选需要的解释方法。
通过切换界面右上方的“叠加于原图”按钮可以选择让显著图叠加于原图上显示。
点击不同标签,显示模型对不同标签的显著图分析结果。对于不同的分类结果,通常模型的关注点也是不同的
点选预测类型复选框,以显示具有已选类型的标签的图片:TP - 真阳性、 FN - 假阴性、 FP - 假阳性。
通过界面上方的标签筛选功能,筛选出指定标签图片。
通过界面右上角的图片排序改变图片显示的顺序,可选“概率值降序”或“不确定性值降序”。
点击解释方法最右边的“查看评分”,可以进入评估所有解释方法的界面。
点击图片可查看放大图。