Dołącz do społeczności SIG TFX-Addons i pomóż ulepszyć TFX! Dołącz do dodatków SIG TFX

Analiza modelu TensorFlow

Przykład kluczowego komponentu TensorFlow Extended (TFX)

TensorFlow Model Analysis (TFMA) to biblioteka do przeprowadzania oceny modelu na różnych wycinkach danych. TFMA wykonuje swoje obliczenia w sposób rozproszony na dużych ilościach danych przy użyciu Apache Beam .

Ten przykładowy notatnik colab ilustruje, w jaki sposób TFMA może być używany do badania i wizualizacji wydajności modelu w odniesieniu do cech zestawu danych. Użyjemy modelu, który trenowaliśmy wcześniej, a teraz możesz pobawić się wynikami! Wyszkolony przez nas model dotyczył przykładu taksówki z Chicago , który korzysta z zestawu danych o przejazdach taksówką udostępnionego przez miasto Chicago. Przeglądaj pełny zbiór danych w interfejsie użytkownika BigQuery .

Jako projektant i programista zastanów się, w jaki sposób te dane są używane i jakie potencjalne korzyści i szkody mogą spowodować prognozy modelu. Taki model mógłby wzmocnić uprzedzenia społeczne i dysproporcje. Czy funkcja jest istotna dla problemu, który chcesz rozwiązać, czy wprowadzi stronniczość? Aby uzyskać więcej informacji, przeczytaj o sprawiedliwości ML .

Kolumny w zbiorze danych to:

pickup_community_area opłata trip_start_month
trip_start_hour trip_start_day trip_start_timestamp
szerokość_odbioru długość_odbioru dropoff_latitude
dropoff_longitude podróż_mile pickup_census_tract
dropoff_census_tract typ płatności firma
trip_seconds dropoff_community_area wskazówki

Zainstaluj rozszerzenia Jupyter

jupyter nbextension enable --py widgetsnbextension --sys-prefix 
jupyter nbextension install --py --symlink tensorflow_model_analysis --sys-prefix 
jupyter nbextension enable --py tensorflow_model_analysis --sys-prefix 

Zainstaluj analizę modelu TensorFlow (TFMA)

Spowoduje to pobranie wszystkich zależności i zajmie minutę.

# Upgrade pip to the latest, and install TFMA.
pip install -U pip
pip install tensorflow-model-analysis

Teraz musisz ponownie uruchomić środowisko wykonawcze przed uruchomieniem poniższych komórek.

# This setup was tested with TF 2.5 and TFMA 0.31 (using colab), but it should
# also work with the latest release.
import sys

# Confirm that we're using Python 3
assert sys.version_info.major==3, 'This notebook must be run using Python 3.'

import tensorflow as tf
print('TF version: {}'.format(tf.__version__))
import apache_beam as beam
print('Beam version: {}'.format(beam.__version__))
import tensorflow_model_analysis as tfma
print('TFMA version: {}'.format(tfma.__version__))
TF version: 2.5.0
Beam version: 2.29.0
TFMA version: 0.31.0

Załaduj pliki

Pobierzemy plik tar, który zawiera wszystko, czego potrzebujemy. To obejmuje:

  • Zbiory danych szkoleniowych i ewaluacyjnych
  • Schemat danych
  • Uczenie i serwowanie zapisanych modeli (keras i estymator) oraz ewaluacja zapisanych modeli (estymator).
# Download the tar file from GCP and extract it
import io, os, tempfile
TAR_NAME = 'saved_models-2.2'
BASE_DIR = tempfile.mkdtemp()
DATA_DIR = os.path.join(BASE_DIR, TAR_NAME, 'data')
MODELS_DIR = os.path.join(BASE_DIR, TAR_NAME, 'models')
SCHEMA = os.path.join(BASE_DIR, TAR_NAME, 'schema.pbtxt')
OUTPUT_DIR = os.path.join(BASE_DIR, 'output')

!curl -O https://storage.googleapis.com/artifacts.tfx-oss-public.appspot.com/datasets/{TAR_NAME}.tar
!tar xf {TAR_NAME}.tar
!mv {TAR_NAME} {BASE_DIR}
!rm {TAR_NAME}.tar

print("Here's what we downloaded:")
!ls -R {BASE_DIR}
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 6800k  100 6800k    0     0  25.0M      0 --:--:-- --:--:-- --:--:-- 25.0M
Here's what we downloaded:
/tmp/tmpsu298d8g:
saved_models-2.2

