Initialisiert model.compile () alle Gewichte und Verzerrungen in Keras (Tensorflow-Backend)?

74

Wenn ich mit dem Training eines Modells beginne, wird zuvor kein Modell gespeichert. Ich kann model.compile()sicher verwenden. Ich habe das Modell jetzt in einer h5Datei für die weitere Schulung mit gespeichert checkpoint.

Angenommen, ich möchte das Modell weiter trainieren. Ich bin an dieser Stelle verwirrt: Kann ich model.compile()hier verwenden? Und sollte es vor oder nach der model = load_model()Aussage platziert werden? Wenn model.compile()alle Gewichte und Vorurteile neu initialisiert werden, sollte ich sie vor die model = load_model()Anweisung stellen.

Nachdem ich einige Diskussionen entdeckt habe, scheint es mir model.compile()nur erforderlich zu sein, wenn ich zuvor kein Modell gespeichert habe. Sobald ich das Modell gespeichert habe, muss es nicht mehr verwendet werden model.compile(). Ist es wahr oder falsch? Und wenn ich mithilfe des trainierten Modells Vorhersagen treffen möchte, sollte ich diese model.compile()vor der Vorhersage verwenden?

Preetom Saha Arko
quelle

Antworten:

145

Wann verwenden?

Wenn Sie verwenden compile, muss es sicherlich danach sein load_model(). Schließlich benötigen Sie zum Kompilieren ein Modell. (PS: load_modelKompiliert das Modell automatisch mit dem Optimierer, der zusammen mit dem Modell gespeichert wurde.)

Was macht compiledas

Kompilieren definiert die Verlustfunktion , den Optimierer und die Metriken . Das ist alles.

Es hat nichts mit den Gewichten zu tun und Sie können ein Modell so oft kompilieren, wie Sie möchten, ohne Probleme mit vorab trainierten Gewichten zu verursachen.

Zum Trainieren benötigen Sie ein kompiliertes Modell (da das Training die Verlustfunktion und den Optimierer verwendet). Es ist jedoch nicht erforderlich, ein Modell für die Vorhersage zu erstellen.

Müssen Sie compile mehrmals verwenden?

Nur wenn:

  • Sie möchten eines davon ändern:
    • Verlustfunktion
    • Optimierer / Lernrate
    • Metriken
    • Die trainableEigenschaft einer Schicht
  • Sie haben ein Modell geladen (oder erstellt), das noch nicht kompiliert wurde. Oder Ihre Lade- / Speichermethode hat die vorherige Kompilierung nicht berücksichtigt.

Folgen des erneuten Kompilierens:

Wenn Sie ein Modell erneut kompilieren, verlieren Sie die Optimierungszustände .

Dies bedeutet, dass Ihr Training zu Beginn ein wenig leidet, bis es die Lernrate, die Impulse usw. anpasst. Die Gewichte werden jedoch absolut nicht beschädigt (es sei denn, Ihre anfängliche Lernrate ist natürlich so hoch wie beim ersten Training Schritt ändert wild die fein abgestimmten Gewichte).

Daniel Möller
quelle
1
Würde die Verwendung nach einer erneuten Kompilierung alle Optimierungszustände verlieren, selbst wenn Sie das Modell ursprünglich mit include_optimizer = True gespeichert haben?
Kawingkelvin
Sie müssen mit demselben Optimierer neu kompilieren ... aber ich bin nicht sicher, ob dies möglich ist.
Daniel Möller
1
@ DanielMöller: Betrifft es model.outputsdh nach der Kompilierung und vor der Kompilierung, was ist der Unterschied zwischen den beiden? Wäre auch toll, wenn Sie die Verwendung von compile=Falsein load_model(model, compile=False/True)Argument erklären könnten .
aspiring1
1
Nichts verändert sich. Beim Kompilieren werden die Funktionen "Optimierer" und "Verlust" für "Training" festgelegt, das ist alles. Wenn Sie ein Modell laden möchten und es nicht trainieren möchten, müssen Sie es nicht kompilieren. 1 - compile=True: Das Modell wird mit denselben Einstellungen wie gespeichert geladen und kompiliert. 2 - compile=Falseladen Sie nur das Modell ohne Optimierer.
Daniel Möller
1
Danke, dass Sie mich daran erinnert haben trainable. Das Einstellen von Gewichten ist jedoch überhaupt kein Problem.
Daniel Möller
25

Vergessen Sie nicht, dass Sie das Modell auch kompilieren müssen, nachdem Sie das trainableFlag einer Ebene geändert haben, z. B. wenn Sie ein Modell wie folgt optimieren möchten:

  1. Laden Sie das VGG-Modell ohne Top-Klassifikator

  2. alle Schichten einfrieren (dh trainable = False)

  3. füge oben einige Schichten hinzu

  4. Kompilieren und trainieren Sie das Modell anhand einiger Daten

  5. Entfrieren Sie einige der Schichten von VGG durch Einstellen trainable = True

  6. Kompilieren Sie das Modell erneut (VERGESSEN SIE DIESEN SCHRITT NICHT!)

  7. Trainieren Sie das Modell anhand einiger Daten

heute
quelle
Was wäre das Ergebnis, wenn das Modell nach dem Ändern des trainierbaren Flags einer Ebene nicht kompiliert würde?
Kake_Fisk
1
@Kake_Fisk Die Änderung wäre nicht wirksam, dh der Trainingsstatus der Ebene würde so bleiben, wie er vor dem letzten compileMethodenaufruf war.
heute