我有一个完全连接的多层感知器在Keras训练 . 我给它一个N维特征向量,它预测输入向量的M类中的一个 . 培训和预测运作良好 . 现在我想分析输入特征向量的哪个部分实际负责特定类 .
例如,假设有两个类 A
和 B
,以及一个输入向量 f
. 向量 f
属于类 A
,网络正确预测它 - 网络的输出是 A=1 B=0
. 因为我有一些领域知识,我知道整个 f
实际上不对属于 A
的 f
负责,只有 f
内的某个部分负责 . 我想知道神经网络是否捕获了那个 . 绘制与图像的对应关系,如果图像 I
中有一个 cat
(有一些草背景)并且训练有素的网络正确预测,则网络必须知道整个图像实际上不是 cat
;网络内部知道图像中 cat
的位置 . 同样,在我的情况下,网络知道 f
的哪一部分属于类 A
. 我想知道那是什么部分 .
我四处搜索,并相信我想要做的是为我的网络寻找Saliency Maps,以获得给定的输入 . 那是对的吗?
如果我已经正确理解它,Saliency Maps就是 (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)
在上面的代码中,当计算梯度时,反向传播实际上是在发生吗?输出是输入的非线性函数,因此找到梯度的唯一方法是做backprop . 但是在上面的代码中,没有什么可以连接 theano
和网络,网络的theano "aware"怎么样?据我所知,在使用Theano计算渐变时,我们首先根据输入和输出定义函数 . 所以theano必须知道非线性函数是什么 . 我不认为在上面的片段中是真的..
Update: 上面的代码不起作用,因为我有一个完全连接的MLP . 它给出了一个错误说"Dense object doesn't have get_output()" . 我有以下Keras函数,它计算给定输入的网络输出 . 我想现在找到输入的这个函数的渐变:
get_output = K.function([self.model.layers[0].input],[self.model.layers[-1].output])
1 回答
我找到了解决方案: