我有在Keras训练的完全连接的多层感知器。我为它提供了N维特征向量,并且它为输入向量预测了M个类中的一个。训练和预测效果很好。现在,我想分析输入特征向量的哪一部分实际上负责特定的类。
例如,假设有两个类A
和B
,以及一个输入向量f
。向量f
属于A
类,并且网络可以正确预测它-网络的输出为A=1 B=0
。因为我了解一些领域知识,所以我知道整个f
实际上不负责属于f
的A
,而f
内部只有一部分负责。我想知道神经网络是否已经捕获了这一点。绘制与图像的对应关系,如果图像I
中包含cat
(具有一些草木背景),并且受过训练的网络可以正确预测,那么网络必须知道整个图像实际上不是cat
;网络内部知道图像中cat
的位置。同样,在我的情况下,网络知道f
的哪一部分使其属于A
类。我想知道那是哪一部分。
我到处搜索,并相信我想要做的就是为给定的输入为我的网络查找Saliency Map。那是对的吗?
如果我对它的理解正确,那么显着性映射就是(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在这里如何“感知”网络?据我所知,在使用Theano计算梯度时,我们首先根据输入和输出定义函数。因此,theano必须知道非线性函数是什么。我不认为上面的代码片段是真的。更新:上面的代码不起作用,因为我具有完全连接的MLP。它给出一个错误信息:“密集对象没有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])
关于neural-network - 神经网络的显着性图(使用Keras),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36968128/