¡El Día de la Comunidad de ML es el 9 de noviembre! Únase a nosotros para recibir actualizaciones de TensorFlow, JAX, y más Más información

Análisis del modelo de Tensorflow Preguntas frecuentes

General

¿Sigue siendo necesario un EvalSavedModel?

Anteriormente TFMA requiere todas las métricas para ser almacenados dentro de un gráfico tensorflow usando un especial EvalSavedModel . Ahora, las métricas pueden ser calculados fuera de la gráfica TF usando beam.CombineFn implementaciones.

Algunas de las principales diferencias son:

  • Un EvalSavedModel requiere una exportación especial por parte del entrenador mientras que un modelo que sirve se puede utilizar sin ningún tipo de cambios necesarios para el código de la formación.
  • Cuando un EvalSavedModel se utiliza, las métricas añadido en el momento de formación están disponibles automáticamente en el momento de la evaluación. Sin un EvalSavedModel estos indicadores deben ser re-agregado.
    • La excepción a esta regla es que si se utiliza un modelo de keras, las métricas también se pueden agregar automáticamente porque keras guarda la información de la métrica junto con el modelo guardado.

¿TFMA puede funcionar tanto con métricas en gráfico como con métricas externas?

TFMA permite utilizar un enfoque híbrido en el que algunas métricas se pueden calcular en el gráfico, mientras que otras se pueden calcular en el exterior. Si actualmente tiene un EvalSavedModel a continuación, puede seguir utilizándolo.

Hay dos casos:

  1. Uso TFMA EvalSavedModel tanto para extracción de características y cómputos métricos, sino también añadir indicadores adicionales basados en combinador. En este caso se podrían obtener todas las métricas en-gráfico de la EvalSavedModel junto con las métricas adicionales del combinador basado en que podría no haber sido previamente admitidos.
  2. Uso TFMA EvalSavedModel para la función / extracción de predicción sino el uso de métricas basadas en combinador para todos los cálculos de métricas. Este modo es útil si hay transformaciones de funciones presentes en el EvalSavedModel que le gustaría utilizar para cortar en rodajas, pero preferir realizar todos los cálculos métricos fuera del gráfico.

Configuración

¿Qué tipos de modelos son compatibles?

Soportes TFMA Keras modelos, los modelos basados en APIs de firma TF2 genéricos, como modelos basados bien TF estimador (aunque dependiendo del caso de uso del estimador de modelos basados pueden requerir un EvalSavedModel a utilizar).

Ver get_started guía para la lista completa de los tipos de modelos soportados y ninguna restricción.

¿Cómo configuro TFMA para que funcione con un modelo nativo basado en keras?

La siguiente es una configuración de ejemplo para un modelo de keras basada en las siguientes suposiciones:

  • Modelo guardado es para servir y utiliza el nombre de la firma serving_default (esto se puede cambiar usando model_specs[0].signature_name ).
  • Construido en las métricas de model.compile(...) deben ser evaluados (esto puede ser desactivado a través options.include_default_metric dentro del 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())

Ver las métricas para obtener más información acerca de otros tipos de métricas que se pueden configurar.

¿Cómo configuro TFMA para que funcione con un modelo genérico basado en firmas TF2?

La siguiente es una configuración de ejemplo para un modelo TF2 genérico. A continuación, signature_name es el nombre de la firma específica que se debe utilizar para la evaluación.

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

Ver las métricas para obtener más información acerca de otros tipos de métricas que se pueden configurar.

¿Cómo configuro TFMA para que funcione con un modelo basado en estimador?

En este caso hay tres opciones.

Opción 1: Utilice el modelo de publicación

Si se utiliza esta opción, las métricas agregadas durante la capacitación NO se incluirán en la evaluación.

El siguiente es un ejemplo config suponiendo serving_default se utiliza el nombre de la firma:

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

Ver las métricas para obtener más información acerca de otros tipos de métricas que se pueden configurar.

Option2: Use EvalSavedModel junto con métricas adicionales basadas en combinador

En este caso, utilizar EvalSavedModel tanto para característica de extracción / predicción y evaluación y también añadir métricas basadas combinador adicional.

La siguiente es una configuración de ejemplo:

from google.protobuf import text_format

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

Ver las métricas para obtener más información acerca de otros tipos de métricas que se pueden configurar y EvalSavedModel para obtener más información sobre la configuración de la EvalSavedModel.

Option3: Use EvalSavedModel Model solo para extracción de características / predicciones

Similar a la opción (2), pero sólo utilizar EvalSavedModel para la extracción de características / predicción. Esta opción es útil si solo se desean métricas externas, pero hay transformaciones de características que le gustaría analizar. Al igual que en la opción (1), las métricas agregadas durante la capacitación NO se incluirán en la evaluación.

En este caso la configuración es la misma que la anterior sólo include_default_metrics está desactivado.

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

Ver las métricas para obtener más información acerca de otros tipos de métricas que se pueden configurar y EvalSavedModel para obtener más información sobre la configuración de la EvalSavedModel.

¿Cómo configuro TFMA para que funcione con un modelo basado en modelo a estimador de Keras?

El Keras model_to_estimator configuración es similar a la confiugration estimador. Sin embargo, existen algunas diferencias específicas sobre cómo funciona el modelo al estimador. En particular, el model-to-esimtator devuelve sus salidas en forma de dict donde la clave dict es el nombre de la última capa de salida en el modelo de keras asociado (si no se proporciona un nombre, keras elegirá un nombre predeterminado para usted tales como dense_1 o output_1 ). Desde una perspectiva de TFMA, este comportamiento es similar al que se obtendría para un modelo de múltiples resultados, aunque el modelo al estimador puede ser solo para un modelo único. Para tener en cuenta esta diferencia, se requiere un paso adicional para configurar el nombre de salida. Sin embargo, se aplican las mismas tres opciones como estimador.

El siguiente es un ejemplo de los cambios necesarios para una configuración basada en estimador:

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

¿Cómo configuro TFMA para que funcione con predicciones precalculadas (es decir, independientes del modelo)? ( TFRecord y tf.Example )

Con el fin de configurar TFMA al trabajo con las predicciones pre-calculados, el valor predeterminado tfma.PredictExtractor debe ser desactivado y el tfma.InputExtractor debe estar configurado para analizar las predicciones junto con las otras características de entrada. Esto se logra mediante la configuración de un tfma.ModelSpec con el nombre de la tecla de función utilizado para las predicciones junto de las etiquetas y pesos.

La siguiente es una configuración de ejemplo:

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

Ver las métricas para obtener más información acerca de las métricas que se pueden configurar.

Tenga en cuenta que una Altough tfma.ModelSpec se está configurando en realidad no se está utilizando un modelo (es decir, no hay tfma.EvalSharedModel ). La llamada para ejecutar el análisis del modelo podría tener el siguiente aspecto:

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

¿Cómo configuro TFMA para que funcione con predicciones precalculadas (es decir, independientes del modelo)? ( pd.DataFrame )

Para los pequeños conjuntos de datos que pueden caber en la memoria, una alternativa a un TFRecord es un pandas.DataFrame s. TFMA puede operar en pandas.DataFrame s utilizando el tfma.analyze_raw_data API. Para una explicación de tfma.MetricsSpec y tfma.SlicingSpec , consulte la configuración de guía. Ver las métricas para obtener más información acerca de las métricas que se pueden configurar.

La siguiente es una configuración de ejemplo:

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

Métrica

¿Qué tipos de métricas son compatibles?

TFMA admite una amplia variedad de métricas que incluyen:

¿Se admiten métricas de modelos de múltiples salidas?

sí. Ver las métricas de guía para obtener más detalles.

¿Se admiten las métricas de varios modelos?

sí. Ver las métricas de guía para obtener más detalles.

¿Se pueden personalizar las configuraciones de métricas (nombre, etc.)?

sí. Configuración métricas pueden ser personalizadas (por ejemplo, umbrales específicos de ajuste, etc.) mediante la adición config la configuración a la configuración métrica. Ver métricas guía tiene más detalles.

¿Se admiten las métricas personalizadas?

sí. Ya sea escribiendo una costumbre tf.keras.metrics.Metric aplicación o escribiendo una costumbre beam.CombineFn aplicación. El métricas guía tiene más detalles.

