Fusion de deux modèles différents dans Keras


26

J'essaie de fusionner deux modèles Keras en un seul modèle et je ne peux pas y parvenir.

Par exemple, dans la figure ci-jointe, je voudrais récupérer la couche intermédiaire de dimension 8, et l'utiliser comme entrée pour la couche B 1 (de dimension 8 à nouveau) dans le modèle B , puis combiner le modèle A et le modèle B comme un modèle unique.UNE2B1BUNEB

J'utilise le module fonctionnel pour créer le modèle et le modèle B indépendamment. Comment puis-je accomplir cette tâche?UNEB

Remarque : est la couche d'entrée pour le modèle A et B 1 est la couche d'entrée du modèle B .UNE1UNEB1B

Voir l'image

Réponses:


22

J'ai trouvé la réponse à ma question et voici le code qui s'appuie sur la réponse ci-dessus.

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)

et voici la structure de sortie que je voulais:

entrez la description de l'image ici


Notez que vous ne fusionnez pas deux modèles (au sens de modèle de kéros) dans ce qui précède, vous fusionnez des calques.
— adouci

7

Dans Keras, il existe un moyen utile de définir un modèle: à l'aide de l' API fonctionnelle . Avec l'API fonctionnelle, vous pouvez définir des graphiques acycliques dirigés de couches, ce qui vous permet de construire des architectures complètement arbitraires. Considérant votre exemple:

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

Alors c'est tout! Vous pouvez voir le résultat par: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      

Merci pour la réponse, mais je ne pense pas que le code ci-dessus fonctionnera. Tout d'abord, lorsque vous dites B = models.Model (entrées = A2, sorties = B3), vous obtiendrez une erreur TypeError: les couches en entrée Modeldoivent être des InputLayerobjets. Entrées reçues: Tenseur. De plus, comme mentionné précédemment, j'ai utilisé l'API fonctionnelle pour créer séparément le modèle A et le modèle B. Je pense que la réponse que je cherche pourrait avoir à voir avec la section "Modèles multi-entrées et multi-sorties" dans la documentation des keras qui utilise la fonction de concaténation (pas tout à fait sûr cependant).
— Rkz

@Rkz: J'ai modifié la réponse. Ça fonctionne maintenant. Nous devons utiliser "concaténer". En fait, vous devez mentionner l'entrée principale (A1) lorsque vous souhaitez définir le modèle "B".
— moh

Merci pour votre temps et vos modifications. J'ai trouvé la réponse dans la documentation Keras (voir la réponse suivante). Je n'ai pas eu besoin de concaténer pour ma question.
— Rkz

@Rkz: Regardez l'édition finale, je montre également comment compiler et ajuster le modèle.
— moh
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.