DeepExplain

GitHub
758 135 较难 1 次阅读 1周前MIT开发框架其他
AI 解读 由 AI 自动生成,仅供参考

DeepExplain 是一个专为深度神经网络可解释性设计的统一框架,旨在帮助开发者与研究人员深入理解模型内部的决策逻辑。它通过计算“归因图”,量化输入特征(如图像中的像素)对模型输出结果的具体贡献度,从而直观展示哪些因素促成了预测,哪些产生了抑制作用,有效解决了深度学习模型“黑盒”难以诊断误判原因的问题。

该工具集成了多种前沿的归因算法,既包含基于梯度的方法(如显著性图、积分梯度、DeepLIFT),也支持基于扰动的方法(如遮挡测试、Shapley 值采样)。其独特亮点在于将各类算法统一在简洁的接口下,并针对部分梯度方法采用了改进的链式法则实现,提升了理论一致性。DeepExplain 原生支持 TensorFlow 及后端为 TensorFlow 的 Keras,特别适合需要评估模型可靠性、进行算法基准测试或调试复杂网络的研究人员与工程师使用,让模型行为变得更加透明可信。

使用场景

某医疗影像实验室的算法团队正在开发基于深度学习的肺部 CT 结节分类模型,急需向医院专家证明模型是依据病灶特征而非背景噪声做出诊断。

没有 DeepExplain 时

  • 决策过程如“黑盒”:医生质疑模型为何将健康组织误判为结节,开发人员无法直观展示模型具体关注了图像的哪些像素区域。
  • 归因方法分散难用:团队想对比 Saliency Maps、Integrated Gradients 等多种算法效果,但需分别寻找不同源码并适配接口,耗费大量工程时间。
  • 调试效率低下:面对模型误诊案例,只能靠猜测调整网络结构或数据增强策略,缺乏基于特征贡献度的定量分析依据。
  • 框架兼容性差:现有项目基于 TensorFlow 1.x 和 Keras 构建,许多新型解释工具不支持旧版本环境,迁移成本极高。

使用 DeepExplain 后

  • 可视化归因图谱:利用 DeepExplain 生成的热力图(Attribution Maps),清晰标红显示模型聚焦于结节边缘纹理,成功向医生解释判断依据。
  • 统一框架快速对比:通过单一 explain 接口即可一键切换 Occlusion、DeepLIFT 等六种主流算法,迅速验证哪种方法最能反映真实病理特征。
  • 精准定位错误根源:发现模型曾错误关注扫描设备的水印标识,团队据此针对性清洗数据,显著降低了假阳性率。
  • 无缝集成现有流程:直接兼容团队原有的 TensorFlow 1.x 与 Keras 环境,无需重构代码即可嵌入训练后的模型进行即时分析。

DeepExplain 通过统一的归因分析框架,将深度学习模型的“直觉”转化为可解释的视觉证据,极大提升了医疗 AI 的可信度与迭代效率。

运行环境要求

GPU

未说明

内存

未说明

依赖
notes仅支持 Tensorflow V1。对于 Tensorflow V2,有一个开放的拉取请求,但必须禁用 eager execution(即时执行模式)才能工作。安装前需确保已自行安装好 Tensorflow 和 Keras。
python未说明
tensorflow>1.0
keras>2.0 (可选,需使用 Tensorflow 后端)
DeepExplain hero image

快速开始

DeepExplain:深度学习的归因方法 构建状态

DeepExplain 提供了一个统一的框架,用于实现最先进的基于梯度和基于扰动的归因方法。研究人员和从业者可以使用它来更好地理解现有的推荐模型,也可以用来对其他归因方法进行基准测试。

它支持 TensorFlow 以及使用 TensorFlow 作为后端的 Keras目前仅支持 TensorFlow V1。对于 V2,有一个开放的拉取请求,只要禁用急切执行模式即可正常工作。

实现了以下方法:

基于梯度的归因方法

