我有在Keras训练的完全连接的多层感知器。我为它提供了N维特征向量,并且它为输入向量预测了M个类中的一个。训练和预测效果很好。现在,我想分析输入特征向量的哪一部分实际上负责特定的类。
例如,假设有两个类AB,以及一个输入向量f。向量f属于A类,并且网络可以正确预测它-网络的输出为A=1 B=0。因为我了解一些领域知识,所以我知道整个f实际上不负责属于fA,而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/

10-12 23:56