Анализ модели TensorFlow

Пример ключевого компонента TensorFlow Extended (TFX)

TensorFlow Модель анализ (TFMA) представляет собой библиотеку для проведения оценки модели в различных срезах данных. TFMA выполняет свои вычисления распределенным образом над большими объемами данных с использованием Apache Beam .

В этом примере записной книжки Colab показано, как можно использовать TFMA для исследования и визуализации производительности модели по отношению к характеристикам набора данных. Мы будем использовать модель, которую мы обучили ранее, и теперь вы можете поиграть с результатами! Модель , которую мы обучен была для Чикаго такси примера , который использует такси Trips набор данных выпущен городом Чикаго. Исследуйте полный набор данных в BigQuery UI .

Как модельер и разработчик, подумайте о том, как используются эти данные, и о потенциальных преимуществах и вреде, которые могут принести прогнозы модели. Подобная модель может усилить социальные предубеждения и неравенства. Относится ли функция к проблеме, которую вы хотите решить, или она внесет предвзятость? Для получения более подробной информации читайте о ML справедливости .

Столбцы в наборе данных:

pickup_community_area транспортные расходы trip_start_month
trip_start_hour trip_start_day trip_start_timestamp
pickup_latitude pickup_longitude dropoff_latitude
dropoff_longitude trip_miles pickup_census_tract
dropoff_census_tract способ оплаты Компания
trip_seconds dropoff_community_area подсказки

Установить расширения 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 

Установите TensorFlow Model Analysis (TFMA)

Это приведет к включению всех зависимостей и займет минуту.

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

Теперь вы должны перезапустить среду выполнения перед запуском ячеек ниже.

# 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.4.4
Beam version: 2.34.0
TFMA version: 0.29.0

Загрузить файлы

Мы скачаем tar-файл, в котором есть все, что нам нужно. Это включает:

  • Наборы данных для обучения и оценки
  • Схема данных
  • Обучение и обслуживание сохраненных моделей (keras и оценка) и оценка сохраненных моделей (оценка).
# 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  28.2M      0 --:--:-- --:--:-- --:--:-- 28.2M
Here's what we downloaded:
/tmp/tmp_at9q62d:
saved_models-2.2

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

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

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

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

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

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

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

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

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

/tmp/tmp_at9q62d/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/tmp_at9q62d/saved_models-2.2/models/estimator/serving_model_dir/eval_chicago-taxi-eval:
events.out.tfevents.1591221799.my-pipeline-b57vp-237544850

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

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

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

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

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

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

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

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

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

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

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

Разобрать схему

Среди вещей , которые мы скачали была схема для наших данных , которая была создана с помощью TensorFlow Data Validation . Давайте проанализируем это сейчас, чтобы мы могли использовать его с 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)

Используйте схему для создания TFRecords

Нам нужно предоставить TFMA доступ к нашему набору данных, поэтому давайте создадим файл TFRecords. Мы можем использовать нашу схему для ее создания, поскольку она дает нам правильный тип для каждой функции.

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/tmp_at9q62d/train_data.rio

Настройка и запуск TFMA

TFMA поддерживает ряд различных типов моделей, включая модели TF keras, модели, основанные на общих API подписи TF2, а также модели на основе оценки TF. Get_started руководство имеет полный список типов моделей , поддерживаемых и каких - либо ограничений. В этом примере мы собираемся показать , как настроить keras модель на основе, а также на основе модели оценивани , которая была сохранена как EvalSavedModel . Смотрите FAQ для примеров других конфигураций.

TFMA обеспечивает поддержку для расчета показателей, которые использовались во время обучения (т. Е. Встроенных показателей), а также показателей, определенных после сохранения модели как часть настроек конфигурации TFMA. Для нашего keras установки мы продемонстрируем , добавив наши показатели и графики вручную , как часть нашей конфигурации (см метрик руководства для получения информации о метриках и графиках, которые поддерживаются). Для настройки оценщика мы будем использовать встроенные метрики, которые были сохранены вместе с моделью. Наши настройки также включают ряд спецификаций нарезки, которые более подробно обсуждаются в следующих разделах.

