Unisciti alla comunità SIG TFX-Addons e contribuisci a rendere TFX ancora migliore!

Domande frequenti sull'analisi del modello Tensorflow

Generale

È ancora necessario un EvalSavedModel?

In precedenza TFMA richiedeva che tutte le metriche fossero memorizzate in un grafico tensorflow utilizzando uno speciale EvalSavedModel . Ora, le metriche possono essere calcolate al di fuori del grafico TF utilizzando beam.CombineFn implementazioni beam.CombineFn .

Alcune delle principali differenze sono:

  • Un EvalSavedModel richiede EvalSavedModel speciale dal trainer mentre un modello di servizio può essere utilizzato senza alcuna modifica richiesta al codice di formazione.
  • Quando viene utilizzato un EvalSavedModel , tutte le metriche aggiunte al momento dell'addestramento sono automaticamente disponibili al momento della valutazione. Senza EvalSavedModel queste metriche devono essere aggiunte di nuovo.
    • L'eccezione a questa regola è che se viene utilizzato un modello keras, le metriche possono anche essere aggiunte automaticamente perché keras salva le informazioni metriche insieme al modello salvato.

TFMA può funzionare sia con le metriche nel grafico che con le metriche esterne?

TFMA consente di utilizzare un approccio ibrido in cui alcune metriche possono essere calcolate in-graph mentre altre possono essere calcolate all'esterno. Se attualmente hai un EvalSavedModel , puoi continuare a usarlo.

Ci sono due casi:

  1. Usa TFMA EvalSavedModel sia per l'estrazione delle caratteristiche che per i calcoli metrici, ma aggiungi anche ulteriori metriche basate su combinatore. In questo caso si otterrebbero tutte le metriche nel grafico da EvalSavedModel insieme a qualsiasi metrica aggiuntiva basata su combinatore che potrebbe non essere stata supportata in precedenza.
  2. Usa TFMA EvalSavedModel per l' EvalSavedModel di funzioni / previsioni, ma usa metriche basate su combinatore per tutti i calcoli delle metriche. Questa modalità è utile se in EvalSavedModel sono presenti trasformazioni di EvalSavedModel che si desidera utilizzare per la EvalSavedModel in EvalSavedModel , ma si preferisce eseguire tutti i calcoli metrici all'esterno del grafico.

Impostare

Quali tipi di modello sono supportati?

TFMA supporta modelli keras, modelli basati su API di firma TF2 generiche, nonché modelli basati su stimatore TF (sebbene, a seconda del caso d'uso, i modelli basati sullo stimatore possano richiedere l' EvalSavedModel di EvalSavedModel ).

Consulta la guida get_started per l'elenco completo dei tipi di modello supportati e le eventuali limitazioni.

Come imposto TFMA per lavorare con un modello basato su keras nativo?

