神经网络的显着性图(使用 Keras)
Posted
技术标签:
【中文标题】神经网络的显着性图(使用 Keras)【英文标题】:Saliency maps of neural networks (using Keras) 【发布时间】:2016-08-26 08:57:41 【问题描述】:我有一个在 Keras 中训练的全连接多层感知器。我给它一个 N 维特征向量,它预测输入向量的 M 个类别中的一个。训练和预测运行良好。现在我想分析输入特征向量的哪一部分实际上负责特定的类。
例如,假设有两个类A
和B
,以及一个输入向量f
。向量f
属于A
类,网络正确预测它——网络的输出是A=1 B=0
。因为我有一些领域知识,我知道整个f
实际上并不负责属于A
的f
,只有f
内部的某个部分负责。我想知道神经网络是否捕捉到了这一点。绘制与图像的对应关系,如果图像I
中包含cat
(有一些草背景)并且经过训练的网络正确预测,那么网络必须知道整个图像实际上不是cat
;网络内部知道图像中cat
的位置。同样,在我的例子中,网络知道f
的哪一部分使它属于A
类。我想知道那是什么部分。
我四处搜索,并相信我想做的就是为给定的输入找到我的网络的显着图。对吗?
如果我理解正确的话,Saliency Maps 就是 (change in output)/(change in input)
,并且可以通过简单的 1 次反向传播操作找到,在该操作中我可以找到输出相对于输入的导数。
我在 Keras 中找到了以下代码 sn-p,但我不确定它是否正确:
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必须知道那个非线性函数是什么。我不认为在上面的 sn-p 中是这样的..
更新:上面的代码不起作用,因为我有一个完全连接的 MLP。它给出了一个错误,说“密集对象没有 get_output()”。我有以下 Keras 函数,它计算网络给定输入的输出。我现在想在输入中找到这个函数的梯度:
get_output = K.function([self.model.layers[0].input],[self.model.layers[-1].output])
【问题讨论】:
你使用哪个版本的 Keras? 【参考方案1】:我找到了解决办法:
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)的主要内容,如果未能解决你的问题,请参考以下文章