使用Keras获得模型输出的梯度w.r.t权重

时间:2016-09-18 19:07:23

标签: python theano keras

我对使用Keras API的简单性构建强化学习模型感兴趣。不幸的是,我无法提取关于权重的输出的梯度(而不是错误)。我发现以下代码执行类似的功能(Saliency maps of neural networks (using Keras)

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([trainingData])

关于如何根据每层的权重计算模型输出的梯度的任何想法都将受到赞赏。

2 个答案:

答案 0 :(得分:34)

要使用Keras获得相对于权重的模型输出的渐变,您必须使用Keras后端模块。我创建了这个简单的例子来准确说明该做什么:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <a ui-sref="tabsController.inCio" id="login-button1" class="button button-stable  button-block LoginButton1" href="#/tabsController/home">Login</a>

要计算梯度,我们首先需要找到输出张量。对于模型的输出(我的初始问题是什么),我们只需调用model.output。我们还可以通过调用model.layers [index] .output

找到其他图层的输出梯度
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras import backend as k


model = Sequential()
model.add(Dense(12, input_dim=8, init='uniform', activation='relu'))
model.add(Dense(8, init='uniform', activation='relu'))
model.add(Dense(1, init='uniform', activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

然后我们需要选择与渐变有关的变量。

outputTensor = model.output #Or model.layers[index].output

我们现在可以计算渐变。它就像以下一样简单:

  listOfVariableTensors = model.trainable_weights
  #or variableTensors = model.trainable_weights[0]

要实际运行给定输入的渐变,我们需要使用一点Tensorflow。

gradients = k.gradients(outputTensor, listOfVariableTensors)

就是这样!

答案 1 :(得分:-2)

下面的答案是关于交叉熵函数的,请随时更改它的函数。

Bar