После создания tfma.EvalConfig и tfma.EvalSharedModel мы можем запустить TFMA с помощью tfma.run_model_analysis . Это позволит создать tfma.EvalResult , который мы можем использовать в дальнейшем для визуализации наших показателей и графиков.

Керас

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)
2021-12-04 10:18:15.463173: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcusolver.so.10'; dlerror: libcusolver.so.10: cannot open shared object file: No such file or directory
2021-12-04 10:18:15.464249: W tensorflow/core/common_runtime/gpu/gpu_device.cc:1757] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform.
Skipping registering GPU devices...
WARNING:absl:Tensorflow version (2.4.4) 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:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.
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)`

Оценщик

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:absl:Tensorflow version (2.4.4) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.
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/tmp_at9q62d/saved_models-2.2/models/estimator/eval_model_dir/1591221811/variables/variables
INFO:tensorflow:Restoring parameters from /tmp/tmp_at9q62d/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.

Визуализация показателей и графиков

Теперь, когда мы выполнили оценку, давайте взглянем на наши визуализации с использованием TFMA. В следующих примерах мы визуализируем результаты выполнения оценки на модели keras. Для просмотра Оценщик на основе обновления Смоделируйте eval_result к точке нашей estimator_eval_result переменной.

eval_result = keras_eval_result
# eval_result = estimator_eval_result

Показатели рендеринга

Для просмотра метрик вы используете tfma.view.render_slicing_metrics

По умолчанию мнения будут отображаться Overall срез. Для того, чтобы просмотреть конкретный фрагмент можно использовать либо имя столбца (путем установки slicing_column ) или предоставить tfma.SlicingSpec .

Визуализация метрик поддерживает следующие взаимодействия:

  • Щелкните и перетащите для панорамирования
  • Прокрутите для увеличения
  • Щелкните правой кнопкой мыши, чтобы сбросить вид
  • Наведите указатель мыши на нужную точку данных, чтобы увидеть более подробную информацию.
  • Выберите один из четырех различных типов представлений, используя кнопки внизу.

Например, мы будем установка slicing_column смотреть на trip_start_hour особенность наших предыдущих 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', …

Обзор срезов

Визуализация по умолчанию является Ломтики Обзора когда количество срезов мало. Он показывает значения метрик для каждого среза. Так как мы выбрали trip_start_hour выше, он показывает нам такие показатели , как точность и АУК за каждый час, что позволяет нам искать проблемы , которые являются специфическими для нескольких часов , а не других.

На изображении выше:

  • Попробуйте сортировать столбец функций, который является нашим trip_start_hours особенности, с помощью щелчка на заголовке столбца
  • Попробуйте сортировать по точности, и уведомление о том , что точность для некоторых часов с примерами является 0, что может указывать на проблему

Диаграмма также позволяет нам выбирать и отображать различные показатели в наших срезах.

  • Попробуйте выбрать другие показатели в меню "Показать".
  • Попробуйте выбрать отзыв в меню «Показать», и уведомление о том , что отзыв для некоторых часов с примерами является 0, что может указывать на проблему

Также можно установить порог для фильтрации срезов с меньшим количеством примеров или «весов». Вы можете ввести минимальное количество примеров или использовать ползунок.

Гистограмма показателей

Эта точка зрения также поддерживает Метрики гистограмму в качестве альтернативной визуализации, которая также отображается по умолчанию , когда количество срезов велико. Результаты будут разделены на сегменты, и количество срезов / общий вес / оба могут быть визуализированы. Столбцы можно отсортировать, щелкнув заголовок столбца. Срезы с небольшим весом можно отфильтровать, установив порог. Дальнейшую фильтрацию можно применить, перетащив серую полосу. Чтобы сбросить диапазон, дважды щелкните полосу. Фильтрацию также можно использовать для удаления выбросов в таблицах визуализации и метрик. Щелкните значок шестеренки, чтобы переключиться на логарифмическую шкалу вместо линейной.

  • Попробуйте выбрать «Гистограмма показателей» в меню «Визуализация».

Больше ломтиков

Наш первоначальный tfma.EvalConfig создал целый список slicing_specs , который мы можем визуализировать информацию ломтика обновления передается tfma.view.render_slicing_metrics . Здесь мы выбираем trip_start_day срез (дни недели). Попробуйте изменить trip_start_day к trip_start_month и рендеринг снова исследовать различные кусочки.

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

TFMA также поддерживает создание крестиков функций для анализа комбинаций функций. Наши первоначальные настройки создана перекрестная trip_start_hour и 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…

Пересечение двух столбцов создает множество комбинаций! Давайте сузить наш крест смотреть только на поездки , которые начинаются в полдень. Тогда давайте выберем binary_accuracy от визуализации:

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…

Отрисовка графиков

Любые участки , которые были добавлены к tfma.EvalConfig как почтовые подготовки metric_specs могут быть отображены с помощью tfma.view.render_plot .

Как и в случае с метриками, графики можно просматривать по частям. В отличии от показателей, только участки для конкретного значения среза могут отображаться так tfma.SlicingSpec необходимо использовать , и он должен указать как имя функции среза и значение. Если нет ломтика не предусмотрен , то участки для Overall среза используются.

В приведенном ниже примере отображения CalibrationPlot и ConfusionMatrixPlot участки , которые были вычислены для 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…

Отслеживание производительности модели во времени

Ваш обучающий набор данных будет использоваться для обучения вашей модели и, будем надеяться, будет репрезентативным для вашего тестового набора данных и данных, которые будут отправлены в вашу модель в процессе производства. Однако, хотя данные в запросах на вывод могут оставаться такими же, как ваши обучающие данные, во многих случаях они начнут меняться в достаточной степени, так что производительность вашей модели изменится.

Это означает, что вам необходимо отслеживать и измерять производительность вашей модели на постоянной основе, чтобы вы могли быть в курсе изменений и реагировать на них. Давайте посмотрим, чем может помочь TFMA.

Давайте нагрузка 3 различных модели пробеги и использование TFMA , чтобы увидеть , как они соотносятся с использованием 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:absl:Tensorflow version (2.4.4) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.
WARNING:absl:Tensorflow version (2.4.4) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.
WARNING:absl:Tensorflow version (2.4.4) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.

Во-первых, представим, что вчера мы обучили и развернули нашу модель, а теперь хотим посмотреть, как она работает с новыми данными, поступающими сегодня. Визуализация начнется с отображения AUC. Из пользовательского интерфейса вы можете:

  • Добавьте другие показатели с помощью меню «Добавить серию показателей».
  • Закройте ненужные графики, нажав на x
  • Наведите указатель мыши на точки данных (концы отрезков линий на графике), чтобы получить более подробную информацию.
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…

Теперь представим, что прошел еще один день, и мы хотим посмотреть, как обстоят дела с новыми данными, поступающими сегодня, по сравнению с предыдущими двумя днями:

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…

Проверка модели

TFMA можно настроить для одновременной оценки нескольких моделей. Обычно это делается для сравнения новой модели с базовой линией (такой как текущая обслуживаемая модель), чтобы определить, какие различия в показателях производительности (например, AUC и т. Д.) Относятся к базовому уровню. Когда пороговые значения сконфигурированы, TFMA будет производить tfma.ValidationResult запись , указывающую , соответствует ли производительность expecations.

Давайте переконфигурируем нашу оценку keras, чтобы сравнить две модели: кандидатную и базовую. Мы также проверить производительность кандидата от базовой линии, установив tmfa.MetricThreshold на ППК метрике.

# 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:absl:Tensorflow version (2.4.4) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.

При выполнении оценок с одной или несколькими моделями относительно базовой линии, TFMA автоматически добавляет метрики сравнения для всех метрик, вычисленных во время оценки. Эти показатели были названы в честь соответствующей метрики , но с _diff приложенном к метрическим имени.

Давайте посмотрим на показатели, полученные в ходе нашего прогона:

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

Теперь давайте посмотрим на результаты наших проверок. Для просмотра результатов проверки мы используем tfma.load_validator_result . В нашем примере проверка не удалась, потому что AUC ниже порогового значения.

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