笔记:Interpreting CNNs via Decision Trees

原文:https://arxiv.org/pdf/1802.00121v2.pdf
作者:Quanshi Zhang, Yu Yang, Haotian Ma, Ying Nian Wu
收录于CVPR 2019

摘要
以下几层:
文章学习一个决策树,它可以在语义层面上明确CNN每一次预测的具体原因。决策树告诉人们哪些部分激活了预测的过滤器,以及它们对预测分数的贡献有多大。
我们的方法挖掘了CNN的所有潜在决策模式,其中每个模式代表了CNN如何使用对象部分进行预测的常见情况。
决策树以一种从粗到细的方式组织所有潜在的决策模式,以解释CNN在不同细粒度级别上的预测。

引文
常规的解释性介绍,本文围绕两个观点:

  1. 如何在语义层次上解释CNN中间层的特征。
  2. 如何定量分析每一个CNN预测的基本原理。

大概内容两部分:

  1. 给中层特征分配语义。
  2. 计算中层特征对最后预测得分的影响。

决策树构建:
用过滤器来学习表示对象的某部分(无监督)把特定部分的名称分配每给每个过滤器。最后,我们挖掘决策模式来解释CNN如何使用部件/过滤器进行预测,并构造决策树。

相关工作
与决策树相关工作的不同点:
首先,我们关注使用树在语义上解释每一个预训练好的CNN的预测。而上述研究中的决策树主要是为了分类而学习的,无法提供语义层面的解释。其次,我们从梯度上总结出与目标部分神经激活相关的决策模式,作为解释CNN预测的依据。与上述“基于提取”的方法相比,我们的“基于梯度的”决策树更直接、更严格地反映了CNN的预测。

特定图像CNN预测基本原理

滤波损失(filter loss):特征图与原图部分之间的负交互信息。
在这里插入图片描述
理解为,计算这张特征图对原图中某个部分的敏感程度,比如鸟头、鸟翅膀,如果出现了,则在出现的位置出现峰值,否则不激活。

CNN预测的定量原理

写的很多,简化出来就是下面这张图:

在这里插入图片描述
y是softmax层前的分类得分,x代表特特征图上某个部分的位置,g是y对x的导数(梯度),可以用来定量表示这个部分对得分的重要性。
这个部分介绍如何计算图上四个参数,有个细节是,具体计算使用了近似方法求x,g:
在这里插入图片描述

学习决策树

首先定义决策树中的基本概念,然后介绍学习算法。
下图为决策树的学习过程。

在这里插入图片描述
学到的决策树长这样,每个节点表示一个隐藏在CNN FC层中的决策模式:
在这里插入图片描述
结合第一张图的公式和决策树的构造过程,就得到了本文的模型:
在这里插入图片描述

模型的学习过程

在这里插入图片描述
初始化的树Q:所有gi模式下预测的“正向图”为叶子节点。
然后合并两个叶子节点,增加一种判断模式u。
依此类推构造该模式的决策树。

公式化就是:
在这里插入图片描述

解释CNN

如何解释决策树呢。
在推理过程中,我们可以以自顶向下的方式从根节点开始推断解析树。图4中的绿线显示了一个解析树。当我们选择节点u中的决策模式作为基本原理时,我们可以进一步选择其子v,将其与最具体的基本原理gi的兼容性最大化,作为更细粒度的模式。

量化计算不同模式对得分结果的贡献:
在这里插入图片描述实验

在这里插入图片描述
能够很好的将预测结果按照模式归类,从而解释CNN的决策过程。从图像可看出,同一层的图片非常相似。
在这里插入图片描述

实验定量分析不同部分的贡献程度。

评价方法:第一个指标评估图像的部分对CNN预测的贡献的误差,这些误差是用树中第二层中的节点估计的。具体计算就是CNN原来的预测输出-特征图上除去第i个部分的激活信息后的输出。
第二个指标,贡献分布的适配程度,比较特征图间真实的贡献分布和估计的贡献分布。意思就是,评价某个模式分配到某个特征图上是否合适。

除了理论基础的准确性之外,我们还测量了使用决策树来表示CNN信息的损失作为补充的评估。一个度量是分类精度,就是测量决策树的分类结果的准确性。具体是比较树的叶子节点和原CNN的预测结果。

从表格可以看出决策树解释的分类结果和CNN预测的基本一致,说明论文方法解释CNN的效果较好。

总结

