san*_* mk 10 neural-network theano deep-learning keras
我有一个完全连接的多层感知器在Keras训练.我给它一个N维特征向量,它预测输入向量的M类中的一个.培训和预测运作良好.现在我想分析输入特征向量的哪个部分实际负责特定类.
例如,让我们说,有两个类A和B,以及输入向量f.向量f属于类A,网络正确地预测它 - 网络的输出是A=1 B=0.因为我有一些领域知识,我知道整个f实际上不负责f归属A,只有内部的某个部分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如何"了解"网络?据我所知,在使用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])
| 归档时间: | 
 | 
| 查看次数: | 2509 次 | 
| 最近记录: |