Entreno un modelo A y trato de usar la salida de la capa intermedia con el name="layer_x" como una entrada adicional para el modelo B
Traté de usar la salida de la capa intermedia como en el documento de Keras https://keras.io/getting-started/faq/#how-can-i-obtain-the-output-of-an-intermediate-layer .
Modelo A:
inputs = Input(shape=(100,)) dnn = Dense(1024, activation='relu')(inputs) dnn = Dense(128, activation='relu', name="layer_x")(dnn) dnn = Dense(1024, activation='relu')(dnn) output = Dense(10, activation='softmax')(dnn)Modelo B:
input_1 = Input(shape=(200,)) input_2 = Input(shape=(100,)) # input for model A # loading model A model_a = keras.models.load_model(path_to_saved_model_a) intermediate_layer_model = Model(inputs=model_a.input, outputs=model_a.get_layer("layer_x").output) intermediate_output = intermediate_layer_model.predict(data) merge_layer = concatenate([input_1, intermediate_output]) dnn_layer = Dense(512, activation="relu")(merge_layer) output = Dense(5, activation="sigmoid")(dnn_layer) model = keras.models.Model(inputs=[input_1, input_2], outputs=output)Cuando depuro me sale un error en esta línea:
intermediate_layer_model = Model(inputs=model_a.input, outputs=model_a.get_layer("layer_x").output) File "..", line 89, in set_model outputs=self.neural_net_asc.model.get_layer("layer_x").output) File "C:\WinPython\python-3.5.3.amd64\lib\site-packages\keras\legacy\interfaces.py", line 87, in wrapper return func(*args, **kwargs) File "C:\WinPython\python-3.5.3.amd64\lib\site-packages\keras\engine\topology.py", line 1592, in __init__ mask = node.output_masks[tensor_index] AttributeError: 'Node' object has no attribute 'output_masks' Puedo acceder al tensor con get_layer("layer_x").output y output_mask es None . ¿Tengo que configurar manualmente una máscara de salida y cómo configuro esta máscara de salida si es necesario?
Hay dos cosas que pareces estar haciendo mal:
intermediate_output = intermediate_layer_model.predict(data) cuando hace .predict() , en realidad está pasando datos a través del gráfico y preguntando cuál será el resultado. Cuando haga eso, intermediate_output será una matriz numpy y no una capa como le gustaría que fuera.
En segundo lugar, no necesita recrear un nuevo modelo intermedio. Puedes usar directamente la parte de model_a que te interese.
Aquí hay un código que "compila" para mí:
from keras.layers import Input, Dense, concatenate from keras.models import Model inputs = Input(shape=(100,)) dnn = Dense(1024, activation='relu')(inputs) dnn = Dense(128, activation='relu', name="layer_x")(dnn) dnn = Dense(1024, activation='relu')(dnn) output = Dense(10, activation='softmax')(dnn) model_a = Model(inputs=inputs, outputs=output) # You don't need to recreate an input for the model_a, # it already has one and you can reuse it input_b = Input(shape=(200,)) # Here you get the layer that interests you from model_a, # it is still linked to its input layer, you just need to remember it for later intermediate_from_a = model_a.get_layer("layer_x").output # Since intermediate_from_a is a layer, you can concatenate it with the other input merge_layer = concatenate([input_b, intermediate_from_a]) dnn_layer = Dense(512, activation="relu")(merge_layer) output_b = Dense(5, activation="sigmoid")(dnn_layer) # Here you remember that one input is input_b and the other one is from model_a model_b = Model(inputs=[input_b, model_a.input], outputs=output_b)Espero que esto sea lo que querías hacer.
Por favor, dime si algo no está claro :-)