Fusione di due diversi modelli in Keras


26

Sto cercando di unire due modelli Keras in un unico modello e non sono in grado di farlo.

Ad esempio, nella figura allegata, vorrei recuperare il livello centrale della dimensione 8 e utilizzarlo come input per il livello (di nuovo dimensione 8) nel modello e quindi combinare sia il modello che il modello come un singolo modello.UN2B1BUNB

Sto usando il modulo funzionale per creare il Modello e il Modello indipendente. Come posso svolgere questo compito?UNB

Nota : è il livello di input del modello e è il livello di input del modello .UN1UNB1B

Guarda l'immagine

Risposte:


22

Ho capito la risposta alla mia domanda ed ecco il codice che si basa sulla risposta sopra.

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)

ed ecco la struttura di output che volevo:

inserisci qui la descrizione dell'immagine


Si noti che si sta non la fusione di due modelli (nel senso di keras Model) in quanto sopra, si sta fondendo strati.
gented

7

In Keras c'è un modo utile per definire un modello: usare l' API funzionale . Con l'API funzionale è possibile definire un grafico aciclico diretto di livelli, che consente di creare architetture completamente arbitrarie. Considerando il tuo esempio:

#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=??)

Quindi, questo è tutto! Puoi vedere il risultato come 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      

Grazie per la risposta, ma non credo che il codice sopra funzionerà. Innanzitutto, quando dici B = models.Model (input = A2, output = B3) ti darà un errore TypeError: i livelli di input in a Modeldevono essere InputLayeroggetti. Ingressi ricevuti: tensore. Inoltre, come accennato in precedenza, ho usato l'API funzionale per creare separatamente il Modello A e il Modello B. Penso che la risposta che sto cercando potrebbe avere a che fare con la sezione "Modelli multi-input e multi-output" nella documentazione di keras che utilizza la funzione concatenata (non del tutto sicura però).
Rkz,

@Rkz: ho modificato la risposta. Ora funziona. Dobbiamo usare "concatenare". In realtà, dovresti menzionare l'ingresso principale (A1) quando vuoi definire il modello "B".
Moh,

Grazie per il tuo tempo e le modifiche. Ho capito la risposta dalla documentazione di Keras (vedi la seguente risposta). Non ho richiesto il concatenato per la mia domanda.
Rkz,

@Rkz: guarda la modifica finale, mostro anche come compilare e adattare il modello.
Moh,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.