Treten Sie der SIG TFX-Addons-Community bei und helfen Sie mit, TFX noch besser zu machen! SIG TFX-Addons beitreten

Häufig gestellte Fragen zur Tensorflow-Modellanalyse

Allgemein

Wird noch ein EvalSavedModel benötigt?

Zuvor erforderlich TFMA alle Metriken innerhalb eines tensorflow Graphen gespeichert werden , um eine besondere Verwendung EvalSavedModel . Verwendung Jetzt können Metriken außerhalb des TF Graphen berechnet werden beam.CombineFn Implementierungen.

Einige der wichtigsten Unterschiede sind:

  • Ein EvalSavedModel erfordert einen speziellen Export aus dem Trainer während einer Portion Modell kann ohne Änderungen an die Ausbildung Code erforderlich verwendet werden.
  • Wenn ein EvalSavedModel verwendet wird, hinzugefügt alle Metriken zum Zeitpunkt der Ausbildung sind bei der Auswertung automatisch zur Verfügung. Ohne eine EvalSavedModel müssen diese Kennzahlen wieder hinzugefügt werden.
    • Die Ausnahme von dieser Regel besteht darin, dass bei Verwendung eines Keras-Modells die Metriken auch automatisch hinzugefügt werden können, da keras die Metrikinformationen neben dem gespeicherten Modell speichert.

Kann TFMA sowohl mit In-Graph-Metriken als auch mit externen Metriken arbeiten?

TFMA ermöglicht die Verwendung eines hybriden Ansatzes, bei dem einige Metriken im Diagramm berechnet werden können, während andere außerhalb berechnet werden können. Wenn Sie derzeit einen haben EvalSavedModel dann können Sie weiterhin verwenden.

Es gibt zwei Fälle:

  1. Verwendung TFMA EvalSavedModel sowohl für die Merkmalsextraktion und metrischen Berechnungen , sondern auch zusätzliche Kombinator basierte Metriken hinzuzufügen. In diesem Fall würden Sie alle in-Graph - Metriken aus dem erhalten EvalSavedModel zusammen mit irgendwelchen zusätzlichen Metriken aus dem Kombinierer-basierten die möglicherweise zuvor nicht unterstützt wurden.
  2. Verwenden TFMA EvalSavedModel für Merkmal / Prognose Extraktion aber Verwendung Kombinierer-basierte Metriken für alle Metriken Berechnungen. Dieser Modus ist nützlich , wenn Feature Transformationen in der sind EvalSavedModel , dass Sie zum Schneiden verwenden möchten, sondern lieber alle metrischen Berechnungen außerhalb des Diagramms auszuführen.

Installieren

Welche Modelltypen werden unterstützt?

TFMA Stützen Keras Modelle, basierend auf generischen Modellen TF2 Signatur APIs sowie TF Schätzer basierte Modelle (obwohl je nach Anwendungsfall des Schätzer basierte Modelle erfordern eine EvalSavedModel verwendet werden).

Siehe get_started Leitfaden für die vollständige Liste der Modelltypen unterstützt und Beschränkungen.

Wie richte ich TFMA so ein, dass es mit einem nativen Keras-basierten Modell funktioniert?

Das Folgende ist eine Beispielkonfiguration für ein Keras-Modell basierend auf den folgenden Annahmen:

  • Gespeichert Modell ist für die Bedienung und verwendet die Signatur Namen serving_default (dies kann geändert werden mit model_specs[0].signature_name ).
  • Built in Metriken von model.compile(...) sollten bewertet werden (dies kann über deaktiviert werden options.include_default_metric im tfma.EvalConfig ).
from google.protobuf import text_format

config = text_format.Parse("""
  model_specs {
    label_key: "<label-key>"
    example_weight_key: "<example-weight-key>"
  }
  metrics_specs {
    # Add metrics here. For example:
    #  metrics { class_name: "ConfusionMatrixPlot" }
    #  metrics { class_name: "CalibrationPlot" }
  }
  slicing_specs {}
""", tfma.EvalConfig())

Siehe Metriken für weitere Informationen über andere Arten von Metriken , die konfiguriert werden können.

