2017-09-09 4 views
2

ich von .json und .hdf5 Dateien ein Keras Modell laden. Als ich model.evaluate() aufrufen, gibt es eine Fehlermeldung:Need To Keras Modell Kompilieren Bevor `model.evaluate()`

You must compile a model before training/testing. Use `model.compile(optimizer, loss)

Warum muss ich evaluate() laufen kompilieren?

Hinzufügen, das Modell kann predict() ohne Problem übergeben werden.

+0

Laden Sie das Modell mit 'load_weights()'? __HDF5__ Format wird verwendet, um die Gewichtungen streng zu speichern. Könnten Sie den Code trotzdem bereitstellen? Vielen Dank. –

+0

Welche Keras Version verwendest du? –

Antwort

3

Weil evaluate die Verlustfunktion berechnet und die Metriken.

Sie haben keine von ihnen, bis Sie das Modell kompilieren. Sie sind Parameter an die Kompilierung-Methode:

model.compile(optimizer=..., loss=..., metrics=...) 

Auf der anderen Seite, predict nicht metrisch oder Verlust nicht bewerten, es geht nur um die Eingangsdaten durch das Modell und bekommt seinen Ausgang.

Sie brauchen den "Verlust" auch für das Training, so dass Sie nicht ohne Kompilieren trainieren können. Und Sie können ein Modell beliebig oft kompilieren und sogar die Parameter ändern.


Die Ausgänge und die Verlustfunktion:

Die Ausgänge sind abhängig von Modell auf es mit Gewichten definiert ist. Das ist automatisch und Sie können predict von jedem Modell, auch ohne Training. Jedes Modell in Keras wird bereits mit Gewichten geboren (entweder von Ihnen initialisiert oder zufällig initialisiert)

Sie geben etwas ein, das Modell berechnet die Ausgabe. Am Ende von allem, das ist alles was zählt. Ein gutes Modell hat korrekte Gewichte und gibt Dinge korrekt aus.

Aber bevor Sie zu diesem Zweck kommen, muss Ihr Modell trainiert werden.

Jetzt nimmt die Verlustfunktion die aktuelle Ausgabe und vergleicht sie mit dem erwarteten/wahren Ergebnis. Es ist eine Funktion, die minimiert werden soll. Je geringer der Verlust, desto näher sind Ihre Ergebnisse dem erwarteten. Dies ist die Funktion, von der die Ableitungen genommen werden, so dass der Backpropagation-Algorithmus die Gewichte aktualisieren kann.

Die Verlustfunktion ist nicht für den endgültigen Zweck des Modells nützlich, aber sie ist für das Training erforderlich. Das ist wahrscheinlich der Grund, warum Sie Modelle ohne Verlustfunktionen haben können (und folglich gibt es keine Möglichkeit, sie zu bewerten).

+0

würde es Ihnen etwas ausmachen zu erklären, warum in https://github.com/JihongJu/keras-fcn/blob/master/voc2011/infer.py, musste nicht kompiliert werden, um model.evaluate aufrufen? Hat load_model (fcn_vgg16_weights.h5) irgendwie die Verlustfunktion enthalten? – bhomass

+0

Leider konnte ich nie ein Modell in Keras speichern und laden, ich weiß nicht was passiert. Für mich ist es total buggy und ich kann nur Gewichte sparen. Aber theoretisch ist es ja möglich, ein Modell mit seiner Verlustfunktion und den Optimiererzuständen zu speichern. Aber das bedeutet nicht, dass jedes gespeicherte Modell so gespeichert wird. –

+0

@bhomass Ja, die 'load_model()' Funktion hat tatsächlich ein 'Modell.compile() 'rufe innerhalb davon auf. Solange das Modell vor dem Speichern kompiliert wurde, wird es beim Laden automatisch neu kompiliert. –