Fusionando dos modelos diferentes en Keras

26

Estoy tratando de fusionar dos modelos Keras en un solo modelo y no puedo lograrlo.

Por ejemplo, en la Figura adjunta, me gustaría buscar la capa intermedia de la dimensión 8, y usar esto como entrada a la capa (de la dimensión 8 nuevamente) en el Modelo y luego combinar el Modelo y el Modelo como un solo modelo.B 1 B A BUNA2si1siUNAsi

Estoy usando el módulo funcional para crear el Modelo y el Modelo B de forma independiente. ¿Cómo puedo realizar esta tarea?UNAsi

Nota : es la capa de entrada con el modelo A y B 1 es la capa de entrada para el modelo B .UNA1UNAsi1si

Ver imagen

Rkz
fuente

Respuestas:

22

Descubrí la respuesta a mi pregunta y aquí está el código que se basa en la respuesta anterior.

from keras.layers import Input, Dense
from keras.models import Model
from keras.utils import plot_model

A1 = Input(shape=(30,),name='A1')
A2 = Dense(8, activation='relu',name='A2')(A1)
A3 = Dense(30, activation='relu',name='A3')(A2)

B2 = Dense(40, activation='relu',name='B2')(A2)
B3 = Dense(30, activation='relu',name='B3')(B2)

merged = Model(inputs=[A1],outputs=[A3,B3])
plot_model(merged,to_file='demo.png',show_shapes=True)

y aquí está la estructura de salida que quería:

ingrese la descripción de la imagen aquí

Rkz
fuente
Tenga en cuenta que usted está no la fusión de dos modelos (en el sentido de Keras Modelo) en lo anterior, está la combinación de capas.
Gented
7

En Keras hay una forma útil de definir un modelo: usando la API funcional . Con la API funcional puede definir gráficos acíclicos dirigidos de capas, lo que le permite construir arquitecturas completamente arbitrarias. Considerando tu ejemplo:

#A_data = np.zeros((1,30))
#A_labels = np.zeros((1,30))
#B_labels =np.zeros((1,30))

A1 = layers.Input(shape=(30,), name='A_input')
A2 = layers.Dense(8, activation='???')(A1)
A3 = layers.Dense(30, activation='???', name='A_output')(A2)


B2 = layers.Dense(40, activation='???')(A2)
B3 = layers.Dense(30, activation='???', name='B_output')(B2)

## define A
A = models.Model(inputs=A1, outputs=A3)

## define B
B = models.Model(inputs=A1, outputs=B3) 

B.compile(optimizer='??',
          loss={'B_output': '??'}
          )

B.fit({'A_input': A_data},
  {'B_output': B_labels},
  epochs=??, batch_size=??)

¡Eso es todo! Puedes ver el resultado por B.summary():

Layer (type)                 Output Shape              Param    
A_input (InputLayer)         (None, 30)                0         
_________________________________________________________________
dense_8 (Dense)              (None, 8)                 248     
______________________________________________________________
dense_9 (Dense)              (None, 40)                360       
_________________________________________________________________
B_output (Dense)             (None, 30)                1230      
oficial médico
fuente
Gracias por la respuesta, pero no creo que el código anterior funcione. Primero, cuando dices B = modelos. Modelo (entradas = A2, salidas = B3) te dará un error TypeError: las capas de entrada a a Modeldeben ser InputLayerobjetos. Entradas recibidas: Tensor. Además, como se mencionó anteriormente, utilicé API funcional para crear el Modelo A y el Modelo B por separado. Creo que la respuesta que estoy buscando podría tener que ver con la sección "Modelos de múltiples entradas y múltiples salidas" en la documentación de Keras que utiliza la función de concatenación (aunque no estoy completamente seguro).
Rkz
@Rkz: he editado la respuesta. Ahora funciona. Tenemos que usar "concatenar". En realidad, debe mencionar la entrada principal (A1) cuando desee definir el modelo "B".
moh
Gracias por su tiempo y ediciones. Descubrí la respuesta de la documentación de Keras (ver la siguiente respuesta). No requiero concatenar para mi pregunta.
Rkz
@Rkz: Mira la edición final, también muestro cómo compilar y ajustar el modelo.
moh