Dołącz do TensorFlow na Google I/O, 11-12 maja Zarejestruj się teraz

Analiza modelu Tensorflow — często zadawane pytania

Ogólny

Czy EvalSavedModel jest nadal wymagany?

Wcześniej TFMA wszystkie wymagane dane mają być przechowywane w tensorflow wykresu przy użyciu specjalnego EvalSavedModel . Teraz Metryki mogą być obliczane poza wykresem TF stosując beam.CombineFn implementacje.

Niektóre z głównych różnic to:

  • EvalSavedModel wymaga specjalnego eksport z trenerem podczas gdy służąc model może być używany bez żadnych zmian wymaganych do kodu treningowej.
  • Gdy EvalSavedModel służy, są automatycznie dostępne w momencie oceny wszelkich metryki dodane na czas szkolenia. Bez EvalSavedModel te dane muszą być ponownie dodany.
    • Wyjątkiem od tej reguły jest to, że jeśli używany jest model Keras, metryki mogą być również dodawane automatycznie, ponieważ Keras zapisuje informacje o metryce obok zapisanego modelu.

Czy TFMA może współpracować zarówno z metrykami w wykresie, jak i metrykami zewnętrznymi?

TFMA pozwala na zastosowanie podejścia hybrydowego, w którym niektóre metryki można obliczyć na wykresie, podczas gdy inne można obliczyć na zewnątrz. Jeśli obecnie mają EvalSavedModel następnie można nadal z niego korzystać.

Istnieją dwa przypadki:

  1. Zastosowanie TFMA EvalSavedModel zarówno do ekstrakcji cech i obliczeń metrycznych, ale również dodać dodatkowe dane sumator oparte. W tym przypadku będzie można uzyskać wszystkie dane w-wykres z EvalSavedModel wraz z dodatkowymi danymi z sumator opartych które mogą nie zostały wcześniej obsługiwanych.
  2. Zastosowanie TFMA EvalSavedModel dla funkcji ekstrakcji / prognoza ale korzystać sumator wskaźników opartych o wszystkie dane obliczeń. Tryb ten jest przydatny, jeśli istnieją przekształcenia funkcją dostępną w EvalSavedModel które chcesz użyć do krojenia, ale wolą, aby wykonać wszystkie obliczenia metryczne poza wykresem.

Ustawiać

Jakie typy modeli są obsługiwane?

TFMA podpory Keras modele, modele oparte na ogólnych API podpisu TF2, jak również modeli opartych TF estymatora (choć w zależności od przypadku użycia estymator modele oparte mogą wymagać EvalSavedModel być używane).

Zobacz get_started przewodnik po pełną listę obsługiwanych typów modeli i wszelkich ograniczeń.

Jak skonfigurować TFMA do pracy z natywnym modelem Keras?

Poniżej znajduje się przykładowa konfiguracja modelu Keras oparta na następujących założeniach:

  • Zapisane model jest do serwowania i używa nazwy podpis serving_default (można to zmienić przy użyciu model_specs[0].signature_name ).
  • Zbudowany w metryki z model.compile(...) powinny być oceniane (to może być wyłączone przez options.include_default_metric w 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())

Zobacz metryki , aby uzyskać więcej informacji na temat innych rodzajów danych, które mogą być skonfigurowane.

Jak skonfigurować TFMA do pracy z ogólnym modelem opartym na sygnaturach TF2?

Poniżej znajduje się przykładowa konfiguracja ogólnego modelu TF2. Poniżej signature_name to nazwa konkretnego podpisu, które powinny być wykorzystane do oceny.

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())

Zobacz metryki , aby uzyskać więcej informacji na temat innych rodzajów danych, które mogą być skonfigurowane.

Jak skonfigurować TFMA do pracy z modelem opartym na estymatorze?

W tym przypadku są trzy możliwości.

Opcja 1: użyj modelu serwowania

Jeśli ta opcja zostanie użyta, wszelkie metryki dodane podczas szkolenia NIE będą uwzględniane w ocenie.

Poniżej znajduje się przykład config zakładając serving_default to nazwa używana podpis:

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())

Zobacz metryki , aby uzyskać więcej informacji na temat innych rodzajów danych, które mogą być skonfigurowane.

Opcja 2: Użyj EvalSavedModel wraz z dodatkowymi metrykami opartymi na łączeniach

W tym przypadku należy użyć EvalSavedModel zarówno dla funkcji ekstrakcji / przewidywania i oceny, a także dodać metryki oparte dodatkowy sumator.

Oto przykładowa konfiguracja:

from google.protobuf import text_format

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

Zobacz metryki , aby uzyskać więcej informacji na temat innych rodzajów danych, które mogą być skonfigurowane i EvalSavedModel uzyskać więcej informacji na temat konfigurowania EvalSavedModel.