Wie richte ich TFMA so ein, dass es mit einem generischen TF2-Signaturen-basierten Modell funktioniert?

Im Folgenden finden Sie eine Beispielkonfiguration für ein generisches TF2-Modell. Unten signature_name ist der Name der spezifischen Signatur , die für die Auswertung verwendet werden soll.

from google.protobuf import text_format

config = text_format.Parse("""
  model_specs {
    signature_name: "<signature-name>"
    label_key: "<label-key>"
    example_weight_key: "<example-weight-key>"
  }
  metrics_specs {
    # Add metrics here. For example:
    #  metrics { class_name: "BinaryCrossentropy" }
    #  metrics { class_name: "ConfusionMatrixPlot" }
    #  metrics { class_name: "CalibrationPlot" }
  }
  slicing_specs {}
""", tfma.EvalConfig())

Siehe Metriken für weitere Informationen über andere Arten von Metriken , die konfiguriert werden können.

Wie richte ich TFMA so ein, dass es mit einem schätzerbasierten Modell funktioniert?

In diesem Fall gibt es drei Möglichkeiten.

Option 1: Serving-Modell verwenden

Wenn diese Option verwendet wird, werden alle während des Trainings hinzugefügten Metriken NICHT in die Bewertung einbezogen.

Im Folgenden ist ein Beispiel Config unter der Annahme serving_default wird die Signatur verwendete Name:

from google.protobuf import text_format

config = text_format.Parse("""
  model_specs {
    label_key: "<label-key>"
    example_weight_key: "<example-weight-key>"
  }
  metrics_specs {
    # Add metrics here.
  }
  slicing_specs {}
""", tfma.EvalConfig())

Siehe Metriken für weitere Informationen über andere Arten von Metriken , die konfiguriert werden können.

Option 2: Verwenden Sie EvalSavedModel zusammen mit zusätzlichen Combiner-basierten Metriken

In diesem Fall verwendet EvalSavedModel sowohl Merkmal / Prognose Extraktion und Auswertung sowie zusätzliche Kombinierer basierte Metriken hinzufügen.

Das Folgende ist eine Beispielkonfiguration:

from google.protobuf import text_format

config = text_format.Parse("""
  model_specs {
    signature_name: "eval"
  }
  metrics_specs {
    # Add metrics here.
  }
  slicing_specs {}
""", tfma.EvalConfig())

Siehe Metriken für weitere Informationen über andere Arten von Metriken , die konfiguriert und können EvalSavedModel für weitere Informationen die EvalSavedModel zum Einrichten.

Option 3: Verwenden Sie das EvalSavedModel-Modell nur für die Merkmals-/Vorhersageextraktion

Ähnlich wie bei Option (2), aber nur verwenden EvalSavedModel für Feature / Prognose Extraktion. Diese Option ist nützlich, wenn nur externe Metriken gewünscht werden, es aber Feature-Transformationen gibt, die Sie aufschneiden möchten. Ähnlich wie bei Option (1) werden alle während des Trainings hinzugefügten Metriken NICHT in die Bewertung einbezogen.

In diesem Fall ist die Konfiguration die gleiche wie oben nur include_default_metrics ist deaktiviert.

from google.protobuf import text_format

config = text_format.Parse("""
  model_specs {
    signature_name: "eval"
  }
  metrics_specs {
    # Add metrics here.
  }
  slicing_specs {}
  options {
    include_default_metrics { value: false }
  }
""", tfma.EvalConfig())

Siehe Metriken für weitere Informationen über andere Arten von Metriken , die konfiguriert und können EvalSavedModel für weitere Informationen die EvalSavedModel zum Einrichten.

Wie richte ich TFMA so ein, dass es mit einem Keras-Modell-zu-Schätzer-basierten Modell funktioniert?

