neural-network - 神经网络的显着图(使用 Keras)

标签 neural-network theano deep-learning keras

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

我四处搜索,相信我想要做的就是为我的网络为给定的输入寻找显着图。那是对的吗?
如果我理解正确的话,显着图就是 (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/

相关文章:

machine-learning - 特定层与其感受野之间的关系

machine-learning - 如何使用加载的 LSTM 注意力模型对输入进行预测?

java - 神经网络反向传播无法正确计算权重

machine-learning - 在激活函数的反向传播过程中,为什么我们应该将 delta 乘以梯度而不是除法?

python - 为什么在神经网络中将误差乘以 sigmoid 的导数?

python - 烤宽面条的 csv 文件中的 numpy 数组

machine-learning - 神经网络模型中隐藏层的数量

python - Keras 在 model.fit() 之后删除图层

python - 如何用theano扫描矩阵的所有元素?

python - 如何在 tf.keras 中使用 model.predict 预测单个图像