神经网络的显着性图(使用 Keras)

Posted

技术标签:

【中文标题】神经网络的显着性图(使用 Keras)【英文标题】:Saliency maps of neural networks (using Keras) 【发布时间】:2016-08-26 08:57:41 【问题描述】:

我有一个在 Keras 中训练的全连接多层感知器。我给它一个 N 维特征向量,它预测输入向量的 M 个类别中的一个。训练和预测运行良好。现在我想分析输入特征向量的哪一部分实际上负责特定的类。 例如,假设有两个类AB,以及一个输入向量f。向量f 属于A 类,网络正确预测它——网络的输出是A=1 B=0。因为我有一些领域知识,我知道整个f实际上并不负责属于Af,只有f内部的某个部分负责。我想知道神经网络是否捕捉到了这一点。绘制与图像的对应关系,如果图像I 中包含cat(有一些草背景)并且经过训练的网络正确预测,那么网络必须知道整个图像实际上不是cat;网络内部知道图像中cat 的位置。同样,在我的例子中,网络知道f 的哪一部分使它属于A 类。我想知道那是什么部分。

我四处搜索,并相信我想做的就是为给定的输入找到我的网络的显着图。对吗? 如果我理解正确的话,Saliency Maps 就是 (change in output)/(change in input),并且可以通过简单的 1 次反向传播操作找到,在该操作中我可以找到输出相对于输入的导数。 我在 Keras 中找到了以下代码 sn-p,但我不确定它是否正确:

   inp = model.layers[0].get_input()
   outp = model.layers[-1].get_output()
   max_outp = T.max(outp, axis=1)
   saliency = theano.grad(max_outp.sum(), wrt=inp)

在上面的代码中,当计算梯度时,反向传播真的发生了吗?输出是输入的非线性函数,因此找到梯度的唯一方法是进行反向传播。但是在上面的代码中,没有任何东西可以连接theano和网络,theano是如何“感知”到这里的网络的呢?据我所知,在使用 Theano 计算梯度时,我们首先根据输入和输出定义函数。所以theano必须知道那个非线性函数是什么。我不认为在上面的 sn-p 中是这样的..

更新:上面的代码不起作用,因为我有一个完全连接的 MLP。它给出了一个错误,说“密集对象没有 get_output()”。我有以下 Keras 函数,它计算网络给定输入的输出。我现在想在输入中找到这个函数的梯度:

    get_output = K.function([self.model.layers[0].input],[self.model.layers[-1].output])

【问题讨论】:

你使用哪个版本的 Keras? 【参考方案1】:

我找到了解决办法:

    get_output = theano.function([model.layers[0].input],model.layers[-1].output,allow_input_downcast=True)
    fx = theano.function( [model.layers[0].input] ,T.jacobian(model.layers[-1].output.flatten(),model.layers[0].input), allow_input_downcast=True)
    grad = fx([input_feature])

【讨论】:

以上是关于神经网络的显着性图(使用 Keras)的主要内容,如果未能解决你的问题,请参考以下文章

R中ACF和PACF的显着性水平

scikit learn:如何检查系数的显着性

您如何测试回归估计参数(拟合数据)的显着性?

将带 ** 的显着性水平括号添加到分组箱线图中; ggplot

有没有办法改变 R 中的显着性水平(alpha)?

r中的星星显着性水平