Opcja 3: Użyj modelu EvalSavedModel tylko do wyodrębniania cech/prognoz

Podobny do wariantu (2), ale użyć tylko EvalSavedModel ekstrakcji funkcja / uzupełniania. Ta opcja jest przydatna, jeśli wymagane są tylko metryki zewnętrzne, ale istnieją przekształcenia funkcji, które chcesz podzielić. Podobnie jak w przypadku opcji (1), wszelkie metryki dodane podczas szkolenia NIE będą uwzględniane w ocenie.

W tym przypadku konfiguracja jest taka sama jak powyżej tylko include_default_metrics jest wyłączona.

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())

Zobacz metryki , aby uzyskać więcej informacji na temat innych rodzajów danych, które mogą być skonfigurowane i EvalSavedModel uzyskać więcej informacji na temat konfigurowania EvalSavedModel.

Jak skonfigurować TFMA do pracy z modelem Keras opartym na modelu estymatora?

Keras model_to_estimator konfiguracja jest podobna do confiugration estymatora. Istnieje jednak kilka różnic dotyczących sposobu działania modelu z estymatorem. W szczególności, model-esimtator zwraca swoje dane wyjściowe w postaci dict gdzie klucz dict jest nazwą ostatniej warstwy danych wyjściowych w powiązanym modelu Keras (jeśli nie podano nazwy, Keras wybierze nazwę domyślną takie jak dense_1 lub output_1 ). Z perspektywy TFMA to zachowanie jest podobne do tego, co zostałoby wyprowadzone dla modelu z wieloma wyjściami, mimo że model do estymatora może dotyczyć tylko jednego modelu. Aby uwzględnić tę różnicę, wymagany jest dodatkowy krok w celu ustawienia nazwy danych wyjściowych. Jednak te same trzy opcje mają zastosowanie jako estymator.

Poniżej znajduje się przykład zmian wymaganych w konfiguracji opartej na estymatorze:

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())

Jak skonfigurować TFMA do pracy ze wstępnie obliczonymi (tj. niezależnymi od modelu) prognozami? ( TFRecord i tf.Example )

W celu skonfigurowania TFMA pracować z wstępnie obliczona przewidywaniami, domyślnie tfma.PredictExtractor musi być wyłączony, a tfma.InputExtractor musi być skonfigurowany do analizowania prognoz wraz z innymi funkcjami wejściowymi. Osiąga się to poprzez skonfigurowanie tfma.ModelSpec z nazwą kluczowym elementem wykorzystywanym do przewidywania obok etykiet i wagi.

Oto przykładowa konfiguracja:

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())

Zobacz metryki Więcej informacji na temat danych, które mogą być skonfigurowane.

Zauważ, że altough tfma.ModelSpec jest skonfigurowany model jest faktycznie nieużytkowane (czyli nie ma tfma.EvalSharedModel ). Wezwanie do uruchomienia analizy modelu może wyglądać następująco:

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")

Jak skonfigurować TFMA do pracy ze wstępnie obliczonymi (tj. niezależnymi od modelu) prognozami? ( pd.DataFrame )

Dla małych zbiorów danych, które mieszczą się w pamięci, jako alternatywa do TFRecord jest pandas.DataFrame S. TFMA może działać na pandas.DataFrame s używając tfma.analyze_raw_data API. Dla wyjaśnienia tfma.MetricsSpec i tfma.SlicingSpec , zobacz setup guide. Zobacz metryki Więcej informacji na temat danych, które mogą być skonfigurowane.

Oto przykładowa konfiguracja:

# 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)

Metryka

Jakie typy metryk są obsługiwane?

TFMA obsługuje szeroką gamę wskaźników, w tym:

Czy obsługiwane są metryki z modeli wielowyjściowych?

Tak. Zobacz metryki przewodnik po więcej szczegółów.

Czy obsługiwane są metryki z wielu modeli?

Tak. Zobacz metryki przewodnik po więcej szczegółów.

Czy można dostosować ustawienia metryki (nazwę itp.)?

Tak. Metryki ustawienia można dostosować (np progów określonych ustawień, itp) poprzez dodanie config ustawienia konfiguracji metrycznej. Zobacz metryki przewodnik ma więcej szczegółów.

Czy obsługiwane są metryki niestandardowe?

Tak. Albo pisząc niestandardowy tf.keras.metrics.Metric wdrożenia lub pisząc niestandardowy beam.CombineFn realizację. Metryki przewodnik ma więcej szczegółów.

Jakie rodzaje metryk nie są obsługiwane?

