Keras / Tensorflow: obtenga predicciones o salida de todas las capas de manera eficiente

Puedo obtener la salida / predicciones de todas las capas como se sugiere en Keras Docs: cómo-puedo-obtener-la-salida-de-una-capa-intermedia

def get_output_of_all_layers(model, test_input): output_of_all_layers = [] for count, layer in enumerate(model.layers): # skip the input layer if count == 0: continue intermediate_layer_model = Model(inputs=model.input, outputs=model.get_layer(layer.name).output) intermediate_output = intermediate_layer_model.predict(test_input)[0] output_of_all_layers.append(intermediate_output) return np.array(output_of_all_layers) 

Pero esto es increíblemente más lento y demora más de un minuto (en ~ 65s , en 6700HQ con GTX1070 , eso es ridículamente alto, ¡la inferencia ocurre en menos de un segundo …!) Para modelos con aproximadamente 50 capas. Supongo que esto se debe a que construye un modelo cada vez, carga el modelo en la memoria, pasa entradas y obtiene salidas. Claramente, no puede obtener la salida de la última capa sin obtener resultados de las otras capas, ¿cómo puedo guardarlas todas como la anterior sin tener que crear modelos redundantes (o de una manera más rápida y eficiente)?

Actualización: también noté que esto NO utiliza mi GPU, esto significa que todas las capas de conv están siendo ejecutadas por la CPU. ¿Por qué no usaría mi GPU para esto? Calculo que tomará mucho menos si usa mi GPU.

¿Cómo lo hago de manera más eficiente?

Como lo sugirió Ben Usman, primero puede ajustar el modelo en un Modelo básico de extremo a extremo y proporcionar sus capas como salidas a un segundo Model :

 import keras.backend as K from keras.models import Model from keras.layers import Input, Dense input_layer = Input((10,)) layer_1 = Dense(10)(input_layer) layer_2 = Dense(20)(layer_1) layer_3 = Dense(5)(layer_2) output_layer = Dense(1)(layer_3) basic_model = Model(inputs=input_layer, outputs=output_layer) # some random input import numpy as np features = np.random.rand(100,10) # With a second Model intermediate_model = Model(inputs=basic_model.layers[0].input, outputs=[l.output for l in basic_model.layers[1:]]) intermediate_model.predict(features) # outputs a list of 4 arrays 

O bien, podría utilizar una función de Keras de manera similar:

 # With a Keras function get_all_layer_outputs = K.function([basic_model.layers[0].input], [l.output for l in basic_model.layers[1:]]) layer_output = get_all_layer_outputs([features]) # return the same thing