2015-12-24 3 views
5

Pour un ConvNet, il peut être intéressant de trouver l'entrée normalisée qui maximise l'activité d'une seule conversion. filtre comme un moyen de visualize the filters. Je voudrais faire cela dans le paquet d'apprentissage en profondeur Keras. Cela pourrait être fait en utilisant un algorithme d'optimisation de boîte noire avec le code de FAQ.Dégradé de l'expression de Theano pour la visualisation de filtre dans Keras

# with a Sequential model 
get_3rd_layer_output = theano.function([model.layers[0].input], 
             model.layers[3].get_output(train=False)) 
layer_output = get_3rd_layer_output(X) 

Cependant, ce serait une tâche d'optimisation sensiblement plus facile si j'avais le gradient. Comment puis-je extraire le dégradé de l'expression Theano et l'entrer dans une bibliothèque d'optimisation Python telle que Scipy?

Répondre

2

Vous pouvez imprimer le dégradé comme décrit here et le coder à la main dans Scipy. Vous pouvez également faire l'optimisation dans Theano - voir this question.

Cependant, sans doute l'approche la plus straight-forward est de créer une fonction get_gradients() qui utilise theano.grad() pour retourner les gradients des filtres par rapport à une entrée, puis appelez scipy.optimize.minimize avec jac=get_gradients. Selon le documentation:

jac: bool ou appelable, en option jacobienne (gradient) de la fonction objectif . [...] jac peut aussi être un callable renvoyant le gradient de à l'objectif. Dans ce cas, il doit accepter les mêmes arguments que fun.

+0

Merci. Je comprends l'idée de base derrière 'theano.grad()', mais comment extraire les dégradés par rapport à la perte d'un modèle de Keras? Basé sur https://github.com/fchollet/keras/blob/master/examples/conv_filter_visualization.py J'ai vu comment cela peut être fait en utilisant une entrée 'X_train', mais je n'ai pas compris comment faire cela pour la perte. Mes deux problèmes sont 1) Je n'arrive pas à extraire la fonction de perte comme étant connectée au réseau 2) Cette nouvelle fonction nécessite à la fois 'X_train' et' y_train', ce que je ne peux pas donner de la bonne façon. – pir

+0

Keras calcule déjà les gradients de la perte par rapport à chaque couche, lors de la rétropropagation. Mais ne voulez-vous pas les gradients d'une couche intermédiaire par rapport à l'entrée? –

+0

Ah, oui. Désolé, ça fait longtemps que j'ai posé la question. Votre réponse le résout. Mon problème actuel est de savoir comment extraire les dégradés à travers tous les paramètres. la perte que je veux examiner le besoin d'écrêtage de gradient. Est-ce facile d'obtenir à partir de la backprop prouvé comme mis en œuvre dans Keras? – pir