Tak długo jak metryka może być obliczona przy użyciu beam.CombineFn istnieją żadne ograniczenia dotyczące typów danych, które mogą być obliczane na podstawie tfma.metrics.Metric . W przypadku pracy z metryki pochodzące z tf.keras.metrics.Metric następujące kryteria muszą być spełnione:

  • Powinna istnieć możliwość niezależnego obliczenia wystarczających statystyk dla metryki w każdym przykładzie, a następnie połączenia tych wystarczających statystyk przez dodanie ich we wszystkich przykładach i określenia wartości metryki wyłącznie na podstawie tych wystarczających statystyk.
  • Na przykład, dla dokładności wystarczające statystyki to „całkowita poprawność” i „całkowita liczba przykładów”. Możliwe jest obliczenie tych dwóch liczb dla poszczególnych przykładów i dodanie ich do grupy przykładów, aby uzyskać właściwe wartości dla tych przykładów. Ostateczną dokładność można obliczyć za pomocą „całkowicie poprawne/całkowite przykłady”.

Dodatki

Czy mogę użyć TFMA do oceny uczciwości lub stronniczości w moim modelu?

TFMA zawiera FairnessIndicators dodatek, który zapewnia metryki poeksportowego oceny skutków niezamierzonego błędu w modelach klasyfikacyjnych.

Dostosowywanie

A jeśli potrzebuję większej personalizacji?

TFMA jest bardzo elastyczna i pozwala na dostosowanie prawie wszystkie części rurociągu przy użyciu niestandardowych Extractors , Evaluators i / lub Writers . Te abstrations są discusssed bardziej szczegółowo w architekturze dokumentu.

Rozwiązywanie problemów, debugowanie i uzyskiwanie pomocy

Dlaczego metryki MultiClassConfusionMatrix nie pasują do zbinaryzowanych metryk ConfusionMatrix

To są właściwie różne obliczenia. Binaryzacja wykonuje porównanie dla każdego identyfikatora klasy niezależnie (tj. prognoza dla każdej klasy jest porównywana oddzielnie z podanymi progami). W tym przypadku możliwe jest, aby dwie lub więcej klas wszystkie wskazywały, że pasowały do ​​prognozy, ponieważ ich przewidywana wartość była większa niż próg (będzie to jeszcze bardziej widoczne przy niższych progach). W przypadku wieloklasowej macierzy pomyłek nadal istnieje tylko jedna prawdziwa przewidywana wartość, która albo pasuje do rzeczywistej wartości, albo nie. Próg jest używany tylko do wymuszenia, aby prognoza nie pasowała do żadnej klasy, jeśli jest mniejsza niż próg. Im wyższy próg, tym trudniej dopasować prognozę zbinaryzowanej klasy. Podobnie im niższy próg, tym łatwiej jest dopasować prognozy zbinaryzowanej klasy. Oznacza to, że przy progach > 0,5 wartości zbinaryzowane i wieloklasowe wartości macierzy będą bliższe, a przy progach < 0,5 będą bardziej od siebie oddalone.

Na przykład, powiedzmy, że mamy 10 klas, w których przewidziano klasę 2 z prawdopodobieństwem 0,8, ale rzeczywista klasa to klasa 1, która miała prawdopodobieństwo 0,15. Jeśli zbinaryzujesz klasę 1 i użyjesz progu 0,1, wtedy klasa 1 zostanie uznana za poprawną (0,15 > 0,1), więc będzie liczona jako TP. Jednak w przypadku wieloklasowym klasa 2 zostanie uznana za poprawną (0,8 > 0.1), a ponieważ klasa 1 była rzeczywista, będzie to liczone jako FN. Ponieważ przy niższych progach więcej wartości będzie uważanych za dodatnie, na ogół będą wyższe zliczenia TP i FP dla zbinaryzowanej macierzy pomyłek niż dla wieloklasowej macierzy pomyłek i podobnie niższe TN i FN.

Poniżej znajduje się przykład zaobserwowanych różnic między MultiClassConfusionMatrixAtThresholds a odpowiednimi licznikami z binaryzacji jednej z klas.

MultiClassConfusionMatrixAtThresholds vs Binarized

Dlaczego moje metryki precyzja@1 i przypomnieć@1 mają tę samą wartość?

Przy najwyższej wartości k równej 1 precyzji i przywołanie to to samo. Dokładność jest równa TP / (TP + FP) i odzyskanie wynosi TP / (TP + FN) . Najlepsza prognoza jest zawsze pozytywna i albo pasuje do etykiety, albo nie. Innymi słowy, N przykładach TP + FP = N . Jednakże, jeżeli etykieta nie pasuje do przewidywania górną, to oznacza również przewidywania non-top k został dopasowany iz górnej k ustawiony na 1, wszystkie non-top 1 przewidywania będą 0. Oznacza to FN muszą być (N - TP) lub N = TP + FN . Efektem końcowym jest precision@1 = TP / N = recall@1 . Należy pamiętać, że dotyczy to tylko sytuacji, w której na przykład jest jedna etykieta, a nie wielu etykiet.

