2016-05-14 4 views
5

Ich möchte mein Keras-Modell in eine theano-Funktion umwandeln, damit ich die Gradienten an den Eingängen berechnen kann. Ich dachte, das wäre cool, um das Netzwerk zu visualisieren. Ich möchte diese Gradienten verwenden, um Merkmale im Originalbild zu verbessern, basierend auf dem, was das neuronale Netzwerk denkt. Ich verstehe nicht, was ich mit dem folgenden Code falsch mache.Wie man das gesamte Keras-Modell in theano-Funktion umwandelt

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) 

Ich bekomme die folgende Ausnahme.

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 

Antwort

2

die FAQ Nach versuchen:

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

Für die neueste Version von Keras (1,0), verwenden

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

Für "alte" keras (0.3.x zum Beispiel):

Ich benutze diese Version nicht, aber Beispiele wie this one sollten funktionieren.

Für "neue" keras (1.0+): (. 0 für die Prüfung, 1 für die Ausbildung)

Da Sie Dropout Schicht verwenden, müssen Sie einen anderen Eingang K.learning_phase() hinzuzufügen und den Wert 0 geben

Code:

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

Referenz: keras FAQ