Keras, How to get the output of each layer? Keras, How to get the output of each layer? python python

Keras, How to get the output of each layer?


You can easily get the outputs of any layer by using: model.layers[index].output

For all layers use this:

from keras import backend as Kinp = model.input                                           # input placeholderoutputs = [layer.output for layer in model.layers]          # all layer outputsfunctors = [K.function([inp, K.learning_phase()], [out]) for out in outputs]    # evaluation functions# Testingtest = np.random.random(input_shape)[np.newaxis,...]layer_outs = [func([test, 1.]) for func in functors]print layer_outs

Note: To simulate Dropout use learning_phase as 1. in layer_outs otherwise use 0.

Edit: (based on comments)

K.function creates theano/tensorflow tensor functions which is later used to get the output from the symbolic graph given the input.

Now K.learning_phase() is required as an input as many Keras layers like Dropout/Batchnomalization depend on it to change behavior during training and test time.

So if you remove the dropout layer in your code you can simply use:

from keras import backend as Kinp = model.input                                           # input placeholderoutputs = [layer.output for layer in model.layers]          # all layer outputsfunctors = [K.function([inp], [out]) for out in outputs]    # evaluation functions# Testingtest = np.random.random(input_shape)[np.newaxis,...]layer_outs = [func([test]) for func in functors]print layer_outs

Edit 2: More optimized

I just realized that the previous answer is not that optimized as for each function evaluation the data will be transferred CPU->GPU memory and also the tensor calculations needs to be done for the lower layers over-n-over.

Instead this is a much better way as you don't need multiple functions but a single function giving you the list of all outputs:

from keras import backend as Kinp = model.input                                           # input placeholderoutputs = [layer.output for layer in model.layers]          # all layer outputsfunctor = K.function([inp, K.learning_phase()], outputs )   # evaluation function# Testingtest = np.random.random(input_shape)[np.newaxis,...]layer_outs = functor([test, 1.])print layer_outs


From https://keras.io/getting-started/faq/#how-can-i-obtain-the-output-of-an-intermediate-layer

One simple way is to create a new Model that will output the layers that you are interested in:

from keras.models import Modelmodel = ...  # include here your original modellayer_name = 'my_layer'intermediate_layer_model = Model(inputs=model.input,                                 outputs=model.get_layer(layer_name).output)intermediate_output = intermediate_layer_model.predict(data)

Alternatively, you can build a Keras function that will return the output of a certain layer given a certain input, for example:

from keras import backend as K# with a Sequential modelget_3rd_layer_output = K.function([model.layers[0].input],                                  [model.layers[3].output])layer_output = get_3rd_layer_output([x])[0]


Based on all the good answers of this thread, I wrote a library to fetch the output of each layer. It abstracts all the complexity and has been designed to be as user-friendly as possible:

https://github.com/philipperemy/keract

It handles almost all the edge cases.

Hope it helps!