Часто задаваемые вопросы по анализу модели Tensorflow

Общий

EvalSavedModel все еще требуется?

Ранее TFMA требовал, чтобы все метрики хранились в тензорном графе с использованием специальной EvalSavedModel . Теперь метрики можно вычислять вне графа TF, используя реализации beam.CombineFn .

Вот некоторые из основных отличий:

  • Для EvalSavedModel требуется специальный экспорт из тренера, тогда как обслуживающая модель может использоваться без каких-либо изменений в коде обучения.
  • При использовании EvalSavedModel любые метрики, добавленные во время обучения, автоматически становятся доступными во время оценки. Без EvalSavedModel эти показатели необходимо добавить повторно.
    • Исключением из этого правила является то, что если используется модель keras, метрики также могут быть добавлены автоматически, поскольку keras сохраняет информацию о метриках вместе с сохраненной моделью.

Может ли TFMA работать как с метриками внутри графика, так и с внешними метриками?

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

Есть два случая:

  1. Используйте TFMA EvalSavedModel как для извлечения признаков, так и для вычисления метрик, а также добавляйте дополнительные метрики на основе объединителя. В этом случае вы получите все метрики в графе от EvalSavedModel вместе с любыми дополнительными метриками от объединителя, которые ранее могли не поддерживаться.
  2. Используйте TFMA EvalSavedModel для извлечения функций/прогнозов, но используйте метрики на основе объединителя для всех расчетов метрик. Этот режим полезен, если в EvalSavedModel присутствуют преобразования объектов, которые вы хотели бы использовать для нарезки, но предпочитаете выполнять все вычисления метрик вне графика.

Настраивать

Какие типы моделей поддерживаются?

TFMA поддерживает модели keras, модели, основанные на общих API-интерфейсах подписи TF2, а также модели, основанные на оценке TF (хотя в зависимости от варианта использования для моделей на основе оценки может потребоваться использование EvalSavedModel ).

См. руководство get_started для получения полного списка поддерживаемых типов моделей и любых ограничений.

Как настроить TFMA для работы с нативной моделью на основе keras?

Ниже приведен пример конфигурации для модели keras, основанный на следующих предположениях:

  • Сохраненная модель предназначена для обслуживания и использует имя подписи serving_default (это можно изменить с помощью model_specs[0].signature_name ).
  • Встроенные метрики из model.compile(...) должны быть оценены (это можно отключить с помощью options.include_default_metric в 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())

См. метрики для получения дополнительной информации о других типах метрик, которые можно настроить.

Как настроить TFMA для работы с общей моделью на основе подписей TF2?

Ниже приведен пример конфигурации для общей модели TF2. Ниже signature_name — это имя конкретной подписи, которую следует использовать для оценки.

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

См. метрики для получения дополнительной информации о других типах метрик, которые можно настроить.

Как настроить TFMA для работы с моделью, основанной на оценке?

В этом случае есть три варианта.

Вариант 1. Используйте модель обслуживания

Если используется этот параметр, то любые метрики, добавленные во время обучения, НЕ будут включены в оценку.

Ниже приведен пример конфигурации, предполагающий, что serving_default — это используемое имя подписи:

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

См. метрики для получения дополнительной информации о других типах метрик, которые можно настроить.

Вариант 2. Используйте EvalSavedModel вместе с дополнительными метриками на основе объединителя.

В этом случае используйте EvalSavedModel как для извлечения, так и для оценки функций/прогнозов, а также добавьте дополнительные метрики на основе объединителя.

Ниже приведен пример конфигурации:

from google.protobuf import text_format

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

См. метрики для получения дополнительных сведений о других типах метрик, которые можно настроить, и EvalSavedModel для получения дополнительных сведений о настройке EvalSavedModel.

Вариант 3. Используйте модель EvalSavedModel только для извлечения функций/прогнозов.

Аналогично варианту (2), но используйте EvalSavedModel только для извлечения признаков/прогнозов. Этот параметр полезен, если нужны только внешние метрики, но есть преобразования функций, которые вы хотели бы разделить. Аналогично варианту (1) любые показатели, добавленные во время обучения, НЕ будут включены в оценку.

В этом случае конфиг такой же, как и выше, только include_default_metrics отключен.

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

См. метрики для получения дополнительных сведений о других типах метрик, которые можно настроить, и EvalSavedModel для получения дополнительных сведений о настройке EvalSavedModel.

Как настроить TFMA для работы с моделью на основе модели keras для оценки?

Настройка keras model_to_estimator аналогична настройке оценщика. Однако есть несколько различий, характерных для того, как работает модель для оценки. В частности, model-to-esimtator возвращает свои выходные данные в виде словаря, где ключ словаря — это имя последнего выходного слоя в связанной модели keras (если имя не указано, keras выберет для вас имя по умолчанию). например, dense_1 или output_1 ). С точки зрения TFMA это поведение похоже на то, что было бы выведено для модели с несколькими выходами, даже если модель для оценки может быть только для одной модели. Чтобы учесть эту разницу, требуется дополнительный шаг для настройки выходного имени. Однако в качестве оценки применяются те же три параметра.