/tmp/tmpsu298d8g/saved_models-2.2:
data  models  schema.pbtxt

/tmp/tmpsu298d8g/saved_models-2.2/data:
eval  train

/tmp/tmpsu298d8g/saved_models-2.2/data/eval:
data.csv

/tmp/tmpsu298d8g/saved_models-2.2/data/train:
data.csv

/tmp/tmpsu298d8g/saved_models-2.2/models:
estimator  keras

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator:
eval_model_dir  serving_model_dir

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/eval_model_dir:
1591221811

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/eval_model_dir/1591221811:
saved_model.pb  tmp.pbtxt  variables

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/eval_model_dir/1591221811/variables:
variables.data-00000-of-00001  variables.index

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/serving_model_dir:
checkpoint
eval_chicago-taxi-eval
events.out.tfevents.1591221780.my-pipeline-b57vp-237544850
export
graph.pbtxt
model.ckpt-100.data-00000-of-00001
model.ckpt-100.index
model.ckpt-100.meta

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/serving_model_dir/eval_chicago-taxi-eval:
events.out.tfevents.1591221799.my-pipeline-b57vp-237544850

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/serving_model_dir/export:
chicago-taxi

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/serving_model_dir/export/chicago-taxi:
1591221801

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/serving_model_dir/export/chicago-taxi/1591221801:
saved_model.pb  variables

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/serving_model_dir/export/chicago-taxi/1591221801/variables:
variables.data-00000-of-00001  variables.index

/tmp/tmpsu298d8g/saved_models-2.2/models/keras:
0  1  2

/tmp/tmpsu298d8g/saved_models-2.2/models/keras/0:
saved_model.pb  variables

/tmp/tmpsu298d8g/saved_models-2.2/models/keras/0/variables:
variables.data-00000-of-00001  variables.index

/tmp/tmpsu298d8g/saved_models-2.2/models/keras/1:
saved_model.pb  variables

/tmp/tmpsu298d8g/saved_models-2.2/models/keras/1/variables:
variables.data-00000-of-00001  variables.index

/tmp/tmpsu298d8g/saved_models-2.2/models/keras/2:
saved_model.pb  variables

/tmp/tmpsu298d8g/saved_models-2.2/models/keras/2/variables:
variables.data-00000-of-00001  variables.index

Przeanalizuj schemat

Wśród rzeczy, które pobraliśmy, był schemat naszych danych, który został stworzony przez TensorFlow Data Validation . Przeanalizujmy to teraz, abyśmy mogli używać go z TFMA.

import tensorflow as tf
from google.protobuf import text_format
from tensorflow.python.lib.io import file_io
from tensorflow_metadata.proto.v0 import schema_pb2
from tensorflow.core.example import example_pb2

schema = schema_pb2.Schema()
contents = file_io.read_file_to_string(SCHEMA)
schema = text_format.Parse(contents, schema)

Użyj schematu do tworzenia TFRecords

Musimy dać TFMA dostęp do naszego zbioru danych, więc stwórzmy plik TFRecords. Możemy użyć naszego schematu, aby go utworzyć, ponieważ daje nam właściwy typ dla każdej funkcji.

import csv

datafile = os.path.join(DATA_DIR, 'eval', 'data.csv')
reader = csv.DictReader(open(datafile, 'r'))
examples = []
for line in reader:
  example = example_pb2.Example()
  for feature in schema.feature:
    key = feature.name
    if feature.type == schema_pb2.FLOAT:
      example.features.feature[key].float_list.value[:] = (
          [float(line[key])] if len(line[key]) > 0 else [])
    elif feature.type == schema_pb2.INT:
      example.features.feature[key].int64_list.value[:] = (
          [int(line[key])] if len(line[key]) > 0 else [])
    elif feature.type == schema_pb2.BYTES:
      example.features.feature[key].bytes_list.value[:] = (
          [line[key].encode('utf8')] if len(line[key]) > 0 else [])
  # Add a new column 'big_tipper' that indicates if tips was > 20% of the fare. 
  # TODO(b/157064428): Remove after label transformation is supported for Keras.
  big_tipper = float(line['tips']) > float(line['fare']) * 0.2
  example.features.feature['big_tipper'].float_list.value[:] = [big_tipper]
  examples.append(example)

