2016-05-14 1 views
5

Je veux transformer mon modèle keras en une fonction theano afin que je puisse calculer les gradients sur les entrées. Je pensais que cela pourrait être cool pour visualiser le réseau. Je veux utiliser ces dégradés pour améliorer les caractéristiques de l'image originale en fonction de ce que le réseau de neurones pense être. Je ne comprends pas ce que je fais mal avec le code suivant.Comment transformer le modèle keras entier en fonction theano

model = Sequential() 
model.add(InputLayer((3, H, W))) 
model.add(GaussianNoise(0.03)) 

model.add(Flatten()) 
model.add(Dense(512, activation = 'relu', name = 'dense')) 
model.add(Dropout(0.2)) 
model.add(Dense(20, activation = 'relu')) 
model.add(Dense(C, activation = 'softmax', W_regularizer = l2())) 
... 
f = theano.function([model.input], model.output) 

Je reçois l'exception suivante.

theano.gof.fg.MissingInputError: A variable that is an input to the graph was neither provided as an input to the function nor given a value. A chain of variables leading from this input to an output is [keras_learning_phase, DimShuffle{x,x}.0, Elemwise{switch,no_inplace}.0, dot.0, Elemwise{add,no_inplace}.0, Elemwise{add,no_inplace}.0, Elemwise{mul,no_inplace}.0, dot.0, Elemwise{add,no_inplace}.0, Softmax.0]. This chain may not be unique 
Backtrace when the variable is created: 
    File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed 
    File "/usr/local/lib/python3.5/dist-packages/keras/backend/__init__.py", line 51, in <module> 
    from .theano_backend import * 
    File "<frozen importlib._bootstrap>", line 969, in _find_and_load 
    File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked 
    File "<frozen importlib._bootstrap>", line 673, in _load_unlocked 
    File "<frozen importlib._bootstrap_external>", line 662, in exec_module 
    File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed 
    File "/usr/local/lib/python3.5/dist-packages/keras/backend/theano_backend.py", line 13, in <module> 
    _LEARNING_PHASE = T.scalar(dtype='uint8', name='keras_learning_phase') # 0 = test, 1 = train 

Répondre

2

Après la FAQ, essayez:

from keras import backend as K 
get_last_layer_output = K.function([model.layers[0].input], 
            [model.layers[-1].output]) 

Pour la version la plus récente de Keras (1.0), utilisez

from keras import backend as K 
get_last_layer_output = K.function([model.layers[0].input], 
            [model.layers[-1].get_output(train=False)]) 
0

Pour keras "vieux" (par exemple 0.3.x):

Je n'utilise pas cette version mais des exemples comme this one devraient fonctionner.

Pour les "nouveaux" keras (1.0+): (. 0 pour les essais, 1 pour la formation)

Puisque vous utilisez couche Dropout, vous devrez ajouter une autre entrée K.learning_phase() et lui donner la valeur 0

code:

from keras import backend as K 
K.function([model.layers[0].input, K.learning_phase()], [model.layers[-1].output]) 

Référence: keras FAQ