Die keras model_to_estimator Setup ähnelt dem Schätzer confiugration. Es gibt jedoch einige Unterschiede, die spezifisch für die Funktionsweise des Modells zum Schätzer sind. Insbesondere gibt der Model-to-Esimtator seine Ausgaben in Form eines Diktats zurück, wobei der Diktatschlüssel der Name der letzten Ausgabeschicht im zugeordneten keras-Modell ist (wenn kein Name angegeben wird, wählt keras einen Standardnamen für Sie wie dense_1 oder output_1 ). Aus der TFMA-Perspektive ähnelt dieses Verhalten dem, was für ein Multi-Output-Modell ausgegeben würde, auch wenn das Modell zum Schätzer möglicherweise nur für ein einzelnes Modell gilt. Um diesen Unterschied zu berücksichtigen, ist ein zusätzlicher Schritt zum Einrichten des Ausgabenamens erforderlich. Als Schätzer gelten jedoch die gleichen drei Optionen.

Im Folgenden finden Sie ein Beispiel für die erforderlichen Änderungen an einer schätzerbasierten Konfiguration:

from google.protobuf import text_format

config = text_format.Parse("""
  ... as for estimator ...
  metrics_specs {
    output_names: ["<keras-output-layer>"]
    # Add metrics here.
  }
  ... as for estimator ...
""", tfma.EvalConfig())

Wie richte ich TFMA so ein, dass es mit vorberechneten (dh modellunabhängigen) Vorhersagen arbeitet? ( TFRecord und tf.Example )

Um zu konfigurieren TFMA der Arbeit mit vorher berechneten Voraussagen, der Standard - tfma.PredictExtractor muss deaktiviert werden und die tfma.InputExtractor müssen die Vorhersagen zu analysieren , zusammen mit den anderen Eingangsfunktionen konfiguriert werden. Dies wird erreicht , indem eine Konfiguration tfma.ModelSpec mit dem Namen der Funktionstaste für die Prognosen neben den Etikett und Gewichte verwendet.

Das Folgende ist ein Beispiel-Setup:

from google.protobuf import text_format

config = text_format.Parse("""
  model_specs {
    prediction_key: "<prediction-key>"
    label_key: "<label-key>"
    example_weight_key: "<example-weight-key>"
  }
  metrics_specs {
    # Add metrics here.
  }
  slicing_specs {}
""", tfma.EvalConfig())

Siehe Metriken für weitere Informationen über Metriken , die konfiguriert werden können.

Man beachte , dass ein altough tfma.ModelSpec wird ein Modell konfiguriert wird tatsächlich nicht verwendet wird (dh es gibt keine tfma.EvalSharedModel ). Der Aufruf zum Ausführen der Modellanalyse könnte wie folgt aussehen:

eval_result = tfma.run_model_analysis(
    eval_config=eval_config,
    # This assumes your data is a TFRecords file containing records in the
    # tf.train.Example format.
    data_location="/path/to/file/containing/tfrecords",
    output_path="/path/for/metrics_for_slice_proto")

Wie richte ich TFMA so ein, dass es mit vorberechneten (dh modellunabhängigen) Vorhersagen arbeitet? ( pd.DataFrame )

Für kleine Datenmengen , die im Speicher, eine Alternative zu einem passen TFRecord ist ein pandas.DataFrame s. TFMA auf betreiben pandas.DataFrame s die Verwendung tfma.analyze_raw_data API. Eine Erläuterung der tfma.MetricsSpec und tfma.SlicingSpec finden Sie in der Setup - Anleitung. Siehe Metriken für weitere Informationen über Metriken , die konfiguriert werden können.

Das Folgende ist ein Beispiel-Setup:

# Run in a Jupyter Notebook.

df_data = ...  # your pd.DataFrame

eval_config = text_format.Parse("""
  model_specs {
    label_key: 'label'
    prediction_key: 'prediction'
  }
  metrics_specs {
    metrics { class_name: "AUC" }
    metrics { class_name: "ConfusionMatrixPlot" }
  }
  slicing_specs {}
  slicing_specs {
    feature_keys: 'language'
  }
""", config.EvalConfig())

eval_result = tfma.analyze_raw_data(df_data, eval_config)

tfma.view.render_slicing_metrics(eval_result)

Messwerte

Welche Arten von Metriken werden unterstützt?

TFMA unterstützt eine Vielzahl von Metriken, darunter:

Werden Metriken von Multi-Output-Modellen unterstützt?

Jawohl. Siehe Metriken , um weitere Informationen zu führen.