tfrecord_file = os.path.join(BASE_DIR, 'train_data.rio')
with tf.io.TFRecordWriter(tfrecord_file) as writer:
  for example in examples:
    writer.write(example.SerializeToString())

!ls {tfrecord_file}
/tmp/tmpsu298d8g/train_data.rio

Skonfiguruj i uruchom TFMA

TFMA obsługuje wiele różnych typów modeli, w tym modele TF Keras, modele oparte na ogólnych API sygnatur TF2, a także modele oparte na estymatorach TF. Przewodnik get_started zawiera pełną listę obsługiwanych typów modeli i wszelkie ograniczenia. W tym przykładzie pokażemy, jak skonfigurować model oparty na EvalSavedModel oraz model oparty na estymatorze, który został zapisany jako EvalSavedModel . Zobacz FAQ, aby zapoznać się z przykładami innych konfiguracji.

TFMA zapewnia obsługę obliczania metryk, które były używane w czasie uczenia (tj. metryk wbudowanych), a także metryk zdefiniowanych po zapisaniu modelu w ramach ustawień konfiguracyjnych TFMA. W przypadku naszej konfiguracji keras zademonstrujemy ręczne dodawanie naszych metryk i wykresów w ramach naszej konfiguracji (zapoznaj się z przewodnikiem dotyczącym metryk, aby uzyskać informacje na temat obsługiwanych metryk i wykresów). Do konfiguracji estymatora użyjemy wbudowanych metryk, które zostały zapisane z modelem. Nasze konfiguracje zawierają również szereg specyfikacji krojenia, które zostały omówione bardziej szczegółowo w kolejnych sekcjach.

Po utworzeniu tfma.EvalConfig i tfma.EvalSharedModel możemy następnie uruchomić TFMA za pomocą tfma.run_model_analysis . Spowoduje to utworzenie tfma.EvalResult którego możemy później użyć do renderowania naszych metryk i wykresów.

Keras

import tensorflow_model_analysis as tfma

# Setup tfma.EvalConfig settings
keras_eval_config = text_format.Parse("""
  ## Model information
  model_specs {
    # For keras (and serving models) we need to add a `label_key`.
    label_key: "big_tipper"
  }

  ## Post training metric information. These will be merged with any built-in
  ## metrics from training.
  metrics_specs {
    metrics { class_name: "ExampleCount" }
    metrics { class_name: "BinaryAccuracy" }
    metrics { class_name: "BinaryCrossentropy" }
    metrics { class_name: "AUC" }
    metrics { class_name: "AUCPrecisionRecall" }
    metrics { class_name: "Precision" }
    metrics { class_name: "Recall" }
    metrics { class_name: "MeanLabel" }
    metrics { class_name: "MeanPrediction" }
    metrics { class_name: "Calibration" }
    metrics { class_name: "CalibrationPlot" }
    metrics { class_name: "ConfusionMatrixPlot" }
    # ... add additional metrics and plots ...
  }

  ## Slicing information
  slicing_specs {}  # overall slice
  slicing_specs {
    feature_keys: ["trip_start_hour"]
  }
  slicing_specs {
    feature_keys: ["trip_start_day"]
  }
  slicing_specs {
    feature_values: {
      key: "trip_start_month"
      value: "1"
    }
  }
  slicing_specs {
    feature_keys: ["trip_start_hour", "trip_start_day"]
  }
""", tfma.EvalConfig())

# Create a tfma.EvalSharedModel that points at our keras model.
keras_model_path = os.path.join(MODELS_DIR, 'keras', '2')
keras_eval_shared_model = tfma.default_eval_shared_model(
    eval_saved_model_path=keras_model_path,
    eval_config=keras_eval_config)

keras_output_path = os.path.join(OUTPUT_DIR, 'keras')

# Run TFMA
keras_eval_result = tfma.run_model_analysis(
    eval_shared_model=keras_eval_shared_model,
    eval_config=keras_eval_config,
    data_location=tfrecord_file,
    output_path=keras_output_path)
