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

Rkz
la source

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

Rkz
la source
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      
moh
la source
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