2016-06-27 3 views
3

Ich habe eine eher "einfache" Frage. Wenn ich ein Netzwerk mit dem funktionalen API erstellen:Wie kann ich ein Netzwerk nach der Initialisierung mithilfe der funktionalen API ändern?

layer2 = Dense(8, name="layer2")(layer1) 

und initialisieren es dann mit

model = Model(input=..., output=...) 

was kann ich tun, wenn ich danach Schichten ändern? Wenn ich eine neue Ebene .pop() und dann .append(), ändert sich nichts - der Ausgang bleibt gleich. Ich denke, das liegt daran, dass die Ausgabe noch vorher definiert wurde.

Das genaue Problem, das ich habe, ist das: Ich lade ein vortrainiertes AlexNet mit seinen Gewichten, aber dann würde ich gerne die letzte Dense Schicht für eine Klassifizierungsaufgabe von 8 Klassen statt 1000 umschulen. Dafür wollte ich fallen die letzten Ebenen und fügen Sie sie erneut hinzu.

Ich habe einen Workaround (Changing pretrained AlexNet classification in Keras) gefunden, aber ich denke, es sollte einen einfacheren Weg geben. Darüber hinaus denke ich nicht, dass meine Workaround mit einer GoogLeNet arbeiten wird, so würde ich wirklich gerne wissen (oder einen Hinweis), wie man mit dieser Situation umzugehen.

Antwort

7

Das Objekt Model hält nicht die Gewichte, die Schichten tun. Sie können die Gewichtungen für Ihr Modell mit model.load_weights() laden und dann eine neue Ebene basierend auf den Ebenen erstellen, ohne die Initialisierung der Ebenen zu verlieren.

Zum Beispiel:

model.load_weights(f) 
newClassificationLayer = Dense(8, activation='softmax')(lastCnnLayer) 
model = Model(input=oldInput, output=newClassificationLayer) 

Um sicherzustellen, dass alle anderen Schichten gefroren sind und Sie erhalten außer für die neue Schicht nicht ausgebildet, um Sie trainable=False für jede Schicht festlegen können Sie fixieren möchten. Zum Beispiel:

lastCnnLayer.trainable = False 
+0

Vielen Dank! Jetzt weiß ich, dass die Layer die Gewichte halten, das macht die Dinge viel einfacher! –

Verwandte Themen