标有 (*) 的方法是按照改进的链式法则实现的,这一点在 Towards better understanding of gradient-based attribution methods for Deep Neural Networks 中有更详细的解释,作者为 Ancona 等人,发表于 ICLR 2018。因此,结果可能与原始实现略有不同。

基于扰动的归因方法

什么是归因?

考虑一个神经网络及其特定的输入(例如,如果该网络用于图像分类,则输入可能是一张图像)。输入是多维的,由多个特征组成。对于图像而言,每个像素都可以被视为一个特征。归因方法的目标是针对感兴趣的某个目标神经元(比如对应正确类别的神经元激活),为每个输入特征确定一个实数值 R(x_i)

当所有输入特征的归因值组合在一起,形成与输入样本相同形状时,我们就称之为 归因图(如下面的图片所示),其中红色和蓝色分别表示对目标输出激活有正向贡献的特征以及对其具有抑制作用的特征。 InceptionV3 上的归因方法比较

这有助于更好地理解网络的行为、哪些特征对输出贡献最大,以及可能导致误分类的原因。

DeepExplain 快速入门

安装

pip install -e git+https://github.com/marcoancona/DeepExplain.git#egg=deepexplain

请注意,DeepExplain 假设您已经安装了 TensorFlow > 1.0 和(可选)Keras > 2.0

使用

TensorFlow 和 Keras 的示例代码可以在仓库的 example 文件夹中找到。DeepExplain 包含一个单一的方法:explain(method_name, target_tensor, input_tensor, samples, ...args)

参数名称 简称 类型 描述
method_name 字符串,必填 要运行的方法名称(参见 应该使用哪种方法?)。
target_tensor T 张量,必填 表示所求归因的模型输出的 TensorFlow 张量对象(参见 要针对哪个张量?)。
input_tensor X 张量,必填 网络的符号化输入。
input_data xs NumPy 数组,必填 将被馈送到 X 并为其计算归因的输入样本批次。请注意,第一个维度必须始终是批次大小。
target_weights ys NumPy 数组,可选 如果 T 有多个输出,则应用于 T 的权重批次。通常在分类问题中需要针对特定的输出单元生成解释时才会用到。在这种情况下,ys 可以提供所需单元的独热编码。
batch_size 整数,可选 默认情况下,DeepExplain 会尝试同时使用 xs 中的所有数据来评估模型。如果 xs 包含大量样本,可能需要将处理分成多个批次。此时,提供一个大于零的 batch_size 将自动把评估拆分为指定大小的块。
...args 各种类型,可选 方法特定的参数(见下文)。

explain 方法必须在 DeepExplain 上下文中调用:

# 伪代码
from deepexplain.tensorflow import DeepExplain

# 选项 1. 在 DeepExplain 上下文中创建并训练您的模型

with DeepExplain(session=...) as de:  # < 进入 DeepExplain 上下文
    model = init_model()  # < 构建模型
    model.fit()           # < 训练模型

    attributions = de.explain(...)  # < 计算归因

# 选项 2. 先创建并训练您的模型,再应用 DeepExplain。
# 重要提示:为了正确工作,待分析的图必须始终在上下文中重新构建!

model = init_model()  # < 构建模型
model.fit()           # < 训练模型

with DeepExplain(session=...) as de:  # < 进入 DeepExplain 上下文
    new_model = init_model()  # < 假设 init_model() 返回一个带有 original model 权重的新模型
    attributions = de.explain(...)  # < 计算归因

初始化上下文时,请务必传递 session 参数:

# 使用 TensorFlow
import tensorflow as tf
# ...构建模型
sess = tf.Session()
# ... 如有必要,使用会话训练您的模型
with DeepExplain(session=sess) as de:
    ...

# 使用 Keras
import keras
from keras import backend as K

model = Sequential()  # 功能 API 也支持
# ... 构建模型并训练

with DeepExplain(session=K.get_session()) as de:
    ...