Ниже приведен пример изменений, необходимых для конфигурации на основе оценщика:

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

Как настроить TFMA для работы с предварительно рассчитанными (т.е. независимыми от модели) прогнозами? ( TFRecord и tf.Example )

Чтобы настроить TFMA для работы с предварительно рассчитанными прогнозами, tfma.PredictExtractor по умолчанию должен быть отключен, а tfma.InputExtractor должен быть настроен для анализа прогнозов вместе с другими входными функциями. Это достигается путем настройки tfma.ModelSpec с именем функционального ключа, используемого для прогнозов, наряду с метками и весами.

Ниже приведен пример настройки:

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

См. метрики для получения дополнительной информации о метриках, которые можно настроить.

Обратите внимание, что хотя tfma.ModelSpec настраивается, модель на самом деле не используется (т.е. tfma.EvalSharedModel отсутствует). Вызов запуска анализа модели может выглядеть следующим образом:

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

Как настроить TFMA для работы с предварительно рассчитанными (т.е. независимыми от модели) прогнозами? ( pd.DataFrame )

Для небольших наборов данных, которые могут поместиться в памяти, альтернативой TFRecord является pandas.DataFrame s. TFMA может работать с pandas.DataFrame с помощью API tfma.analyze_raw_data . Объяснение tfma.MetricsSpec и tfma.SlicingSpec см. в руководстве по установке . См. метрики для получения дополнительной информации о метриках, которые можно настроить.

Ниже приведен пример настройки:

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

Метрики

Какие типы метрик поддерживаются?

TFMA поддерживает широкий спектр показателей, включая:

Поддерживаются ли метрики из моделей с несколькими выходами?

Да. Подробнее см. в руководстве по метрикам .

Поддерживаются ли метрики из нескольких моделей?

Да. Подробнее см. в руководстве по метрикам .

Можно ли настроить параметры метрики (имя и т. д.)?

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

Поддерживаются ли пользовательские метрики?

Да. Либо написав собственную реализацию tf.keras.metrics.Metric , либо написав собственную реализацию beam.CombineFn . Руководство по метрикам содержит более подробную информацию.

Какие типы показателей не поддерживаются?

Пока ваша метрика может быть рассчитана с использованием beam.CombineFn , нет никаких ограничений на типы метрик, которые могут быть вычислены на основе tfma.metrics.Metric . Если вы работаете с метрикой, полученной из tf.keras.metrics.Metric , должны быть выполнены следующие критерии:

  • Должна быть возможность вычислить достаточную статистику для метрики для каждого примера независимо, затем объединить эти достаточные статистические данные, добавив их по всем примерам, и определить значение метрики исключительно на основе этих достаточных статистических данных.
  • Например, для точности достаточно статистики "всего правильных" и "всего примеров". Можно вычислить эти два числа для отдельных примеров и сложить их для группы примеров, чтобы получить правильные значения для этих примеров. Окончательная точность может быть рассчитана с использованием «всего правильных/всего примеров».

Дополнения

Могу ли я использовать TFMA для оценки справедливости или предвзятости в моей модели?

TFMA включает надстройку FairnessIndicators , которая предоставляет постэкспортные метрики для оценки последствий непреднамеренной систематической ошибки в моделях классификации.

Настройка

Что делать, если мне нужно больше настроек?

TFMA очень гибкий и позволяет настраивать практически все части конвейера с помощью пользовательских Extractors , Evaluators и/или Writers записи. Эти абстракции обсуждаются более подробно в архитектурном документе.

Устранение неполадок, отладка и получение помощи

Почему метрики MultiClassConfusionMatrix не соответствуют бинаризованным метрикам ConfusionMatrix

На самом деле это разные расчеты. Бинаризация выполняет сравнение для каждого идентификатора класса независимо (т. е. предсказание для каждого класса сравнивается отдельно с предоставленными пороговыми значениями). В этом случае два или более классов могут указать, что они соответствуют прогнозу, поскольку их прогнозируемое значение было больше порогового значения (это будет еще более очевидным при более низких пороговых значениях). В случае многоклассовой матрицы путаницы по-прежнему есть только одно истинное прогнозируемое значение, и оно либо соответствует фактическому значению, либо нет. Порог используется только для того, чтобы заставить прогноз не соответствовать ни одному классу, если он меньше порога. Чем выше порог, тем сложнее совпасть предсказанию бинаризованного класса. Точно так же, чем ниже порог, тем легче совпасть прогнозам бинаризованного класса. Это означает, что при пороговых значениях > 0,5 бинаризованные значения и значения матрицы мультикласса будут ближе друг к другу, а при пороговых значениях <0,5 они будут дальше друг от друга.

