2016-05-01 25 views
9

Ho un percettore multistrato completamente connesso addestrato in Keras. Fornisco un vettore di caratteristiche N-dimensionale e predice una classe fuori M per il vettore di input. L'allenamento e la previsione funzionano bene. Ora voglio analizzare quale parte del vettore delle caratteristiche di input è effettivamente responsabile di una particolare classe.
Ad esempio, diciamo che ci sono due classi A e B e un vettore di input f. Il vettore f appartiene alla classe A e la rete lo predice correttamente: l'output della rete è A=1 B=0. Poiché ho una conoscenza del dominio, so che l'intero f non è in realtà responsabile per f appartenente a A, solo una determinata parte all'interno di f è responsabile. Voglio sapere se la rete neurale l'ha catturato. Tracciare una corrispondenza alle immagini, se un'immagine I ha un cat (con qualche sfondo erboso) e una rete addestrata lo predice correttamente, quindi la rete deve sapere che l'intera immagine non è in realtà un cat; la rete conosce internamente la posizione dello cat nell'immagine. Allo stesso modo, nel mio caso, la rete sa quale parte di f fa parte della classe A. Voglio sapere quale parte sia.Mappe di saliency delle reti neurali (usando Keras)

Ho cercato in giro, e credo che quello che voglio fare è chiamare trovare Mappe di Saliency per la mia rete, per un dato input. È corretto?
Se ho capito bene, le mappe di Saliency sono semplicemente (change in output)/(change in input) e possono essere trovate semplicemente con un'operazione di backpropagation dove trovo la derivata dell'output rispetto all'input.
ho trovato il seguente frammento di codice per fare questo in Keras, ma io non sono davvero sicuro se è corretto:

inp = model.layers[0].get_input() 
    outp = model.layers[-1].get_output() 
    max_outp = T.max(outp, axis=1) 
    saliency = theano.grad(max_outp.sum(), wrt=inp) 

Nel codice di cui sopra, quando si calcola il gradiente, è il backpropagation realmente accadendo? L'output è una funzione non lineare dell'input, quindi l'unico modo per trovare il gradiente è fare backprop. Ma nel codice sopra, non c'è niente per collegare theano e la rete, come è theano "consapevole" della rete qui? Per quanto ne so, quando calcoliamo i gradienti con Theano, prima definiamo la funzione in termini di input e output. Quindi, deve sapere che cos'è quella funzione non lineare. Non penso che sia vero nel frammento sopra ..

Aggiornamento: Il codice sopra non funziona perché ho un MLP pienamente connesso. Viene visualizzato un errore che dice "L'oggetto denso non ha get_output()". Ho la seguente funzione Keras, che calcola l'output dell'input fornito dalla rete. Voglio trovare ora gradiente di questa funzione WRT l'ingresso:

get_output = K.function([self.model.layers[0].input],[self.model.layers[-1].output]) 
+0

Quale versione di Keras si usa? –

risposta

7

ho trovato la soluzione:

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([input_feature])