2017-10-31 6 views
0

Ich habe zwei verschiedene Arten von Daten (Bild-Volumen und Koordinaten) und ich möchte ein Faltungs neuronales Netzwerk auf die Bild-Volumendaten verwenden und dann möchte ich einige zusätzliche hinzufügen Information (dh die Koordinaten des Volumens).Merge zwei verschiedene Deep Learning-Modelle in Keras

Unabhängig davon sollte dies eine ziemlich solide Vorhersage für meine Funktion erstellen. Wie kann ich das mit Keras umsetzen?

Die einzigen Antworten, die ich online gefunden habe, sind entweder mehrdeutig oder verwenden die veralteten Methoden, die ich arbeiten muss. Aber ich würde das gerne mit der aktuellen API implementieren, so dass ich das Modell leichter für die spätere Verwendung speichern kann.

model = Sequential() 
model.add(Conv3D(32, kernel_size=(3, 3, 3), 
       activation='relu', 
       input_shape=input_shape)) 
model.add(Conv3D(64, (3, 3, 3), activation='relu')) 
model.add(MaxPooling3D(pool_size=(2, 2, 2))) 
model.add(Dropout(0.25)) 
model.add(Flatten()) 
print(model.output_shape) 

# The additional data (the coordinates x,y,z) 
extra = Sequential() 
extra.add(Activation('sigmoid', input_shape=(3,))) 
print(extra.output_shape) 

merged = Concatenate([model, extra]) 

# New model should encompass the outputs of the convolutional network and the coordinates that have been merged. 
# But how? 
new_model = Sequential() 
new_model.add(Dense(128, activation='relu')) 
new_model.add(Dropout(0.8)) 
new_model.add(Dense(32, activation='sigmoid')) 
new_model.add(Dense(num_classes, activation='softmax')) 

new_model.compile(loss=keras.losses.categorical_crossentropy, 
       optimizer=keras.optimizers.Adadelta(), 
       metrics=['accuracy']) 

Antwort

1

Sequential Modelle werden für die Erstellung von Modellen mit Niederlassungen nicht geeignet.

Sie können die beiden unabhängigen Modelle als Sequential-Modelle verwenden, aber ab Concatenate sollten Sie mit der Verwendung der funktionalen Model-API beginnen.

Die Idee ist, die Ausgangstensoren der beiden Modelle zu erhalten und sie in andere Schichten zu führen, um neue Ausgangstensoren zu erhalten.

Also, wenn man bedenkt Sie haben model und extra:

mergedOutput = Concatenate()([model.output, extra.output]) 

Dieser mergetOutput ein Tensor ist. Sie können entweder den letzten Teil des Modells mit diesem Tensor erstellen oder den letzten Teil unabhängig davon erstellen und auf diesem Tensor aufrufen. Der zweite Ansatz kann gut sein, wenn Sie jedes Modell separat trainieren wollen (scheint nicht Ihr Fall zu sein).

nun das neue Modell als funktionales API-Modell zu erstellen:

out = Dense(128, activation='relu')(mergetOutput) 
out = Dropout(0.8)(out) 
out = Dense(32, activation='sigmoid')(out) 
out = Dense(num_classes, activation='softmax')(out) 

new_model = Model(
    [model.input, extra.input], #model with two input tensors 
    out       #and one output tensor 
) 

Ein einfacher Ansatz ist es, alle drei Modelle nehmen Sie bereits erstellt haben und nutzen sie, um ein kombiniertes Modell zu erstellen:

model = Sequential() #your first model 
extra = Sequential() #your second model  
new_model = Sequential() #all these three exactly as you did 

#in this case, you just need to add an input shape to new_model, compatible with the concatenated output of the previous models. 
new_model.add(FirstNewModelLayer(...,input_shape=(someValue,))) 

Begleiten sie sie wie folgt aus:

mergedOutput = Concatenate()([model.output, extra.output]) 
finalOutput = new_model(mergedOutput)  

fullModel = Model([model.input,extra.input],finalOutput) 
+0

Vielen Dank für die Erläuterung des Beispiels in der API. Ich schätze es! – JahKnows

+0

Noch eine Frage, wie kann ich diese Art von Modell speichern und laden. Reicht es aus, nur das FullModel zu speichern? – JahKnows

+0

Leider konnte ich noch nie ein Modell in Keras speichern. Ich weiß nicht warum. Was ich mache ist 'fullModel.save_weights (Dateiname)' und 'fullModel.load_weights (Dateiname)'. Dies ist ausreichend, um ein gelerntes Modell zu speichern und zu laden, kann jedoch Schwierigkeiten verursachen, wenn Sie das Training erneut beginnen möchten (der Optimierer geht dabei verloren und muss sich während des Trainings neu einstellen). –

0

über die funktionale API von Keras (https://keras.io/models/model/). Sie können in Keras Ebenen nur auf Ihre verknüpfte Ebene anwenden. Die funktionale API funktioniert so. Sie haben einen Tensor und wenden eine Funktion auf diesen Tensor an. Dann wird dies rekursiv ausgewertet. Da in Keras so gut wie alles ein Tensor ist, funktioniert das ganz gut.

Ein Beispiel hierfür ist:

activation = Dense(128, activation='relu')(merged)