web-dev-qa-db-fra.com

Obtention du gradient de la sortie du modèle avec les poids à l'aide de Keras

Je souhaite construire des modèles d'apprentissage par renforcement avec la simplicité de l'API Keras. Malheureusement, je suis incapable d'extraire le gradient de la sortie (pas d'erreur) par rapport aux poids. J'ai trouvé le code suivant qui remplit une fonction similaire ( Cartes de saillance des réseaux de neurones (utilisant 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])

Toute idée sur la façon de calculer le gradient de la sortie du modèle par rapport aux poids pour chaque couche serait appréciée.

28
Matt S

Pour obtenir les gradients de sortie du modèle par rapport aux poids à l'aide de Keras, vous devez utiliser le module backend Keras. J'ai créé cet exemple simple pour illustrer exactement ce qu'il faut faire:

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'])

Pour calculer les gradients, nous devons d'abord trouver le tenseur de sortie. Pour la sortie du modèle (ce que ma question initiale demandait), nous appelons simplement model.output. Nous pouvons également trouver les gradients des sorties pour d'autres couches en appelant model.layers [index] .output

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

Ensuite, nous devons choisir les variables qui sont par rapport au gradient.

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

Nous pouvons maintenant calculer les gradients. C'est aussi simple que cela:

gradients = k.gradients(outputTensor, listOfVariableTensors)

Pour exécuter réellement les gradients donnés une entrée, nous devons utiliser un peu de 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})

Et c'est tout!

36
Matt S