¿Qué tipos de métricas no son compatibles?

Mientras su métrica se puede calcular utilizando un beam.CombineFn , no hay restricciones sobre los tipos de indicadores que pueden calcularse sobre la base de tfma.metrics.Metric . Si se trabaja con una métrica derivada de tf.keras.metrics.Metric continuación, se deben cumplir los siguientes criterios:

  • Debería ser posible calcular estadísticas suficientes para la métrica en cada ejemplo de forma independiente, luego combinar estas estadísticas suficientes agregándolas en todos los ejemplos y determinar el valor de la métrica únicamente a partir de estas estadísticas suficientes.
  • Por ejemplo, para mayor precisión, las estadísticas suficientes son "total correcto" y "total de ejemplos". Es posible calcular estos dos números para ejemplos individuales y sumarlos para un grupo de ejemplos para obtener los valores correctos para esos ejemplos. La precisión final se puede calcular utilizando "ejemplos totales correctos / totales".

Complementos

¿Puedo usar TFMA para evaluar la equidad o el sesgo en mi modelo?

TFMA incluye un FairnessIndicators complemento que proporciona métricas post-exportación para evaluar los efectos de sesgo no intencionado en modelos de clasificación.

Personalización

¿Qué pasa si necesito más personalización?

TFMA es muy flexibile y le permite personalizar casi todas las partes de la tubería utilizando personalizados Extractors , Evaluators , y / o Writers . Estos abstrations se discusssed con más detalle en la arquitectura de documento.

Solución de problemas, depuración y obtención de ayuda

¿Por qué las métricas de MultiClassConfusionMatrix no coinciden con las métricas binarizadas de ConfusionMatrix?

En realidad, se trata de cálculos diferentes. La binarización realiza una comparación para cada ID de clase de forma independiente (es decir, la predicción para cada clase se compara por separado con los umbrales proporcionados). En este caso, es posible que dos o más clases indiquen todas que coincidieron con la predicción porque su valor predicho fue mayor que el umbral (esto será aún más evidente en umbrales más bajos). En el caso de la matriz de confusión multiclase, todavía hay solo un valor predicho verdadero y coincide con el valor real o no. El umbral solo se utiliza para forzar que una predicción no coincida con ninguna clase si es menor que el umbral. Cuanto mayor sea el umbral, más difícil será que coincida la predicción de una clase binarizada. Del mismo modo, cuanto más bajo sea el umbral, más fácil será que coincidan las predicciones de una clase binarizada. Esto significa que en umbrales> 0,5 los valores binarizados y los valores de la matriz multiclase estarán más alineados y en umbrales <0,5 estarán más separados.

Por ejemplo, digamos que tenemos 10 clases en las que se predijo la clase 2 con una probabilidad de 0,8, pero la clase real era la clase 1, que tenía una probabilidad de 0,15. Si binariza en la clase 1 y usa un umbral de 0.1, entonces la clase 1 se considerará correcta (0.15> 0.1) por lo que se contará como un TP. Sin embargo, para el caso multiclase, la clase 2 se considerará correcta (0.8> 0.1) y dado que la clase 1 era la real, esto se contará como FN. Debido a que en umbrales más bajos, más valores se considerarán positivos, en general habrá mayores recuentos de TP y FP para la matriz de confusión binarizada que para la matriz de confusión multiclase, y TN y FN igualmente más bajos.

El siguiente es un ejemplo de las diferencias observadas entre MultiClassConfusionMatrixAtThresholds y los conteos correspondientes de la binarización de una de las clases.

MultiClassConfusionMatrixAtThresholds frente a binarizado

¿Por qué mis métricas de precisión @ 1 y recuperación @ 1 tienen el mismo valor?

En un valor k superior de 1, la precisión y la recuperación son lo mismo. La precisión es igual a TP / (TP + FP) y la recuperación es igual a TP / (TP + FN) . La predicción superior siempre es positiva y coincidirá o no con la etiqueta. En otras palabras, con N ejemplos, TP + FP = N . Sin embargo, si la etiqueta no coincide con la predicción de la parte superior, a continuación, esto también implica una predicción no superior k fue emparejado y con el conjunto de k superior a 1, todas las predicciones no superior 1 será 0. Esto implica FN debe ser (N - TP) o N = TP + FN . El resultado final es precision@1 = TP / N = recall@1 . Tenga en cuenta que esto solo se aplica cuando hay una sola etiqueta por ejemplo, no para etiquetas múltiples.