​​
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:absl:Tensorflow version (2.5.0) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:apache_beam.runners.interactive.interactive_environment:Dependencies required for Interactive Beam PCollection visualization are not available, please use: `pip install apache-beam[interactive]` to install necessary dependencies to enable all data visualization features.
WARNING:apache_beam.io.tfrecordio:Couldn't find python-snappy so the implementation of _TFRecordUtil._masked_crc32c is not as fast as it could be.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:113: tf_record_iterator (from tensorflow.python.lib.io.tf_record) is deprecated and will be removed in a future version.
Instructions for updating:
Use eager execution and: 
`tf.data.TFRecordDataset(path)`
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:113: tf_record_iterator (from tensorflow.python.lib.io.tf_record) is deprecated and will be removed in a future version.
Instructions for updating:
Use eager execution and: 
`tf.data.TFRecordDataset(path)`

Taksator

import tensorflow_model_analysis as tfma

# Setup tfma.EvalConfig settings
estimator_eval_config = text_format.Parse("""
  ## Model information
  model_specs {
    # To use EvalSavedModel set `signature_name` to "eval".
    signature_name: "eval"
  }

  ## Post training metric information. These will be merged with any built-in
  ## metrics from training.
  metrics_specs {
    metrics { class_name: "ConfusionMatrixPlot" }
    # ... add additional metrics and plots ...
  }

  ## Slicing information
  slicing_specs {}  # overall slice
  slicing_specs {
    feature_keys: ["trip_start_hour"]
  }
  slicing_specs {
    feature_keys: ["trip_start_day"]
  }
  slicing_specs {
    feature_values: {
      key: "trip_start_month"
      value: "1"
    }
  }
  slicing_specs {
    feature_keys: ["trip_start_hour", "trip_start_day"]
  }
""", tfma.EvalConfig())

# Create a tfma.EvalSharedModel that points at our eval saved model.
estimator_base_model_path = os.path.join(
    MODELS_DIR, 'estimator', 'eval_model_dir')
estimator_model_path = os.path.join(
    estimator_base_model_path, os.listdir(estimator_base_model_path)[0])
estimator_eval_shared_model = tfma.default_eval_shared_model(
    eval_saved_model_path=estimator_model_path,
    eval_config=estimator_eval_config)

estimator_output_path = os.path.join(OUTPUT_DIR, 'estimator')

# Run TFMA
estimator_eval_result = tfma.run_model_analysis(
    eval_shared_model=estimator_eval_shared_model,
    eval_config=estimator_eval_config,
    data_location=tfrecord_file,
    output_path=estimator_output_path)
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:absl:Tensorflow version (2.5.0) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/eval_saved_model/load.py:169: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/eval_saved_model/load.py:169: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0.
INFO:tensorflow:Restoring parameters from /tmp/tmpsu298d8g/saved_models-2.2/models/estimator/eval_model_dir/1591221811/variables/variables
INFO:tensorflow:Restoring parameters from /tmp/tmpsu298d8g/saved_models-2.2/models/estimator/eval_model_dir/1591221811/variables/variables
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/eval_saved_model/graph_ref.py:189: get_tensor_from_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.get_tensor_from_tensor_info or tf.compat.v1.saved_model.get_tensor_from_tensor_info.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/eval_saved_model/graph_ref.py:189: get_tensor_from_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.get_tensor_from_tensor_info or tf.compat.v1.saved_model.get_tensor_from_tensor_info.

Wizualizacja metryk i wykresów

Teraz, po uruchomieniu oceny, spójrzmy na nasze wizualizacje przy użyciu TFMA. W poniższych przykładach zwizualizujemy wyniki z uruchomienia oceny na modelu Keras. Aby zobaczyć aktualizację modelu Estymator oparty na eval_result do punktu, w naszej estimator_eval_result zmiennej.

0tata586100

Wskaźniki renderowania

Aby wyświetlić metryki, użyj tfma.view.render_slicing_metrics

Domyślnie widoki będą wyświetlać wycinek Overall . Aby wyświetlić konkretny wycinek, możesz użyć nazwy kolumny (ustawiając slicing_column ) lub podać tfma.SlicingSpec .

Wizualizacja metryk obsługuje następujące interakcje:

  • Kliknij i przeciągnij, aby przesunąć
  • Przewiń, aby powiększyć
  • Kliknij prawym przyciskiem myszy, aby zresetować widok
  • Najedź na żądany punkt danych, aby zobaczyć więcej szczegółów.
  • Wybierz jeden z czterech różnych typów widoków, korzystając z opcji na dole.

Na przykład slicing_column na funkcję trip_start_hour z naszych poprzednich slicing_specs .

