要使用 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
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})
就是这样!