Werden Metriken von mehreren Modellen unterstützt?

Jawohl. Siehe Metriken , um weitere Informationen zu führen.

Können die Metrikeinstellungen (Name usw.) angepasst werden?

Jawohl. Metrics Einstellungen können angepasst werden (zB Einstellung bestimmte Schwellenwerte, etc) durch Zusatz von config auf die Metrik - Konfiguration. Siehe Metriken Führungs mehr Details haben.

Werden benutzerdefinierte Messwerte unterstützt?

Jawohl. Entweder durch eine benutzerdefinierte Schreiben tf.keras.metrics.Metric Implementierung oder durch eine benutzerdefinierte schriftlich beam.CombineFn Implementierung. Die Metriken Führung hat weitere Details.

Welche Arten von Metriken werden nicht unterstützt?

Solange Ihre Metrik ein berechnet werden kann unter Verwendung von beam.CombineFn , gibt es keine Beschränkungen für die Art von Metriken, die auf Grundlage berechnet werden können tfma.metrics.Metric . Wenn mit einer Metrik aus arbeiten abgeleitet tf.keras.metrics.Metric dann die folgenden Kriterien erfüllt sein müssen:

  • Es sollte möglich sein, ausreichende Statistiken für die Metrik für jedes Beispiel unabhängig zu berechnen, dann diese ausreichenden Statistiken durch Addieren über alle Beispiele zu kombinieren und den Metrikwert allein aus diesen ausreichenden Statistiken zu bestimmen.
  • Aus Gründen der Genauigkeit sind beispielsweise "total korrekt" und "total Beispiele" ausreichend. Es ist möglich, diese beiden Zahlen für einzelne Beispiele zu berechnen und sie zu einer Gruppe von Beispielen zu addieren, um die richtigen Werte für diese Beispiele zu erhalten. Die endgültige Genauigkeit kann mit "total korrekt / total Beispiele" berechnet werden.

Add-ons

Kann ich TFMA verwenden, um Fairness oder Bias in meinem Modell zu bewerten?

TFMA umfasst eine FairnessIndicators Add-on, post-Export Metriken sieht die Auswirkungen der unbeabsichtigten Vorspannung in Klassifizierungsmodellen zu bewerten.

Anpassung

Was ist, wenn ich mehr Anpassung benötige?

TFMA ist sehr flexibile und ermöglicht es Ihnen , fast alle Teile der Pipeline mit benutzerdefinierten anpassen Extractors , Evaluators und / oder Writers . Diese abstrations werden ausführlicher in der discusssed Architektur Dokument.

Fehlerbehebung, Debugging und Hilfe erhalten

Warum stimmen MultiClassConfusionMatrix-Metriken nicht mit binarisierten ConfusionMatrix-Metriken überein?

Das sind eigentlich unterschiedliche Berechnungen. Die Binarisierung führt einen Vergleich für jede Klassen-ID unabhängig durch (dh die Vorhersage für jede Klasse wird separat mit den bereitgestellten Schwellenwerten verglichen). In diesem Fall ist es möglich, dass zwei oder mehr Klassen alle anzeigen, dass sie mit der Vorhersage übereinstimmten, weil ihr vorhergesagter Wert größer als der Schwellenwert war (dies wird bei niedrigeren Schwellenwerten noch deutlicher). Im Fall der Mehrklassen-Konfusionsmatrix gibt es immer noch nur einen echten vorhergesagten Wert, der entweder mit dem tatsächlichen Wert übereinstimmt oder nicht. Der Schwellenwert wird nur verwendet, um zu erzwingen, dass eine Vorhersage mit keiner Klasse übereinstimmt, wenn sie kleiner als der Schwellenwert ist. Je höher der Schwellenwert, desto schwieriger kann die Vorhersage einer binarisierten Klasse übereinstimmen. Je niedriger der Schwellenwert ist, desto leichter können die Vorhersagen einer binarisierten Klasse übereinstimmen. Das bedeutet, dass bei Schwellenwerten > 0,5 die binarisierten Werte und die Mehrklassen-Matrixwerte näher aneinander liegen und bei Schwellenwerten < 0,5 weiter auseinander liegen.

