Um die Gradienten der Modellausgabe in Bezug auf Gewichte mit Keras zu erhalten, müssen Sie das Keras-Backend-Modul verwenden. Ich habe dieses einfaches Beispiel genau zu zeigen, was zu tun ist:
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'])
Um die Steigungen zu berechnen wir zunächst den Ausgang Tensor finden müssen. Für die Ausgabe des Modells (was meine ursprüngliche Frage war) nennen wir einfach model.output. Wir können auch die Steigungen der Ausgänge für andere Schichten durch den Aufruf model.layers [index] finden .output
outputTensor = model.output #Or model.layers[index].output
Dann müssen wir die Variablen auswählen, die in Bezug auf den Gradienten sind.
listOfVariableTensors = model.trainable_weights
#or variableTensors = model.trainable_weights[0]
Wir können jetzt die Gradienten berechnen. Es ist so einfach wie die folgenden:
gradients = k.gradients(outputTensor, listOfVariableTensors)
Um tatsächlich die Gradienten führen einen Eingang gegeben, brauchen wir ein bisschen Tensorflow verwenden.
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})
Und das ist es!
Hatten Sie einen Vorschuss? Ich bekomme den folgenden Fehler mit einer ähnlichen Ausprägung Funktion: https://github.com/fchollet/keras/issues/1777#issuecomment-250040309 – ssierral
Ich hatte keinen Erfolg mit Keras. Dies ist mir jedoch mit Tensorflow gelungen. –
https://github.com/yanpanlau/DDPG-Keras-Torcs CriticNetwork.py verwendet das Tensorflow-Backend, um Gradienten zu berechnen, während Keras verwendet wird, um tatsächlich die Netzarchitektur zu erstellen –