¿Por qué mis métricas mean_label y mean_prediction siempre son 0,5?

Lo más probable es que esto se deba a que las métricas están configuradas para un problema de clasificación binaria, pero el modelo genera probabilidades para ambas clases en lugar de solo una. Esto es común cuando la clasificación API de tensorflow se utiliza. La solución es elegir la clase en la que le gustaría que se basen las predicciones y luego binarizar en esa clase. Por ejemplo:

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

¿Cómo interpretar el MultiLabelConfusionMatrixPlot?

Dada una etiqueta particular, la MultiLabelConfusionMatrixPlot (y asociado MultiLabelConfusionMatrix ) puede utilizarse para comparar los resultados de otras etiquetas y sus predicciones cuando la etiqueta elegida fue realmente cierto. Por ejemplo, digamos que tenemos tres clases bird , plane , y superman y estamos clasificando imágenes para indicar si contienen uno o más de cualquiera de estas clases. El MultiLabelConfusionMatrix calculará el producto cartesiano de cada clase real contra la otra clase (denominada clase predicho). Tenga en cuenta que mientras que el emparejamiento es (actual, predicted) , la predicted clase no implica necesariamente una predicción positiva, representa simplemente la columna predicho en el actual vs matriz predicho. Por ejemplo, digamos que hemos calculado las siguientes matrices:

   (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

El MultiLabelConfusionMatrixPlot tiene tres formas de mostrar estos datos. En todos los casos, la forma de leer la tabla es fila por fila desde la perspectiva de la clase real.

1) Recuento total de predicciones

En este caso, para una fila dada (es decir, clase real) lo fueron los TP + FP recuentos para las otras clases. Para los recuentos anteriores, nuestra visualización sería la siguiente:

Pájaro predicho Plano previsto Superman predicho
Pájaro real 6 4 2
Plano real 4 4 4
Superman real 5 5 4

Cuando las imágenes en realidad contenían un bird que predijo correctamente 6 de ellos. Al mismo tiempo, también predijimos plane (ya sea correcta o erróneamente) 4 veces y superman (ya sea correcta o erróneamente) 2 veces.

2) Recuento de predicciones incorrecto

En este caso, para una fila dada (es decir, clase real) lo fueron los FP recuentos para las otras clases. Para los recuentos anteriores, nuestra visualización sería la siguiente:

Pájaro predicho Plano previsto Superman predicho
Pájaro real 0 2 1
Plano real 1 0 3
Superman real 2 3 0

Cuando las imágenes en realidad contenían un bird que predicho incorrectamente plane 2 veces y superman 1 veces.

3) Recuento de falsos negativos

En este caso, para una fila dada (es decir, clase real) cuáles eran las FN recuentos para las otras clases. Para los recuentos anteriores, nuestra visualización sería la siguiente:

Pájaro predicho Plano previsto Superman predicho
Pájaro real 2 2 4
Plano real 1 4 3
Superman real 2 2 5

Cuando las imágenes en realidad contenían un bird pero no hemos podido predecirlo 2 veces. Al mismo tiempo, no hemos podido predecir plane 2 veces y superman 4 veces.

¿Por qué obtengo un error sobre la clave de predicción no encontrada?

Algunos modelos generan su predicción en forma de diccionario. Por ejemplo, un estimador del TF para el problema de clasificación binaria da salida a un diccionario que contiene probabilities , class_ids , etc. En la mayoría de los casos TFMA tiene valores por defecto para la búsqueda de nombres de teclas utilizadas commomly como predictions , probabilities , etc. Sin embargo, si su modelo es muy personalizarse fuere claves de salida con nombres desconocidos por TFMA. En los casos de tesis un prediciton_key ajuste debe ser añadido a la tfma.ModelSpec para identificar el nombre de la clave de la salida se almacena bajo.