在这项研究中,我们使用一个决策树来解释CNN在语义层面上的预测。我们研究了一种对CNN进行修正的方法,并将其与决策树紧密耦合。该决策树将CNN的决策模式编码为每个预测的定量依据。我们的方法不需要对训练图像中的物体部分或纹理进行任何标注来指导CNN的学习。我们已经在不同的基准数据集上测试了我们的方法,实验证明了我们的方法的有效性。请注意,从理论上讲,决策树只是为CNN预测提供了一个近似的解释,而不是对CNN表示细节的精确重构。有两个原因。首先,没有精确的对象-部分标注来监督CNNs的学习,滤波损失只能粗略地使每个滤波代表一个对象零件。该过滤器可能产生不正确的激活在一些具有挑战性的图像。其次,每个节点的决策模式忽略不重要的对象部分过滤器,以保证决策模式的稀疏表示。

<think>好的,现在用户遇到了一个问题,在Spark Shell中粘贴代码时出现了错误:“illegal start of definition”并指向:paste命令。用户之前询问过如何在Spark终端运行那个Person对象,现在可能在尝试时遇到了问题。 首先,我需要回忆之前的对话。用户提供的代码是一个Scala单例对象,其中有一个可变变量lastId,用于生成递增的ID。之前的回答中已经提到在分布式环境中这种方法是不可靠的,但用户现在的问题是关于运行时的具体错误。 用户当前的错误信息显示在退出粘贴模式后出现语法错误,可能是在使用:paste命令时操作不当。常见的错误可能包括没有正确进入粘贴模式,或者在粘贴结束后没有正确退出,比如没有按Ctrl+D而是手动输入结束符。 接下来,我需要分析错误信息。错误提示在退出粘贴模式时出现非法的定义开始,可能意味着用户在输入代码时没有正确使用:paste命令,或者在代码中存在语法错误。比如,可能在输入:paste后没有按回车直接粘贴代码,或者在代码中存在不兼容的语法。 可能的解决步骤包括:首先确保正确使用:paste模式,进入后粘贴代码,然后使用Ctrl+D结束。另外,检查代码是否正确,特别是Scala语法是否正确,比如对象定义是否完整,是否有遗漏的大括号等。 另外,用户可能是在Spark Shell中直接输入了:paste命令而没有换行,或者在粘贴代码时包含了其他不必要的字符,比如行号或注释。需要提醒用户正确使用:paste的步骤,并确保代码本身没有语法错误。 还要考虑Spark Shell的版本差异,不同版本的Scala或Spark可能对语法有不同的要求,但一般来说,用户提供的代码是标准的Scala,应该没有问题。因此,问题更可能出现在操作步骤上。 总结下来,用户的错误可能是由于没有正确进入和退出粘贴模式导致的。需要详细说明正确的步骤,并提醒可能的注意事项,比如避免在代码中使用不兼容的命令,或者在粘贴时保持代码的完整性。 最后,建议用户按照分步说明重新尝试,并确认每个步骤是否正确执行。如果问题依旧,可能需要进一步检查代码的语法或环境配置。</think>在Spark Shell中使用`:paste`模式粘贴多行代码时出现`illegal start of definition`错误,通常是由于**操作步骤不规范**导致的。以下是详细解决方案: --- ### 错误原因分析 1. **未正确进入粘贴模式**:直接输入`:paste`后未按回车键确认 2. **粘贴格式错误**:手动输入结束符`Ctrl+D`而非自动生成 3. **代码残留干扰**:之前输入的未完成代码片段残留 --- ### 正确操作步骤(以你的代码为例) #### 步骤1:启动Spark Shell ```bash spark-shell ``` #### 步骤2:触发粘贴模式 在Spark Shell中**严格按顺序输入**: ```scala :paste // 1. 输入此命令 // 2. 按回车键(此时光标会换行并进入多行输入状态) ``` #### 步骤3:粘贴完整代码 ```scala // 注意:不要带任何行号或注释 object Person { private var lastId = 0 def newPersonId() = { lastId += 1 lastId } } ``` #### 步骤4:结束粘贴 - 按`Ctrl+D`(Windows/Linux)或`Command+D`(Mac) - **不要手动输入结束符** --- ### 成功输出示例 ```scala // 正确操作后会显示: // Exiting paste mode, now interpreting. defined object Person // 关键成功标识 ``` --- ### 常见错误场景排查 | 错误现象 | 解决方案 | |---------|----------| | 直接输入代码未用`:paste` | 多行代码必须使用`:paste`模式 | | 误输入`Ctrl+C`中断 | 重新执行完整粘贴流程 | | 代码中包含中文符号 | 检查分号、括号是否为英文符号 | | Spark Shell版本过旧 | 升级到Spark 2.4+版本 | --- ### 补充建议 1. **验证对象是否正确定义**: ```scala // 输入以下命令测试 Person.newPersonId() // 应返回1 Person.newPersonId() // 应返回2 ``` 2. **重置环境方法**(如果对象定义冲突): ```scala :reset // 清除所有自定义对象 ``` 如果仍遇到问题,建议检查Spark版本是否符合要求(推荐Spark 3.0+),并确保操作系统终端支持标准键盘输入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值