mapas saliência de redes neurais (usando Keras)

votos
9

Eu tenho um perceptron multicamadas totalmente conectado treinados em Keras. Eu alimentá-lo com um vector de características dimensionais-N e que prevê uma fora das classes M para o vector de entrada. O treinamento e predição está funcionando bem. Agora eu quero analisar o que parte do vector recurso de entrada é realmente responsável por uma determinada classe.
Por exemplo, digamos que há duas classes Ae B, e um vetor de entrada f. O vector fpertence à classe Ae da rede prevê-lo corretamente - a saída da rede é A=1 B=0. Porque eu tenho algum conhecimento de domínio, eu sei que toda a fverdade não é responsável por fpertencer a A, apenas uma certa parte internafé responsável por isso. Eu quero saber se a rede neural conquistou isso. Desenhar uma correspondência para as imagens, se uma imagem Item um catnele (com algum fundo gramado) e uma rede treinada prevê que corretamente, então a rede deve saber que toda a imagem não é realmente um cat; a rede sabe internamente a localização do catna imagem. Da mesma forma, no meu caso, a rede sabe que parte ftorna pertencem à classe A. Eu quero saber qual parte que é.

Eu procurei ao redor, e acreditar no que eu quero fazer é chamado de encontrar saliência Maps para minha rede, para uma determinada entrada. Isso está correto?
Se eu entendi corretamente, saliência Mapas são simplesmente (change in output)/(change in input), e pode ser encontrada simplesmente uma operação de backpropagation onde eu encontrar o derivado do produto em relação à entrada.
Eu encontrei o seguinte trecho de código para fazer isso em Keras, mas eu não tenho certeza se ele está correto:

   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)

No código acima, ao calcular o gradiente, é o backpropagation realmente acontecendo? A saída é uma função não linear da entrada, de modo que a única maneira para localizar o gradiente é fazer Retropropagação. Mas no código acima, não há nada para se conectar theanoe rede, como é Theano consciente da rede aqui? Como tanto quanto sei, ao calcular gradientes com Théano, primeiro definir a função em termos de entrada e de saída. Então Theano tem que saber o que a função não-linear é. Eu não acho que é verdade no trecho acima ..

UPDATE: O código acima não funciona porque eu tenho um MLP totalmente conectado. Ele dá um erro dizendo objeto denso não ter get_output (). Eu tenho a seguinte função Keras, que calcula a saída de entrada determinada rede. Quero agora encontrar gradiente desta função wrt a entrada:

    get_output = K.function([self.model.layers[0].input],[self.model.layers[-1].output])
Publicado 01/05/2016 em 14:05
fonte usuário
Em outras línguas...                            


1 respostas

votos
7

Eu encontrei a solução:

    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])
Respondeu 01/05/2016 em 22:40
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more