Nehmen wir zum Beispiel an, wir haben 10 Klassen, in denen Klasse 2 mit einer Wahrscheinlichkeit von 0,8 vorhergesagt wurde, aber die tatsächliche Klasse war Klasse 1 mit einer Wahrscheinlichkeit von 0,15. Wenn Sie Klasse 1 binarisieren und einen Schwellenwert von 0,1 verwenden, wird Klasse 1 als korrekt angesehen (0,15 > 0,1), sodass sie als TP gezählt wird 0.1) und da Klasse 1 die eigentliche war, wird dies als FN gewertet. Da bei niedrigeren Schwellenwerten mehr Werte als positiv angesehen werden, gibt es im Allgemeinen höhere TP- und FP-Zählungen für die binarisierte Konfusionsmatrix als für die Mehrklassen-Konfusionsmatrix und ähnlich niedrigere TN und FN.

Im Folgenden finden Sie ein Beispiel für beobachtete Unterschiede zwischen MultiClassConfusionMatrixAtThresholds und den entsprechenden Zählern aus der Binarisierung einer der Klassen.

MultiClassConfusionMatrixAtThresholds vs. binarisiert

Warum haben meine Precision@1- und Recall@1-Metriken denselben Wert?

Bei einem Top-k-Wert von 1 sind Präzision und Recall dasselbe. Präzision gleich TP / (TP + FP) und Rückruf gleich TP / (TP + FN) . Die Top-Vorhersage ist immer positiv und stimmt entweder mit dem Label überein oder nicht. Mit anderen Worten, mit N Beispielen, TP + FP = N . Wenn jedoch das Etikett nicht die Top-Vorhersage überein, dann ist dies auch eine Nicht-Top - k - Vorhersage impliziert wurde angepasst und mit Top-k auf 1 gesetzt, werden alle Nicht-Top-1 Prognosen werden 0. Diese FN implizieren sein muss (N - TP) oder N = TP + FN . Das Endergebnis ist , precision@1 = TP / N = recall@1 . Beachten Sie, dass dies nur gilt, wenn es ein einzelnes Etikett pro Beispiel gibt, nicht für mehrere Etiketts.

Warum sind meine Metriken mean_label und mean_prediction immer 0,5?

Dies wird höchstwahrscheinlich dadurch verursacht, dass die Metriken für ein binäres Klassifizierungsproblem konfiguriert sind, das Modell jedoch Wahrscheinlichkeiten für beide Klassen anstatt nur für eine ausgibt. Dies ist üblich , wenn tensorflow Klassifikation API verwendet wird. Die Lösung besteht darin, die Klasse auszuwählen, auf der die Vorhersagen basieren sollen, und dann diese Klasse zu binarisieren. Beispielsweise:

eval_config = text_format.Parse("""
  ...
  metrics_specs {
    binarize { class_ids: { values: [0] } }
    metrics { class_name: "MeanLabel" }
    metrics { class_name: "MeanPrediction" }
    ...
  }
  ...
""", config.EvalConfig())

Wie interpretiert man das MultiLabelConfusionMatrixPlot?

Bei einer speziellen Markierung, die MultiLabelConfusionMatrixPlot (und zugehörige MultiLabelConfusionMatrix ) kann verwendet werden , um die Ergebnisse anderer Labels und die Vorhersagen zu vergleichen , wenn das gewählte Etikett tatsächlich wahr ist . Zum Beispiel, sagen sie , dass wir drei Klassen haben bird , plane , und Übermenschen und wir klassifizieren Bilder , um anzuzeigen , wenn sie eine oder mehr von jedem dieser Klassen enthalten. superman Die MultiLabelConfusionMatrix das kartesische Produkt jeder tatsächlichen Klasse gegeneinander Klasse berechnen (die vorhergesagte Klasse genannt). Beachten Sie, dass während der Paarung ist (actual, predicted) , die predicted hat Klasse nicht unbedingt eine positive Vorhersage implizieren, es stellt lediglich die vorhergesagte Spalte in der aktuellen vs vorhergesagt Matrix. Nehmen wir zum Beispiel an, wir haben die folgenden Matrizen berechnet:

   (bird, bird)         ->    { tp: 6, fp: 0, fn: 2, tn: 0}
   (bird, plane)        ->    { tp: 2, fp: 2, fn: 2, tn: 2}
   (bird, superman)     ->    { tp: 1, fp: 1, fn: 4, tn: 2}
   (plane, bird)        ->    { tp: 3, fp: 1, fn: 1, tn: 3}
   (plane, plane)       ->    { tp: 4, fp: 0, fn: 4, tn: 0}
   (plane, superman)    ->    { tp: 1, fp: 3, fn: 3, tn: 1}
   (superman, bird)     ->    { tp: 3, fp: 2, fn: 2, tn: 2}
   (superman, plane)    ->    { tp: 2, fp: 3, fn: 2, tn: 2}
   (superman, superman) ->    { tp: 4, fp: 0, fn: 5, tn: 0}

   num_examples: 20