Di seguito è riportato un esempio di configurazione per un modello keras basato sui seguenti presupposti:

  • Il modello salvato è per la pubblicazione e utilizza il nome della firma serving_default (può essere modificato utilizzando model_specs[0].signature_name ).
  • Le metriche integrate da model.compile(...) dovrebbero essere valutate (questo può essere disabilitato tramite options.include_default_metric all'interno di 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())

Consulta le metriche per ulteriori informazioni su altri tipi di metriche che possono essere configurate.

Come imposto TFMA per lavorare con un modello generico basato su firme TF2?

Di seguito è riportato un esempio di configurazione per un modello TF2 generico. Di seguito, signature_name è il nome della firma specifica da utilizzare per la valutazione.

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

Consulta le metriche per ulteriori informazioni su altri tipi di metriche che possono essere configurate.

Come imposto TFMA per lavorare con un modello basato su stimatore?

In questo caso ci sono tre scelte.

Opzione 1: utilizzare il modello di pubblicazione

Se si utilizza questa opzione, le eventuali metriche aggiunte durante la formazione NON verranno incluse nella valutazione.

Di seguito è riportato un esempio di configurazione che presuppone che serving_default sia il nome della firma utilizzato:

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

Consulta le metriche per ulteriori informazioni su altri tipi di metriche che possono essere configurate.

Opzione 2: utilizzare EvalSavedModel insieme a metriche aggiuntive basate su combinatore

In questo caso, usa EvalSavedModel sia per l'estrazione di funzionalità / previsione che per la valutazione e aggiungi anche ulteriori metriche basate sul combinatore.

Quello che segue è un esempio di configurazione:

from google.protobuf import text_format

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

Vedere le metriche per ulteriori informazioni su altri tipi di metriche che possono essere configurate e EvalSavedModel per ulteriori informazioni sulla configurazione di EvalSavedModel.

Opzione 3: utilizzare EvalSavedModel Model solo per Feature / Prediction Extraction

Simile all'opzione (2), ma usa solo EvalSavedModel per l'estrazione di funzioni / previsioni. Questa opzione è utile se si desiderano solo metriche esterne, ma ci sono trasformazioni di funzionalità su cui si desidera suddividere. Analogamente all'opzione (1), qualsiasi metrica aggiunta durante la formazione NON sarà inclusa nella valutazione.

In questo caso la configurazione è la stessa di cui sopra, solo include_default_metrics è disabilitato.

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

Vedere le metriche per ulteriori informazioni su altri tipi di metriche che possono essere configurate e EvalSavedModel per ulteriori informazioni sulla configurazione di EvalSavedModel.

Come imposto TFMA per lavorare con un modello basato su modello keras per stimatore?

La configurazione di keras model_to_estimator è simile alla configurazione dello stimatore. Tuttavia ci sono alcune differenze specifiche su come funziona da modello a stimatore. In particolare, il modello da simulatore restituisce i suoi output sotto forma di un dict dove la chiave dictèil nome dell'ultimo livello di output nel modello keras associato (se non viene fornito alcun nome, keras sceglierà un nome predefinito per te come dense_1 o output_1 ). Da una prospettiva TFMA, questo comportamento è simile a quello che sarebbe prodotto per un modello multi-output anche se il modello per lo stimatore può essere solo per un singolo modello. Per tenere conto di questa differenza, è necessario un passaggio aggiuntivo per impostare il nome dell'output. Tuttavia, le stesse tre opzioni si applicano come stimatore.

Quello che segue è un esempio delle modifiche richieste a una configurazione basata su stimatore:

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

Come imposto TFMA per lavorare con previsioni precalcolate (cioè indipendenti dal modello)? ( TFRecord e tf.Example )

Per configurare TFMA in modo che funzioni con previsioni precalcolate, il tfma.PredictExtractor predefinito deve essere disabilitato e tfma.InputExtractor deve essere configurato per analizzare le previsioni insieme alle altre funzionalità di input. Ciò si ottiene configurando un tfma.ModelSpec con il nome della chiave di funzione utilizzata per le previsioni accanto alle etichette e ai pesi.

Quello che segue è un esempio di configurazione:

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

Consulta le metriche per ulteriori informazioni sulle metriche che possono essere configurate.

Notare che anche se si sta configurando un tfma.ModelSpec , un modello non viene effettivamente utilizzato (cioè non c'è tfma.EvalSharedModel ). La chiamata per eseguire l'analisi del modello potrebbe essere la seguente:

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

Come imposto TFMA per lavorare con previsioni precalcolate (cioè indipendenti dal modello)? ( pd.DataFrame )

Per piccoli set di dati che possono entrare in memoria, un'alternativa a TFRecord è un pandas.DataFrame s. TFMA può operare su pandas.DataFrame utilizzando l'API tfma.analyze_raw_data . Per una spiegazione di tfma.MetricsSpec e tfma.SlicingSpec , vedere la guida all'installazione . Consulta le metriche per ulteriori informazioni sulle metriche che possono essere configurate.

Quello che segue è un esempio di configurazione:

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

Metrica

Quali tipi di metriche sono supportati?

TFMA supporta un'ampia varietà di metriche, tra cui:

Le metriche dei modelli multi-output sono supportate?

Sì. Consulta la guida alle metriche per maggiori dettagli.

Le metriche di più modelli sono supportate?

Sì. Consulta la guida alle metriche per maggiori dettagli.

È possibile personalizzare le impostazioni della metrica (nome, ecc.)?

Sì. Le impostazioni delle metriche possono essere personalizzate (ad es. Impostazione di soglie specifiche, ecc.) Aggiungendo impostazioni di config alla configurazione della metrica. Vedere la guida alle metriche ha maggiori dettagli

Le metriche personalizzate sono supportate?

Sì. O scrivendo tf.keras.metrics.Metric personalizzata tf.keras.metrics.Metric o scrivendo beam.CombineFn personalizzata beam.CombineFn . La guida alle metriche contiene maggiori dettagli.

Quali tipi di metriche non sono supportati?

Finché la tua metrica può essere calcolata utilizzando un beam.CombineFn , non ci sono restrizioni sui tipi di metriche che possono essere calcolate in base a tfma.metrics.Metric . Se si lavora con una metrica derivata da tf.keras.metrics.Metric , è necessario soddisfare i seguenti criteri:

  • Dovrebbe essere possibile calcolare statistiche sufficienti per la metrica su ciascun esempio in modo indipendente, quindi combinare queste statistiche sufficienti aggiungendole in tutti gli esempi e determinare il valore della metrica esclusivamente da queste statistiche sufficienti.
  • Ad esempio, per la precisione le statistiche sufficienti sono "totale corretto" e "esempi totali". È possibile calcolare questi due numeri per singoli esempi e sommarli per un gruppo di esempi per ottenere i valori corretti per quegli esempi. La precisione finale può essere calcolata utilizzando "esempi totali corretti / totali".

Componenti aggiuntivi

Posso usare TFMA per valutare l'equità o il bias nel mio modello?

TFMA include un componente aggiuntivo FairnessIndicators che fornisce metriche post-esportazione per valutare gli effetti di bias non intenzionali nei modelli di classificazione.

Personalizzazione

E se avessi bisogno di maggiore personalizzazione?

TFMA è molto flessibile e consente di personalizzare quasi tutte le parti della pipeline utilizzando Extractors , Evaluators e / o Writers . Queste astrazioni sono discusse in maggior dettaglio nel documento sull'architettura .

Risoluzione dei problemi, debug e assistenza

Perché le metriche MultiClassConfusionMatrix non corrispondono alle metriche ConfusionMatrix binarizzate

Questi sono in realtà calcoli diversi. La binarizzazione esegue un confronto per ogni ID classe in modo indipendente (ovvero la previsione per ogni classe viene confrontata separatamente rispetto alle soglie fornite). In questo caso è possibile che due o più classi indichino tutte la corrispondenza con la previsione perché il loro valore previsto era maggiore della soglia (questo sarà ancora più evidente alle soglie inferiori). Nel caso della matrice di confusione multiclasse, esiste ancora un solo valore previsto vero e corrisponde al valore effettivo oppure no. La soglia viene utilizzata solo per forzare una previsione a non corrispondere a nessuna classe se è inferiore alla soglia. Maggiore è la soglia, più difficile sarà la corrispondenza della previsione di una classe binarizzata. Allo stesso modo, più bassa è la soglia, più facile è che le previsioni di una classe binarizzata corrispondano. Ciò significa che alle soglie> 0,5 i valori binarizzati e i valori della matrice multiclasse saranno allineati più vicini e alle soglie <0,5 saranno più distanti.

Ad esempio, supponiamo di avere 10 classi in cui la classe 2 era prevista con una probabilità di 0,8, ma la classe effettiva era la classe 1 che aveva una probabilità di 0,15. Se binarizzi sulla classe 1 e utilizzi una soglia di 0,1, la classe 1 sarà considerata corretta (0,15> 0,1) quindi verrà conteggiata come TP, tuttavia, per il caso multiclasse, la classe 2 sarà considerata corretta (0,8> 0.1) e poiché la classe 1 era quella effettiva, verrà conteggiata come FN. Poiché a soglie inferiori più valori saranno considerati positivi, in generale ci saranno conteggi TP e FP più elevati per la matrice di confusione binarizzata rispetto alla matrice di confusione multiclasse, e allo stesso modo TN e FN inferiori.

Di seguito è riportato un esempio delle differenze osservate tra MultiClassConfusionMatrixAtThresholds e i conteggi corrispondenti dalla binarizzazione di una delle classi.

MultiClassConfusionMatrixAtThresholds vs Binarized

Perché le mie metriche precisione @ 1 e richiamo @ 1 hanno lo stesso valore?

A un valore k superiore di 1 precisione e richiamo sono la stessa cosa. La precisione è uguale a TP / (TP + FP) e il richiamo è uguale a TP / (TP + FN) . La previsione migliore è sempre positiva e corrisponderà o non corrisponderà all'etichetta. In altre parole, con N esempi, TP + FP = N Tuttavia, se l'etichetta non corrisponde alla previsione più alta, ciò implica anche che è stata trovata una previsione k non top k e con top k impostata su 1, tutte le previsioni non top 1 saranno 0. Ciò implica che FN deve essere (N - TP) o N = TP + FN . Il risultato finale è precision@1 = TP / N = recall@1 . Tieni presente che questo si applica solo quando è presente una singola etichetta per esempio, non per etichette multiple.

Come interpretare MultiLabelConfusionMatrixPlot?

Data una particolare etichetta, MultiLabelConfusionMatrixPlot (e MultiLabelConfusionMatrix associato) può essere utilizzato per confrontare i risultati di altre etichette e le loro previsioni quando l'etichetta scelta era effettivamente vera. Ad esempio, supponiamo di avere tre classi bird , plane e superman e classifichiamo le immagini per indicare se contengono una o più di queste classi. MultiLabelConfusionMatrix calcolerà il prodotto cartesiano di ciascuna classe effettiva rispetto a ciascuna altra classe (chiamata classe predetta). Si noti che mentre l'accoppiamento è (actual, predicted) , la classe predicted non implica necessariamente una previsione positiva, ma rappresenta semplicemente la colonna prevista nella matrice effettiva rispetto a quella prevista. Ad esempio, supponiamo di aver calcolato le seguenti matrici:

   (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 ha tre modi per visualizzare questi dati. In tutti i casi il modo di leggere la tabella è riga per riga dal punto di vista della classe attuale.

1) Conteggio totale delle previsioni

In questo caso, per una data riga (cioè la classe effettiva) quali sono stati i conteggi TP + FP per le altre classi. Per i conteggi sopra, la nostra visualizzazione sarebbe la seguente:

Uccello previsto Piano previsto Predetto superuomo
Uccello reale 6 4 2
Piano reale 4 4 4
Un vero superuomo 5 5 4

Quando le immagini contenevano effettivamente un bird avevamo previsto correttamente 6. Allo stesso tempo abbiamo anche predetto l' plane (correttamente o erroneamente) 4 volte e superman (correttamente o erroneamente) 2 volte.

2) Conteggio delle previsioni errate

In questo caso, per una data riga (cioè la classe effettiva) quali sono stati i FP conta per le altre classi. Per i conteggi sopra, la nostra visualizzazione sarebbe la seguente:

Uccello previsto Piano previsto Predetto superuomo
Uccello reale 0 2 1
Piano reale 1 0 3
Un vero superuomo 2 3 0

Quando le immagini contenevano effettivamente un bird abbiamo previsto erroneamente l' plane 2 volte e il superman 1 volte.

3) Conteggio falso negativo

In questo caso, per una data riga (cioè la classe effettiva) quali sono stati i conteggi FN per le altre classi. Per i conteggi sopra, la nostra visualizzazione sarebbe la seguente:

Uccello previsto Piano previsto Predetto superuomo
Uccello reale 2 2 4
Piano reale 1 4 3
Un vero superuomo 2 2 5

Quando le immagini contenevano effettivamente un bird non siamo riusciti a prevederlo 2 volte. Allo stesso tempo, non siamo riusciti a prevedere l' plane 2 volte e il superman 4 volte.

Perché ricevo un errore relativo alla chiave di previsione non trovata?

Alcuni modelli producono la loro previsione sotto forma di dizionario. Ad esempio, uno stimatore TF per un problema di classificazione binaria genera un dizionario contenente probabilities , class_ids , ecc. Nella maggior parte dei casi TFMA ha impostazioni predefinite per la ricerca di nomi di chiavi comunemente usati come predictions , probabilities , ecc. Tuttavia, se il tuo modello è molto personalizzato potrebbe chiavi di output con nomi non conosciuti da TFMA. In tesi casi prediciton_key impostazione deve essere aggiunto al tfma.ModelSpec per identificare il nome della chiave l'uscita viene memorizzato sotto.