具体示例请参见 这里

应该使用哪种方法?

DeepExplain 支持多种方法。主要的划分是基于 梯度的方法扰动的方法。前者速度更快,因为它们只需通过网络进行几次前向和反向传播迭代即可估计特征重要性。后者则通过对输入进行扰动,并测量输出相对于原始输入的变化来实现。这种方法需要依次测试每个特征(或一组特征),因此耗时较长,但通常能产生更平滑的结果。

合作博弈论提出 Shapley 值 是一种独特的方式来分配特征的重要性,以满足一些重要的理论性质。遗憾的是,精确计算 Shapley 值的成本极高,因此 DeepExplain 提供了一种基于采样的近似方法。通过调整 samples 参数,可以权衡性能与误差之间的关系。需要注意的是,即使如此,该方法仍然会比本库中的其他方法慢得多。

某些方法允许调整参数。请参见下表。

方法 method_name 可选参数 备注
显著性图 saliency [梯度] 仅输出正向重要性。
梯度乘以输入 grad*input [梯度] 快速。可能受噪声梯度和非线性饱和的影响。
积分梯度 intgrad steps, baseline [梯度] 类似于梯度乘以输入,但在网络中执行 steps 次迭代(默认:100次),将输入从 baseline(默认:零)逐步变化到实际提供的样本。如果提供 baseline,它必须是一个与输入大小相同的 NumPy 数组(但没有批次维度,因为同一个基准值将用于批次中的所有输入)。
epsilon-LRP elrp epsilon [梯度] 计算逐层相关性传播。仅推荐用于具有 ReLU 或 Tanh 非线性激活函数的网络。epsilon 的值必须大于零(默认:0.0001)。
DeepLIFT(缩放) deeplift baseline [梯度] 在大多数情况下,它是积分梯度的一种更快近似方法。不适用于包含乘法单元的网络(如 LSTM 或 GRU)。如果提供 baseline,它必须是一个与输入大小相同、不含批次维度的 NumPy 数组(默认:零)。
遮挡 occlusion window_shape, step [扰动] 对输入数组进行滑动窗口视图处理,将每个窗口替换为零值,从而测量扰动对目标输出的影响。可选参数 window_shapestep 的行为与 skimage 中的用法一致。默认情况下,每个特征独立测试(window_shape=1step=1),但对于大型输入(如 ImageNet 图像)来说,这可能会非常缓慢。当输入具有局部连贯性时(例如图像),建议使用较大的 window_shape 值。在这种情况下,每个窗口内特征的重要性将被汇总。请注意,不同的窗口大小可能会导致结果有显著差异。
Shapley 值采样 shapley_sampling samples, sampling_dims [扰动] 通过对每个输入特征进行 samples 次采样来计算近似的 Shapley 值。需要注意的是,由于该方法会运行网络 samples*n 次,其中 n 是输入特征的数量,因此它可能比其他所有方法都慢得多。参数 sampling_dims(一个整数列表)可用于选择要采样的维度。例如,如果输入是 RGB 图像,sampling_dims=[1,2] 将分别考虑三个颜色通道来采样像素;而 sampling_dims=[1,2,3](默认)则会在通道维度上也进行采样。

应该针对哪个神经元?

一般来说,任何表示隐藏层或输出层神经元激活的张量都可以作为 target_tensor 使用。如果你的网络执行分类任务(即每个可能的类别对应一个输出神经元),你可能希望针对给定样本的 正确类别 所对应的神经元,这样特征重要性图可以帮助你理解该神经元为何会(或不会)被激活。不过,你也可以针对其他类别的激活情况,比如那些经常被误分类的类别,从而深入了解哪些特征会激活该类别。

重要提示:TensorFlow 和 Keras 中的张量通常包含某一层中 所有 神经元的激活值。如果你将这样的张量传递给 explain,你将得到该张量所指代的所有神经元的 总和 特征重要性图。如果你想针对特定神经元,你需要要么切片出你感兴趣的组件,要么将其与只选择目标神经元的二值掩码相乘。

