Neural network 神经网络的显著性映射(使用Keras)

Neural network 神经网络的显著性映射(使用Keras),neural-network,theano,deep-learning,keras,Neural Network,Theano,Deep Learning,Keras,我有一个完全连接的多层感知器在Keras训练。我给它一个N维特征向量,它预测输入向量的M个类中的一个。训练和预测效果良好。现在,我想分析输入特征向量的哪一部分实际上负责特定的类。 例如,假设有两个类A和B,以及一个输入向量f。向量f属于类A,网络正确预测-网络输出为A=1 B=0。因为我有一些领域知识,我知道整个f实际上并不负责f属于A,只有f内部的某个部分负责。我想知道神经网络是否捕捉到了这一点。绘制与图像的对应关系,如果图像I中有一个cat(有一些草背景),并且经过训练的网络能够正确预测,那

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

我四处搜索,相信我想做的就是为我的网络找到一个给定输入的显著性图。对吗?
如果我理解正确,显著性映射就是简单的
(输出的变化)/(输入的变化)
,可以通过简单的一次反向传播操作找到,其中我找到了输出相对于输入的导数。
我在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)
在上面的代码中,当计算梯度时,反向传播真的发生了吗?输出是输入的非线性函数,因此找到梯度的唯一方法是使用backprop。但是在上面的代码中,没有任何东西可以连接theano和网络,theano是如何“意识到”这里的网络的?据我所知,当用Theano计算梯度时,我们首先根据输入和输出定义函数。所以theano必须知道非线性函数是什么。我不认为这在上面的片段中是正确的

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

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

您使用哪种版本的Keras?