使用Keras获得模型输出的梯度和权重

Mat*_*t S 30 python theano keras

我有兴趣用Keras API的简单性构建强化学习模型.不幸的是,我无法提取关于权重的输出的梯度(而不是错误).我发现以下代码执行类似的功能(神经网络的显着性图(使用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])
Run Code Online (Sandbox Code Playgroud)

关于如何根据每层的权重计算模型输出的梯度的任何想法都将被理解.

Mat*_*t S 36

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

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'])
Run Code Online (Sandbox Code Playgroud)

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

outputTensor = model.output #Or model.layers[index].output
Run Code Online (Sandbox Code Playgroud)

然后我们需要选择与梯度有关的变量.

  listOfVariableTensors = model.trainable_weights
  #or variableTensors = model.trainable_weights[0]
Run Code Online (Sandbox Code Playgroud)

我们现在可以计算梯度.它很简单如下:

gradients = k.gradients(outputTensor, listOfVariableTensors)
Run Code Online (Sandbox Code Playgroud)

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

trainingExample = np.random.random((1,8))
sess = tf.InteractiveSession()
sess.run(tf.initialize_all_variables())
evaluated_gradients = sess.run(gradients,feed_dict={model.input:trainingExample})
Run Code Online (Sandbox Code Playgroud)

就是这样!

  • 我运行此代码(使用theano作为后端)并引发以下错误:"TypeError:cost必须是标量.".我想知道,这可以用后端不可知的方法来实现吗? (4认同)
  • 该解决方案的问题在于它没有解决在训练时如何从Keras获得这些梯度的问题.当然,对于一些随机玩具输入我可以做你上面写的,但如果我想要在Keras的fit()函数执行的实际训练步骤中计算的渐变,我该如何获得?它们不是在Keras代码深处传递给sess.run()的fetch列表的一部分,所以除非我花了一个月的时间理解并重写Keras训练引擎,否则我不能拥有它们: (4认同)
  • 我相信你的意思是"渐变输出". (2认同)