Zusammenführen von zwei verschiedenen Modellen in Keras

25

Ich versuche, zwei Keras-Modelle zu einem einzigen Modell zusammenzuführen, und dies kann ich nicht erreichen.

Zum Beispiel in der beigefügten Figur, würde Ich mag die mittlere Schicht holen die Dimension 8, und das als Eingabe an die Schicht B 1 (der Dimension 8 wieder) in Modell B und dann beiden Modelle kombinieren A und Modell B als ein einziges Modell.EIN2B1BEINB

Ich benutze das Funktionsmodul, um Modell und Modell B unabhängig voneinander zu erstellen . Wie kann ich diese Aufgabe erfüllen?EINB

Anmerkung : ist die Eingangsschicht zu Modell A und B 1 ist die Eingangsschicht zu Modell B .EIN1EINB1B

Siehe Bild

Rkz
quelle

Antworten:

22

Ich habe die Antwort auf meine Frage herausgefunden und hier ist der Code, der auf der obigen Antwort aufbaut.

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)

und hier ist die Ausgabestruktur, die ich wollte:

Bildbeschreibung hier eingeben

Rkz
quelle
Beachten Sie, dass Sie oben nicht zwei Modelle (im Sinne des Keras-Modells) zusammenführen, sondern Ebenen zusammenführen.
Gented
7

In Keras gibt es eine hilfreiche Methode zum Definieren eines Modells: Verwenden der funktionalen API . Mit der funktionalen API können Sie gerichtete azyklische Diagramme von Layern definieren, mit denen Sie völlig beliebige Architekturen erstellen können. Betrachten Sie Ihr Beispiel:

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

Das war's! Sie können das Ergebnis sehen durch 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
quelle
Danke für die Antwort, aber ich glaube nicht, dass der obige Code funktionieren wird. Wenn Sie zuerst B = models.Model (Eingänge = A2, Ausgänge = B3) sagen, wird ein Fehler ausgegeben. TypeError: Eingabeebenen für a Modelmüssen InputLayerObjekte sein. Empfangene Eingaben: Tensor. Wie bereits erwähnt, habe ich die funktionale API verwendet, um Modell A und Modell B separat zu erstellen. Ich denke, die Antwort, nach der ich suche, hat möglicherweise mit dem Abschnitt "Modelle mit mehreren Eingängen und Ausgängen" in der Keras-Dokumentation zu tun, in der die Verkettungsfunktion verwendet wird (allerdings nicht ganz sicher).
Rkz
@Rkz: Ich habe die Antwort bearbeitet. Es funktioniert jetzt. Wir müssen "verketten" verwenden. Eigentlich sollten Sie den Haupteingang (A1) erwähnen, wenn Sie das Modell "B" definieren möchten.
Moh
Vielen Dank für Ihre Zeit und Änderungen. Ich habe die Antwort aus der Keras-Dokumentation herausgefunden (siehe folgende Antwort). Ich habe keine Verkettung für meine Frage benötigt.
Rkz
@Rkz: Schau dir die endgültige Bearbeitung an, ich zeige auch, wie man das Modell kompiliert und anpasst.
Moh