2016-05-14 43 views
5

Voglio trasformare il mio modello di telecamere in una funzione theano in modo da poter calcolare i gradienti sugli ingressi. Ho pensato che potesse essere interessante per visualizzare la rete. Voglio usare questi gradienti per migliorare le caratteristiche dell'immagine originale sulla base di ciò che la rete neuronale pensa di essere. Non capisco cosa sto facendo male con il seguente codice.Come trasformare l'intero modello di keras nella funzione 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) 

Ottengo la seguente eccezione.

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 

risposta

2

Dopo la FAQ, provare:

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

Per la versione più recente di Keras (1.0), utilizzare

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

Per i "vecchi" keras (ad esempio 0.3.x):

Non uso questa versione, ma esempi come this one dovrebbero funzionare.

Per "nuove" keras (1.0+): (. 0 per il test, 1 per la formazione)

Dal momento che si utilizza Dropout livello, sarà necessario aggiungere un altro ingresso K.learning_phase() e dargli il valore 0

codice:

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

Riferimento: keras FAQ