Например, допустим, у нас есть 10 классов, где класс 2 был предсказан с вероятностью 0,8, но фактический класс был классом 1 с вероятностью 0,15. Если вы выполняете бинаризацию по классу 1 и используете пороговое значение 0,1, то класс 1 будет считаться правильным (0,15 > 0,1), поэтому он будет считаться TP. Однако для мультиклассового случая правильным будет считаться класс 2 (0,8 > 0.1) и, поскольку класс 1 был фактическим, это будет считаться FN. Поскольку при более низких пороговых значениях больше значений будут считаться положительными, в целом для бинаризованной матрицы путаницы будут более высокие значения TP и FP, чем для мультиклассовой матрицы путаницы, и аналогично более низкие TN и FN.

Ниже приведен пример наблюдаемых различий между MultiClassConfusionMatrixAtThresholds и соответствующими счетчиками при бинаризации одного из классов.

MultiClassConfusionMatrixAtThresholds против бинаризованного

Почему мои показатели точности@1 и отзыва@1 имеют одинаковое значение?

При максимальном значении k, равном 1, точность и полнота — одно и то же. Точность равна TP / (TP + FP) , а полнота равна TP / (TP + FN) . Верхний прогноз всегда положительный и будет либо соответствовать, либо не соответствовать метке. Другими словами, с N примерами TP + FP = N . Однако, если метка не соответствует верхнему предсказанию, это также означает, что совпало предсказание, отличное от k, и если для верхнего k установлено значение 1, все предсказания, отличные от 1, будут равны 0. Это означает, что FN должно быть (N - TP) или N = TP + FN . Конечный результат: precision@1 = TP / N = recall@1 . Обратите внимание, что это применимо только при наличии одной метки для каждого примера, а не для нескольких меток.

Почему мои показатели mean_label и mean_prediction всегда равны 0,5?

Скорее всего, это вызвано тем, что метрики настроены для проблемы бинарной классификации, но модель выводит вероятности для обоих классов, а не только для одного. Это обычное дело, когда используется API классификации tensorflow . Решение состоит в том, чтобы выбрать класс, на котором должны основываться прогнозы, а затем выполнить бинаризацию этого класса. Например:

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

Как интерпретировать MultiLabelConfusionMatrixPlot?

Учитывая конкретную метку, MultiLabelConfusionMatrixPlot (и связанную с ней MultiLabelConfusionMatrix ) можно использовать для сравнения результатов других меток и их прогнозов, когда выбранная метка была действительно верной. Например, предположим, что у нас есть три класса bird , plane и superman , и мы классифицируем изображения, чтобы указать, содержат ли они один или несколько из этих классов. MultiLabelConfusionMatrix будет вычислять декартово произведение каждого фактического класса на каждый другой класс (называемый прогнозируемым классом). Обратите внимание, что в то время как спаривание (actual, predicted) , predicted класс не обязательно подразумевает положительный прогноз, он просто представляет прогнозируемый столбец в фактической и прогнозируемой матрице. Например, предположим, что мы вычислили следующие матрицы:

   (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 имеет три способа отображения этих данных. Во всех случаях способ чтения таблицы — строка за строкой с точки зрения фактического класса.

1) Общее количество прогнозов

В этом случае для данной строки (т.е. фактического класса) каковы были TP + FP для других классов. Для подсчетов выше наш дисплей будет следующим:

Предсказанная птица Прогнозируемый самолет Предсказанный супермен
Настоящая птица 6 4 2
Фактический самолет 4 4 4
Настоящий супермен 5 5 4

Когда на картинках действительно была bird , мы правильно предсказали 6 из них. В то же время мы также предсказали plane (правильно или неправильно) 4 раза и superman (или правильно или неправильно) 2 раза.

2) Неверный подсчет прогнозов

В этом случае для данной строки (т.е. фактического класса) каковы были FP для других классов. Для подсчетов выше наш дисплей будет следующим:

Предсказанная птица Прогнозируемый самолет Предсказанный супермен
Настоящая птица 0 2 1
Фактический самолет 1 0 3
Настоящий супермен 2 3 0

Когда на картинках действительно была bird , мы неправильно предсказали plane 2 раза и superman 1 раз.

3) Ложноотрицательный подсчет

В этом случае для данной строки (т.е. фактического класса) каковы были FN для других классов. Для подсчетов выше наш дисплей будет следующим:

Предсказанная птица Прогнозируемый самолет Предсказанный супермен
Настоящая птица 2 2 4
Фактический самолет 1 4 3
Настоящий супермен 2 2 5

Когда на картинках действительно была bird , мы не смогли ее предсказать 2 раза. В то же время нам не удалось предсказать plane 2 раза и superman 4 раза.

Почему я получаю сообщение об ошибке о том, что ключ предсказания не найден?

Некоторые модели выводят свой прогноз в виде словаря. Например, оценщик TF для задачи бинарной классификации выводит словарь, содержащий probabilities , class_ids и т. д. В большинстве случаев TFMA имеет значения по умолчанию для поиска часто используемых имен ключей, таких как predictions , probabilities и т. д. Однако, если ваша модель сильно настроена, она может выводить ключи под именами, неизвестными TFMA. В этих случаях параметр prediciton_key должен быть добавлен в tfma.ModelSpec , чтобы указать имя ключа, под которым хранится вывод.