tfma.view.render_slicing_metrics(eval_result, slicing_column='trip_start_hour')
SlicingMetricsViewer(config={'weightedExamplesColumn': 'example_count'}, data=[{'slice': 'trip_start_hour:2', …

Przegląd plasterków

Domyślną wizualizacją jest Przegląd wycinków, gdy liczba wycinków jest niewielka. Pokazuje wartości metryk dla każdego wycinka. Ponieważ trip_start_hour powyżej trip_start_hour , pokazuje nam dane, takie jak dokładność i AUC dla każdej godziny, co pozwala nam szukać problemów specyficznych dla niektórych godzin, a nie innych.

Na powyższej wizualizacji:

  • Spróbuj posortować kolumnę funkcji, czyli naszą funkcję trip_start_hours , klikając nagłówek kolumny column
  • Spróbuj sortować według precyzji i zauważ, że dokładność dla niektórych godzin z przykładami wynosi 0, co może wskazywać na problem

Wykres pozwala nam również wybierać i wyświetlać różne metryki w naszych wycinkach.

  • Spróbuj wybrać inne dane z menu „Pokaż”
  • Spróbuj wybrać przywoływanie w menu „Pokaż” i zauważ, że przywołanie niektórych godzin z przykładami wynosi 0, co może wskazywać na problem

Możliwe jest również ustawienie progu, aby odfiltrować wycinki z mniejszą liczbą przykładów lub „wagą”. Możesz wpisać minimalną liczbę przykładów lub użyć suwaka.

Histogram danych

Ten widok obsługuje również histogram metryk jako alternatywną wizualizację, która jest również widokiem domyślnym, gdy liczba wycinków jest duża. Wyniki zostaną podzielone na wiaderka i można zwizualizować liczbę kromek / wagę całkowitą / obie. Kolumny można sortować, klikając nagłówek kolumny. Plastry o małej wadze można odfiltrować, ustawiając próg. Dalsze filtrowanie można zastosować, przeciągając szary pasek. Aby zresetować zakres, kliknij dwukrotnie zespół. Filtrowania można również użyć do usunięcia wartości odstających z wizualizacji i tabel metryk. Kliknij ikonę koła zębatego, aby przełączyć się na skalę logarytmiczną zamiast na skalę liniową.

  • Spróbuj wybrać „Histogram metryk” w menu Wizualizacja

Więcej plasterków

Nasz początkowy tfma.EvalConfig utworzył całą listę slicing_specs , którą możemy wizualizować, aktualizując informacje o wycinku przekazywane do tfma.view.render_slicing_metrics . Tutaj wybierzemy wycinek trip_start_day (dni tygodnia). Spróbuj zmienić trip_start_day na trip_start_month i ponownie renderuj, aby przeanalizować różne wycinki.

tfma.view.render_slicing_metrics(eval_result, slicing_column='trip_start_day')
SlicingMetricsViewer(config={'weightedExamplesColumn': 'example_count'}, data=[{'slice': 'trip_start_day:3', '…

TFMA obsługuje również tworzenie krzyżyków cech w celu analizy kombinacji cech. Nasze oryginalne ustawienia utworzyły krzyż trip_start_hour i trip_start_day :

tfma.view.render_slicing_metrics(
    eval_result,
    slicing_spec=tfma.SlicingSpec(
        feature_keys=['trip_start_hour', 'trip_start_day']))
SlicingMetricsViewer(config={'weightedExamplesColumn': 'example_count'}, data=[{'slice': 'trip_start_day_X_tri…

Skrzyżowanie dwóch kolumn tworzy mnóstwo kombinacji! Zawęźmy nasz krzyż, aby spojrzeć tylko na wycieczki rozpoczynające się w południe . Następnie binary_accuracy z wizualizacji:

tfma.view.render_slicing_metrics(
    eval_result,
    slicing_spec=tfma.SlicingSpec(
        feature_keys=['trip_start_day'], feature_values={'trip_start_hour': '12'}))
SlicingMetricsViewer(config={'weightedExamplesColumn': 'example_count'}, data=[{'slice': 'trip_start_day_X_tri…

Renderowanie działek

Wszelkie działek, które zostały dodane do tfma.EvalConfig jak pocztowych szkoleniowych metric_specs mogą być wyświetlane przy użyciu tfma.view.render_plot .

Podobnie jak w przypadku metryk, wykresy można przeglądać według plasterka. W przeciwieństwie do metryk, można wyświetlić tylko wykresy dla określonej wartości wycinka, dlatego należy użyć tfma.SlicingSpec i określić zarówno nazwę, jak i wartość elementu wycinka. Jeśli nie podano wycinka, używane są wykresy dla wycinka Overall .

W poniższym przykładzie wyświetlamy wykresy CalibrationPlot i ConfusionMatrixPlot które zostały obliczone dla trip_start_hour:1 .

tfma.view.render_plot(
    eval_result,
    tfma.SlicingSpec(feature_values={'trip_start_hour': '1'}))
PlotViewer(config={'sliceName': 'trip_start_hour:1', 'metricKeys': {'calibrationPlot': {'metricName': 'calibra…

Śledzenie wydajności modelu w czasie

Twój treningowy zestaw danych będzie używany do trenowania Twojego modelu i, miejmy nadzieję, będzie reprezentatywny dla Twojego testowego zestawu danych oraz danych, które zostaną wysłane do Twojego modelu w środowisku produkcyjnym. Jednak chociaż dane w żądaniach wnioskowania mogą pozostać takie same jak dane treningowe, w wielu przypadkach zaczną się one zmieniać na tyle, że zmieni się wydajność modelu.

Oznacza to, że musisz na bieżąco monitorować i mierzyć wydajność swojego modelu, aby być świadomym zmian i na nie reagować. Przyjrzyjmy się, jak TFMA może pomóc.

Załadujmy 3 różne uruchomienia modeli i użyjmy TFMA, aby zobaczyć, jak się porównują przy użyciu render_time_series .

# Note this re-uses the EvalConfig from the keras setup.

# Run eval on each saved model
output_paths = []
for i in range(3):
  # Create a tfma.EvalSharedModel that points at our saved model.
  eval_shared_model = tfma.default_eval_shared_model(
      eval_saved_model_path=os.path.join(MODELS_DIR, 'keras', str(i)),
      eval_config=keras_eval_config)

  output_path = os.path.join(OUTPUT_DIR, 'time_series', str(i))
  output_paths.append(output_path)

  # Run TFMA
  tfma.run_model_analysis(eval_shared_model=eval_shared_model,
                          eval_config=keras_eval_config,
                          data_location=tfrecord_file,
                          output_path=output_path)
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:absl:Tensorflow version (2.5.0) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:absl:Tensorflow version (2.5.0) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:absl:Tensorflow version (2.5.0) found. Note that TFMA support for TF 2.0 is currently in beta

Najpierw wyobrazimy sobie, że wczoraj przeszkoliliśmy i wdrożyliśmy nasz model, a teraz chcemy zobaczyć, jak radzi sobie z nowymi danymi, które pojawią się dzisiaj. Wizualizacja rozpocznie się od wyświetlenia AUC. Z interfejsu użytkownika możesz:

  • Dodaj inne dane za pomocą menu „Dodaj serię danych”.
  • Zamknij niechciane wykresy, klikając x
  • Najedź kursorem na punkty danych (końce segmentów linii na wykresie), aby uzyskać więcej szczegółów
eval_results_from_disk = tfma.load_eval_results(output_paths[:2])

tfma.view.render_time_series(eval_results_from_disk)
TimeSeriesViewer(config={'isModelCentric': True}, data=[{'metrics': {'': {'': {'binary_accuracy': {'doubleValu…

Teraz wyobrazimy sobie, że minął kolejny dzień i chcemy zobaczyć, jak sobie radzi z nowymi danymi napływającymi dzisiaj, w porównaniu do poprzednich dwóch dni:

eval_results_from_disk = tfma.load_eval_results(output_paths)

tfma.view.render_time_series(eval_results_from_disk)
TimeSeriesViewer(config={'isModelCentric': True}, data=[{'metrics': {'': {'': {'binary_accuracy': {'doubleValu…

Walidacja modelu

TFMA można skonfigurować do jednoczesnej oceny wielu modeli. Zwykle odbywa się to w celu porównania nowego modelu z punktem odniesienia (takim jak obecnie obsługujący model) w celu określenia różnic w wydajności w metrykach (np. AUC itp.) w stosunku do punktu odniesienia. Po skonfigurowaniu progów TFMA tfma.ValidationResult rekord tfma.ValidationResult wskazujący, czy wydajność odpowiada oczekiwaniom.

Skonfigurujmy ponownie naszą ocenę Keras, aby porównać dwa modele: kandydat i punkt odniesienia. tmfa.MetricThreshold również wydajność kandydata względem linii bazowej, ustawiając wartość tmfa.MetricThreshold na metryce AUC.

# Setup tfma.EvalConfig setting
eval_config_with_thresholds = text_format.Parse("""
  ## Model information
  model_specs {
    name: "candidate"
    # For keras we need to add a `label_key`.
    label_key: "big_tipper"
  }
  model_specs {
    name: "baseline"
    # For keras we need to add a `label_key`.
    label_key: "big_tipper"
    is_baseline: true
  }

  ## Post training metric information
  metrics_specs {
    metrics { class_name: "ExampleCount" }
    metrics { class_name: "BinaryAccuracy" }
    metrics { class_name: "BinaryCrossentropy" }
    metrics {
      class_name: "AUC"
      threshold {
        # Ensure that AUC is always > 0.9
        value_threshold {
          lower_bound { value: 0.9 }
        }
        # Ensure that AUC does not drop by more than a small epsilon
        # e.g. (candidate - baseline) > -1e-10 or candidate > baseline - 1e-10
        change_threshold {
          direction: HIGHER_IS_BETTER
          absolute { value: -1e-10 }
        }
      }
    }
    metrics { class_name: "AUCPrecisionRecall" }
    metrics { class_name: "Precision" }
    metrics { class_name: "Recall" }
    metrics { class_name: "MeanLabel" }
    metrics { class_name: "MeanPrediction" }
    metrics { class_name: "Calibration" }
    metrics { class_name: "CalibrationPlot" }
    metrics { class_name: "ConfusionMatrixPlot" }
    # ... add additional metrics and plots ...
  }

  ## Slicing information
  slicing_specs {}  # overall slice
  slicing_specs {
    feature_keys: ["trip_start_hour"]
  }
  slicing_specs {
    feature_keys: ["trip_start_day"]
  }
  slicing_specs {
    feature_keys: ["trip_start_month"]
  }
  slicing_specs {
    feature_keys: ["trip_start_hour", "trip_start_day"]
  }
""", tfma.EvalConfig())

# Create tfma.EvalSharedModels that point at our keras models.
candidate_model_path = os.path.join(MODELS_DIR, 'keras', '2')
baseline_model_path = os.path.join(MODELS_DIR, 'keras', '1')
eval_shared_models = [
  tfma.default_eval_shared_model(
      model_name=tfma.CANDIDATE_KEY,
      eval_saved_model_path=candidate_model_path,
      eval_config=eval_config_with_thresholds),
  tfma.default_eval_shared_model(
      model_name=tfma.BASELINE_KEY,
      eval_saved_model_path=baseline_model_path,
      eval_config=eval_config_with_thresholds),
]

validation_output_path = os.path.join(OUTPUT_DIR, 'validation')

# Run TFMA
eval_result_with_validation = tfma.run_model_analysis(
    eval_shared_models,
    eval_config=eval_config_with_thresholds,
    data_location=tfrecord_file,
    output_path=validation_output_path)
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:absl:Tensorflow version (2.5.0) found. Note that TFMA support for TF 2.0 is currently in beta

Podczas przeprowadzania ocen z jednym lub większą liczbą modeli względem linii bazowej, TFMA automatycznie dodaje metryki diff dla wszystkich metryk obliczonych podczas oceny. Te metryki są nazywane po odpowiedniej metryce, ale z dołączoną do nazwy metryki _diff .

Przyjrzyjmy się metrykom wygenerowanym przez nasz bieg:

tfma.view.render_time_series(eval_result_with_validation)
TimeSeriesViewer(config={'isModelCentric': True}, data=[{'metrics': {'': {'': {'binary_accuracy': {'doubleValu…

Przyjrzyjmy się teraz wynikom naszych sprawdzeń weryfikacyjnych. Aby wyświetlić wyniki walidacji używamytfma.load_validator_result . W naszym przykładzie weryfikacja kończy się niepowodzeniem, ponieważ wartość AUC jest poniżej progu.

validation_result = tfma.load_validation_result(validation_output_path)
print(validation_result.validation_ok)
False