Dlaczego moje dane mean_label i mean_prediction zawsze wynoszą 0,5?

Jest to najprawdopodobniej spowodowane tym, że metryki są skonfigurowane pod kątem problemu z klasyfikacją binarną, ale model wyświetla prawdopodobieństwa dla obu klas zamiast tylko jednej. Zdarza się to często, gdy tensorflow w klasyfikacji API jest używany. Rozwiązaniem jest wybranie klasy, na której chcesz oprzeć prognozy, a następnie zbinaryzacja na tej klasie. Na przykład:

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

Jak interpretować MultiLabelConfusionMatrixPlot?

Biorąc pod uwagę konkretny znacznik, MultiLabelConfusionMatrixPlot (i związane MultiLabelConfusionMatrix ) może być używany do porównania wyników innych etykiet i ich przewidywania, gdy wybrana etykieta była rzeczywiście prawdziwe. Na przykład, powiedzmy, że mamy trzy klasy bird , plane i superman i jesteśmy klasyfikowania zdjęć, aby wskazać, jeśli zawierają jedną lub więcej z tych klas. MultiLabelConfusionMatrix będzie obliczyć iloczyn kartezjański każdej rzeczywistej klasy przeciw każdej innej klasy (tzw przewidywana klasa). Należy zauważyć, że podczas procesu łączenia (actual, predicted) The predicted klasy niekoniecznie oznacza dodatnią przewidywania, to stanowi jedynie przewidywany kolumnę rzeczywista vs przewidywanego matrycy. Załóżmy na przykład, że obliczyliśmy następujące macierze:

   (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

MultiLabelConfusionMatrixPlot ma trzy sposoby wyświetlania tych danych. We wszystkich przypadkach sposób odczytywania tabeli jest wiersz po wierszu z perspektywy aktualnej klasy.

1) Całkowita liczba prognoz

W tym przypadku, dla danego rzędu (czyli rzeczywista klasa) jakie były TP + FP liczy się dla innych klas. Dla powyższych zliczeń nasz wyświetlacz wyglądałby następująco:

Przewidywany ptak Przewidywany samolot Przewidywany superman
Rzeczywisty ptak 6 4 2
Rzeczywisty samolot 4 4 4
Rzeczywisty superman 5 5 4

Kiedy zdjęcia rzeczywiście zawierał bird my poprawnie przewidział 6 z nich. Jednocześnie mamy też przewidzieć plane (albo poprawnie lub błędnie) 4 razy i superman (albo właściwie lub niewłaściwie) 2 razy.

2) Nieprawidłowa liczba prognoz

W tym przypadku, dla danego rzędu (czyli rzeczywista klasa) jakie były FP liczy się dla innych klas. Dla powyższych zliczeń nasz wyświetlacz wyglądałby następująco:

Przewidywany ptak Przewidywany samolot Przewidywany superman
Rzeczywisty ptak 0 2 1
Rzeczywisty samolot 1 0 3
Rzeczywisty superman 2 3 0

Kiedy zdjęcia rzeczywiście zawierał bird my błędnie przewidział plane 2 razy i superman 1 razy.

3) Fałszywa liczba ujemna

W tym przypadku, dla danego rzędu (czyli rzeczywista klasa) jakie były FN liczy się dla innych klas. Dla powyższych zliczeń nasz wyświetlacz wyglądałby następująco:

Przewidywany ptak Przewidywany samolot Przewidywany superman
Rzeczywisty ptak 2 2 4
Rzeczywisty samolot 1 4 3
Rzeczywisty superman 2 2 5

Kiedy zdjęcia rzeczywiście zawierał bird nie udało się przewidzieć, to 2 razy. Jednocześnie, nie udało się przewidzieć plane 2 razy i superman 4 razy.

Dlaczego otrzymuję komunikat o błędzie informującym, że nie znaleziono klucza prognozy?

Niektóre modele wyświetlają swoje przewidywania w formie słownika. Na przykład, Estymator TF do binarnego problemu klasyfikacji wyprowadza słownik zawierający probabilities , class_ids itp w większości przypadków TFMA ma domyślne dla znalezienia commomly używane nazwy klawiszy, takich jak predictions , probabilities itp Jednakże, jeśli twój model jest bardzo dostosowane może ona klucze wyjściowe pod nazwami nieznanymi przez TFMA. Na tych przypadkach prediciton_key ustawienie musi zostać dodany do tfma.ModelSpec zidentyfikować nazwę klucza wyjście jest przechowywany pod.