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

Saliency maps of neural networks (using Keras)

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

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

   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"aware"呢?据我所知,在使用 Theano 计算梯度时,我们首先根据输入和输出定义函数。所以 theano 必须知道那个非线性函数是什么。我不认为上面的代码片段是这样的。

更新: 上面的代码不起作用,因为我有一个完全连接的 MLP。它给出了一个错误 "Dense object doesn't have get_output()" 。我有以下 Keras 函数,它计算给定输入的网络输出。我现在想根据输入找到此函数的梯度:

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

我找到了解决方案:

    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])