我对通过Keras API的简单性构建强化学习模型感兴趣。不幸的是,我无法提取相对于权重的输出梯度(不是误差)。
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])
关于如何计算模型输出相对于每一层的权重的梯度的任何想法将被理解。
要使用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'])
为了计算梯度,我们首先需要找到输出张量。对于模型的输出(我最初的问题是什么),我们只需调用model.output。我们还可以通过调用找到其他层的输出的渐变model.layers[index].output
model.layers[index].output
outputTensor = model.output #Or model.layers[index].output
然后,我们需要选择与梯度有关的变量。
listOfVariableTensors = model.trainable_weights #or variableTensors = model.trainable_weights[0]
现在我们可以计算梯度了。它很简单,如下所示:
gradients = k.gradients(outputTensor, listOfVariableTensors)
要实际运行给定输入的梯度,我们需要使用一些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})
就是这样!