wake-up-neo.com

Führen Sie zwei aufeinanderfolgende Modelle in Keras zusammen

Ich versuche 2 sequentielle Modelle in Keras zusammenzuführen. Hier ist der Code:

model1 = Sequential(layers=[
    # input layers and convolutional layers
    Conv1D(128, kernel_size=12, strides=4, padding='valid', activation='relu', input_shape=input_shape),
    MaxPooling1D(pool_size=6),
    Conv1D(256, kernel_size=12, strides=4, padding='valid', activation='relu'),
    MaxPooling1D(pool_size=6),
    Dropout(.5),

])

model2 = Sequential(layers=[
    # input layers and convolutional layers
    Conv1D(128, kernel_size=20, strides=5, padding='valid', activation='relu', input_shape=input_shape),
    MaxPooling1D(pool_size=5),
    Conv1D(256, kernel_size=20, strides=5, padding='valid', activation='relu'),
    MaxPooling1D(pool_size=5),
    Dropout(.5),

])

model = merge([model1, model2], mode = 'sum')
Flatten(),
Dense(256, activation='relu'),
Dropout(.5),
Dense(128, activation='relu'),
Dropout(.35),
# output layer
Dense(5, activation='softmax')
return model

Hier ist das Fehlerprotokoll:

Datei "/nics/d/home/dsawant/anaconda3/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py", Zeile 392, in is_keras_tensor raise ValueError ('Unerwartet eine Instanz vom Typ ' + str(type(x)) + '. 'ValueError: Es wurde unerwartet eine Instanz vom Typ <class 'keras.models.Sequential'> Gefunden. Es wurde eine symbolische Tensorinstanz erwartet.

Noch ein Log:

ValueError: Layer merge_1 wurde mit einer Eingabe aufgerufen, die kein symbolischer Tensor ist. Erhaltener Typ: Klasse 'keras.models.Sequential'. Volle Eingabe: [keras.models.Sequential-Objekt um 0x2b32d518a780, keras.models.Sequential-Objekt um 0x2b32d521ee80]. Alle Eingaben in die Ebene sollten Tensoren sein.

Wie kann ich diese 2 sequentiellen Modelle zusammenführen, die unterschiedliche Fenstergrößen verwenden und Funktionen wie 'max', 'sum' usw. auf sie anwenden?

14
Digvijay Sawant

Mit der funktionale API haben Sie alle Möglichkeiten.

Wenn Sie die funktionale API verwenden, müssen Sie die Ein- und Ausgaben im Auge behalten, anstatt nur Ebenen zu definieren.

Sie definieren eine Ebene und rufen dann die Ebene mit einem Eingabetensor auf, um den Ausgabetensor zu erhalten. Modelle und Ebenen können genauso aufgerufen werden.

Für die Zusammenführungsebene bevorzuge ich andere Zusammenführungsebenen, die intuitiver sind, wie beispielsweise Add(), Multiply() und Concatenate().

from keras.layers import *

mergedOut = Add()([model1.output,model2.output])
    #Add() -> creates a merge layer that sums the inputs
    #The second parentheses "calls" the layer with the output tensors of the two models
    #it will demand that both model1 and model2 have the same output shape

Dieselbe Idee gilt für alle folgenden Ebenen. Wir aktualisieren den Ausgabe-Tensor ständig, indem wir ihn jedem Layer zuweisen und eine neue Ausgabe erhalten (wenn wir daran interessiert wären, Verzweigungen zu erstellen, würden wir für jede Ausgabe von Interesse eine andere Variable verwenden, um sie zu verfolgen):

mergedOut = Flatten()(mergedOut)    
mergedOut = Dense(256, activation='relu')(mergedOut)
mergedOut = Dropout(.5)(mergedOut)
mergedOut = Dense(128, activation='relu')(mergedOut)
mergedOut = Dropout(.35)(mergedOut)

# output layer
mergedOut = Dense(5, activation='softmax')(mergedOut)

Nun, da wir den "Pfad" erstellt haben, ist es Zeit, den Model zu erstellen. Das Erstellen des Modells ist so, als würde man sagen, an welchen Eingangstensoren es beginnt und wo es endet:

from keras.models import Model

newModel = Model([model1.input,model2.input], mergedOut)
    #use lists if you want more than one input or output    

Da dieses Modell über zwei Eingänge verfügt, müssen Sie es mit zwei verschiedenen X_training - Variablen in einer Liste trainieren:

newModel.fit([X_train_1, X_train_2], Y_train, ....)    

Angenommen, Sie möchten nur eine Eingabe, und sowohl Modell1 als auch Modell2 verwenden dieselbe Eingabe.

Die funktionale API ermöglicht dies ganz einfach, indem ein Eingangstensor erstellt und den Modellen zugeführt wird (wir nennen die Modelle so, als wären sie Ebenen):

commonInput = Input(input_shape)

out1 = model1(commonInput)    
out2 = model2(commonInput)    

mergedOut = Add()([out1,out2])

In diesem Fall würde das Modell diese Eingabe berücksichtigen:

oneInputModel = Model(commonInput,mergedOut)
18
Daniel Möller