Die MultiLabelConfusionMatrixPlot hat drei Möglichkeiten , diese Daten anzuzeigen. In allen Fällen wird die Tabelle zeilenweise aus Sicht der jeweiligen Klasse gelesen.

1) Gesamtvorhersageanzahl

In diesem Fall für eine bestimmte Zeile (dh tatsächliche Klasse) , was die waren TP + FP zählt für die anderen Klassen. Für die obigen Zählungen würde unsere Anzeige wie folgt aussehen:

Vorhergesagter Vogel Vorhergesagtes Flugzeug Vorhergesagter Superman
Tatsächlicher Vogel 6 4 2
Tatsächliche Ebene 4 4 4
Tatsächlicher Übermensch 5 5 4

Wenn tatsächlich die Bilder ein enthaltenes bird wir richtig vorhergesagt 6 von ihnen. Zur gleichen Zeit auch wir vorhergesagt plane (entweder richtig oder falsch) 4 - mal und Übermenschen (entweder richtig oder falsch) 2 mal. superman

2) Falscher Vorhersagezähler

In diesem Fall für eine bestimmte Zeile (dh tatsächliche Klasse) , was die waren FP zählt für die anderen Klassen. Für die obigen Zählungen würde unsere Anzeige wie folgt aussehen:

Vorhergesagter Vogel Vorhergesagtes Flugzeug Vorhergesagter Superman
Tatsächlicher Vogel 0 2 1
Tatsächliche Ebene 1 0 3
Tatsächlicher Übermensch 2 3 0

Wenn tatsächlich die Bilder ein enthaltenes bird wir falsch vorhergesagt plane 2 mal und superman 1 mal.

3) Falsch-Negativ-Zählung

In diesem Fall für eine bestimmte Zeile (dh tatsächliche Klasse) , was die waren FN zählt für die anderen Klassen. Für die obigen Zählungen würde unsere Anzeige wie folgt aussehen:

Vorhergesagter Vogel Vorhergesagtes Flugzeug Vorhergesagter Superman
Tatsächlicher Vogel 2 2 4
Tatsächliche Ebene 1 4 3
Tatsächlicher Übermensch 2 2 5

Wenn tatsächlich die Bilder ein enthaltenes bird haben wir versagt es 2 mal vorherzusagen. Zur gleichen Zeit, haben wir versagt vorherzusagen plane 2 mal und Übermenschen 4 mal. superman

Warum erhalte ich eine Fehlermeldung, dass der Vorhersageschlüssel nicht gefunden wurde?

Einige Modelle geben ihre Vorhersage in Form eines Wörterbuchs aus. Zum Beispiel gibt einen TF - Schätzer für binäres Klassifikationsproblem ein Wörterbuch enthält probabilities , class_ids usw. In den meisten Fällen TFMA Voreinstellungen für die Suche nach commomly verwendeten Schlüsselnamen , zB predictions , probabilities etc. Allerdings, wenn Ihr Modell es sehr angepasst ist , kann Ausgabeschlüssel unter Namen, die TFMA nicht bekannt sind. In diesen Fällen eine prediciton_key muss Einstellung zu dem hinzugefügt wird tfma.ModelSpec den Namen des Schlüssels zu identifizieren , die Ausgabe unter gespeichert.