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

时间:2016-05-01 15:05:43

标签: neural-network theano deep-learning keras

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

我四处搜索,并相信我想要做的是为我的网络找到Saliency Maps,用于给定的输入。这是对的吗? 如果我理解正确,Saliency Maps只是A,可以通过简单的1个反向传播操作找到,其中我找到输出相对于输入的导数。
我在Keras找到了以下代码片段,但我不确定它是否正确:

(change in output)/(change in input)

在上面的代码中,计算梯度时,反向传播实际上是在发生吗?输出是输入的非线性函数,因此找到梯度的唯一方法是做backprop。但是在上面的代码中,没有什么可以连接 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必须知道非线性函数是什么。我不认为在上面的片段中是真的。

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

theano

1 个答案:

答案 0 :(得分:7)

我找到了解决方案:

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