# MNIST 示例(分类任务,10 个输出类别)
X = Placeholder(...)  # 输入张量
T = model(X) # 输出层,形状为 (1, 10) 的二维张量,第一维为批次大小
ys = [[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]]  # 形状为 (1, 10) 的独热编码标签数组

# 我们只需要针对 T 中的 10 个输出单元中的一个
# 方法 1(推荐):使用 ys 参数
de.explain('method_name', T, X, xs, ys=ys)

# 方法 2:手动掩码目标。此方法不适用于批处理。
T *=  ys # < 掩码后的目标张量:只有 logits 的第二个分量会被用于计算重要性
de.explain('method_name', T, X, xs)

Softmax:如果网络的最后一层激活是 Softmax,则建议针对该归一化 之前 的激活值。

性能:Explainer API

如果你需要多次调用 explain()(例如,随着时间推移不断有新数据需要使用同一模型进行处理),建议使用 Explainer API。该 API 提供了一种方式,可以先 编译 生成解释所需的图操作,然后再在两个不同的步骤中 评估 这个图。

在 DeepExplain 上下文中(de),调用 de.get_explainer()。该方法接受与 explain() 相同的参数,但不包括 xsysbatch_size。它返回一个解释器对象(explainer),该对象提供一个 run() 方法。调用 explainer.run(xs, [ys], [batch_size]) 即可生成解释。多次调用 run() 不会导致计算图中新增操作。

# 普通 API:

for i in range(100):
    # 下面这行代码会随着每次迭代向计算图中添加新操作而越来越慢
    attributions = de.explain('saliency', T, X, xs[i], ys=ys[i], batch_size=3)
    
 # 改用 Explainer API:
 
 # 首先创建一个解释器
 explainer = de.get_explainer('saliency', T, X)
 for i in range(100):
    # 然后为一些数据生成解释,而不会降低速度
    attributions = explainer.run(xs[i], ys=ys[i], batch_size=3)  

NLP / 嵌入查找

ValueError("None values not supported.") 的最常见原因是调用 run() 时,tensor_inputtarget_tensor 在反向传播中被断开了连接。这种情况在使用嵌入查找层时很常见,因为查找操作不会传播梯度。为了为 NLP 模型生成归因,DeepExplain 的输入应当是嵌入查找的结果,而不是原始模型输入。然后,通过沿结果归因矩阵的相应维度求和,即可得到每个词的归因值。

TensorFlow 伪代码:

input_x = graph.get_operation_by_name("input_x").outputs[0]
# 获取嵌入张量的引用
embedding = graph.get_operation_by_name("embedding").outputs[0]
pre_softmax = graph.get_operation_by_name("output/scores").outputs[0]

# 在模型输入上评估嵌入张量(即执行查找操作)
embedding_out = sess.run(embedding, {input_x: x_test})
# 使用嵌入作为输入运行 DeepExplain
attributions = de.explain('elrp', pre_softmax * y_test_logits, embedding, embedding_out)

多个输入

基于梯度的方法支持具有多个输入的模型。然而,Occlusion 方法如果应用于具有多个输入的模型,则会抛出异常(因为对于多个输入如何生成扰动实际上并没有明确的定义)。

有关最小化(玩具)示例,请参阅 示例文件夹

贡献

DeepExplain 目前仍在积极开发中。如果您遇到问题,欢迎随时提交 issue。我们非常欢迎对本框架功能进行扩展以及添加对其他方法支持的贡献。

许可证

MIT

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|1周前
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|1周前
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

159.3k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

108.3k|★★☆☆☆|1周前
开发框架图像Agent

gemini-cli

gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。

100.8k|★★☆☆☆|1周前
插件Agent图像

markitdown

MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器

93.4k|★★☆☆☆|1周前
插件开发框架