Utilizza TensorFlow per spiegazioni basate sulle funzionalità

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Quando lavori con modelli TensorFlow addestrati personalizzati, sono necessarie informazioni specifiche per salvare il modello e configurare le spiegazioni.

Se vuoi utilizzare Vertex Explainable AI con un modello tabulare AutoML, non devi eseguire alcuna configurazione; Vertex AI configura automaticamente il modello per Vertex Explainable AI. Salta questo documento e leggi la sezione Informazioni sulle spiegazioni.

Questa guida fornisce le informazioni di cui hai bisogno quando addestra un modello TensorFlow per assicurarti di poterlo utilizzare con Vertex Explainable AI. In particolare, la guida riguarda i seguenti argomenti:

  • Trova i nomi dei tensori di input e di output durante l'addestramento che devi specificare quando configuri una risorsa Model per Vertex AI Explainable AI. Ciò include la creazione e il reperimento dei tensori appropriati per Vertex Explainable AI in casi speciali quando quelli tipici non funzionano.

  • Esportazione del modello TensorFlow come TensorFlow SavedModel compatibile con Vertex Explainable AI.

  • Trovare i nomi dei tensori di input e di output da un modello salvato di TensorFlow già esportato. Questo può essere utile se non hai accesso al codice di addestramento del modello.

Trova i nomi dei tensori di input e di output durante l'addestramento

Quando utilizzi un container predefinito TensorFlow per fornire previsioni, devi conoscere i nomi dei tensori di input e del tensore di output del modello. Questi nomi vengono specificati come parte di un messaggio ExplanationMetadata quando configuri un elemento Model per Vertex Explainable AI

Se il tuo modello TensorFlow soddisfa i seguenti criteri, puoi utilizzare il "metodo di base" descritto nella sezione successiva per determinare questi nomi tensori durante l'addestramento:

  • I dati inseriti non sono in serie
  • Ogni input nel SignatureDef del modello contiene direttamente il valore della funzionalità (può essere un valore numerico o una stringa)
  • Gli output sono valori numerici, trattati come dati numerici. Sono esclusi gli ID classe, che sono considerati dati categorici.

Se il tuo modello non soddisfa questi criteri, leggi la sezione Modificare il codice di addestramento e trovare i nomi dei tensori in casi speciali.

Metodo di base

Durante l'addestramento, stampa l'attributo name dei tensori di input del modello e dei relativi tensori di output. Nell'esempio seguente, il campo name del livello Keras produce il nome del tensore sottostante necessario per ExplanationMetadata:

bow_inputs = tf.keras.layers.Input(shape=(2000,))
merged_layer = tf.keras.layers.Dense(256, activation="relu")(bow_inputs)
predictions = tf.keras.layers.Dense(10, activation="sigmoid")(merged_layer)
model = tf.keras.Model(inputs=bow_inputs, outputs=predictions)
print('input_tensor_name:', bow_inputs.name)
print('output_tensor_name:', predictions.name)

L'esecuzione di questo codice Python stampa il seguente output:

input_tensor_name: input_1:0
output_tensor_name: dense_1/Sigmoid:0

Puoi quindi utilizzare input_1:0 come nome del tensore di input e dense_1/Sigmod:0 come nome del tensore di output quando configuri Model per le spiegazioni.

Modifica il codice di addestramento e trova i nomi dei tensori in casi speciali

Esistono alcuni casi comuni in cui i tensori di input e di output per ExplanationMetadata non devono corrispondere a quelli nella pubblicazione. SignatureDef

  • Hai input serializzati
  • Il grafico include le operazioni di pre-elaborazione
  • Gli output di pubblicazione non sono probabilità, log o altri tipi di tensori in virgola mobile

In questi casi, devi utilizzare approcci diversi per trovare i tensori di input e di output corretti. L'obiettivo generale è trovare i tensori relativi ai valori delle caratteristiche che vuoi spiegare per gli input e i tensori relativi ai log (pre-attivazione), le probabilità (post-attivazione) o qualsiasi altra rappresentazione per gli output.

Casi speciali per i tensori di input

Gli input nei metadati di spiegazione sono diversi da quelli nella tua pubblicazione SignatureDef se utilizzi un input serializzato per alimentare il modello o se il tuo grafico include operazioni di pre-elaborazione.

Input serializzati

TensorFlow SavedModels può accettare una serie di input complessi, tra cui:

  • Hai serializzato i messaggi tf.Example
  • Stringhe JSON
  • Stringhe Base64 codificate (per rappresentare i dati dell'immagine)

Se il tuo modello accetta input serializzati come questi, utilizzare questi tensori direttamente come input per le spiegazioni non funzionerà o potrebbe produrre risultati privi di senso. Vuoi invece individuare i tensori di input successivi che si inseriscono nelle colonne delle funzionalità all'interno del modello.

Quando esporti il modello, puoi aggiungere un'operazione di analisi al grafico di TensorFlow chiamando una funzione di analisi nella funzione di input di gestione. Puoi trovare le funzioni di analisi elencate nel modulo tf.io. Queste funzioni di analisi di solito restituiscono tensori come risposta e questi tensori sono selezioni migliori per i metadati di spiegazione.

Ad esempio, puoi utilizzare tf.parse_example() quando esporti il modello. Prende un messaggio tf.Example serializzato e genera un dizionario di tensori che alimentano le colonne delle caratteristiche. Puoi utilizzare questo output per inserire i metadati della spiegazione. Se alcuni di questi output sono tf.SparseTensor, che è una tupla con nome composta da 3 tensori, dovresti ottenere i nomi di indici, valori e tensori dense_shape e compilare i campi corrispondenti nei metadati.

L'esempio seguente mostra come ottenere il nome del tensore di input dopo un'operazione di decodifica:

float_pixels = tf.map_fn(
    lambda img_string: tf.io.decode_image(
        img_string,
        channels=color_depth,
        dtype=tf.float32
    ),
    features,
    dtype=tf.float32,
    name='input_convert'
  )

print(float_pixels.name)
Input pre-elaborazione

Se il grafico del modello contiene alcune operazioni di pre-elaborazione, potresti volere spiegazioni sui tensori dopo il passaggio di pre-elaborazione. In questo caso, puoi ottenere i nomi di quei tensori utilizzando la proprietà name di tf.Tensor e inserirli nei metadati di spiegazione:

item_one_hot = tf.one_hot(item_indices, depth,
    on_value=1.0, off_value=0.0,
    axis=-1, name="one_hot_items:0")
print(item_one_hot.name)

Il nome del tensore decodificato diventa input_pixels:0.

Casi speciali per i tensori di output

Nella maggior parte dei casi, gli output nel servizio SignatureDef sono probabilità o logit.

Se il modello attribuisce le probabilità, ma vuoi spiegare i valori logit, devi trovare i nomi dei tensori di output appropriati che corrispondono ai logit.

Se l'SignatureDef per la pubblicazione presenta output che non sono probabilità o log, devi fare riferimento all'operazione di probabilità nel grafico di addestramento. Questo scenario è improbabile per i modelli Keras. In questo caso, puoi utilizzare TensorBoard (o altri strumenti di visualizzazione dei grafici) per individuare i nomi dei tensori di output corretti.

Considerazioni speciali per le gradienti integrate

Se vuoi utilizzare il metodo di attribuzione delle funzionalità dei gradienti integrati di Vertex Explainable AI, devi assicurarti che i tuoi input siano differenziabili in relazione all'output.

I metadati della spiegazione separano logicamente le funzionalità di un modello dai suoi input. Quando utilizzi gradienti integrati con un tensore di input che non è distinguibile rispetto al tensore di output, devi fornire anche la versione codificata (e differenziabile) di tale funzionalità.

Utilizza il seguente approccio se hai tensori di input non distinguibili o se esistono operazioni non distinguibili nel grafico:

  1. Codifica gli input non differenziabili come input differenziabili.
  2. Imposta input_tensor_name sul nome del tensore di input originale, non differenziabile e imposta encoded_tensor_name sul nome della relativa versione codificata e differenziabile.

File di metadati della spiegazione con codifica

Ad esempio, prendi in considerazione un modello con una caratteristica categorica con un tensore di input denominato zip_codes:0. Poiché i dati di input includono i codici postali come stringhe, il tensore di input zip_codes:0 non è differenziabile. Se il modello pre-elabora anche questi dati per ottenere una rappresentazione di codifica rapida dei codici postali, il tensore di input dopo la pre-elaborazione è differenziabile. Per distinguerlo dal tensore di input originale, puoi chiamarlo zip_codes_embedding:0.

Per utilizzare i dati di entrambi i tensori di input nella richiesta di spiegazione, imposta ExplanationMetadata come segue durante la configurazione di Model per le spiegazioni:

  • Imposta il nome della funzione di input su un nome significativo, ad esempio zip_codes.
  • Imposta input_tensor_name sul nome del tensore originale, zip_codes:0.
  • Imposta encoded_tensor_name sul nome del tensore dopo la codifica one-hot, zip_codes_embedding:0.
  • Imposta il valore di encoding su COMBINED_EMBEDDING.
{
    "inputs": {
      "zip_codes": {
        "input_tensor_name": "zip_codes:0",
        "encoded_tensor_name": "zip_codes_embedding:0",
        "encoding": "COMBINED_EMBEDDING"
      }
    },
    "outputs": {
      "probabilities": {
        "output_tensor_name": "dense/Softmax:0"
      }
    }
}

In alternativa, puoi impostare input_tensor_name sul nome del tensore di input differenziabile codificato e omettere il tensore originale, non differenziabile. Il vantaggio di fornire entrambi i tensori è che le attribuzioni possono essere applicate a singoli valori di codice postale anziché alla rappresentazione di codifica one-hot. In questo esempio, escludi il tensore originale (zip_codes:0) e imposta input_tensor_name su zip_codes_embedding:0. Questo approccio non è consigliato perché difficilmente sarà possibile ragionare sulle attribuzioni delle funzionalità risultanti.

Codifica

Per attivare la codifica per Model, specifica le impostazioni di codifica come mostrato nell'esempio precedente.

La funzionalità di codifica aiuta a invertire il processo dai dati codificati ai dati di input per le attribuzioni, eliminando la necessità di elaborare manualmente le attribuzioni rilasciate. Consulta l'elenco delle codifiche supportate da Vertex Explainable AI.

Per la codifica COMBINED_EMBEDDING, il tensore di input è codificato in un array 1D.

Ad esempio:

  • Ingresso: ["This", "is", "a", "test"]
  • Input codificato: [0.1, 0.2, 0.3, 0.4]

Esporta TensorFlow SavedModels per AI Explainable AI

Dopo aver addestrato un modello TensorFlow, esportalo come SavedModel. TensorFlow ModelModel contiene il modello TensorFlow addestrato, insieme a firme serializzate, variabili e altri asset necessari per eseguire il grafico. Ogni elemento SignatureDef in SavedModel identifica una funzione nel grafico che accetta gli input del tensore e produce output del tensore.

Per assicurarti che il modello SavedModel sia compatibile con Vertex Explainable AI, segui le istruzioni in una delle sezioni seguenti, a seconda che utilizzi TensorFlow 2 o TensorFlow 1.

TensorFlow 2

Se stai utilizzando TensorFlow 2.x, utilizza tf.saved_model.save per salvare il modello. Puoi specificare le firme di input quando salvi il modello. Se hai una firma di input, Vertex Explainable AI utilizza la funzione di pubblicazione predefinita per le richieste di spiegazione. Se hai più di una firma di input, devi specificare la firma della funzione predefinita di gestione quando salvi il modello:

tf.saved_model.save(m, model_dir, signatures={
    'serving_default': serving_fn,
    'xai_model': model_fn # Required for XAI
    })

In questo caso, Vertex Explainable AI utilizza la firma della funzione modello che hai salvato con la chiave xai_model per la richiesta di spiegazioni. Utilizza la stringa esatta xai_model per la chiave.

Se utilizzi una funzione di pre-elaborazione, devi specificare anche le firme per la funzione di pre-elaborazione e la funzione di modello. Devi utilizzare le stringhe esatte xai_preprocess e xai_model come chiavi:

tf.saved_model.save(m, model_dir, signatures={
    'serving_default': serving_fn,
    'xai_preprocess': preprocess_fn, # Required for XAI
    'xai_model': model_fn # Required for XAI
    })

In questo caso, Vertex Explainable AI utilizza la funzione di pre-elaborazione e il modello per le richieste di spiegazione. Assicurati che l'output della funzione di pre-elaborazione corrisponda all'input previsto dalla funzione del modello.

Scopri di più sulla specifica delle firme di gestione in TensorFlow.

TensorFlow 1.15

Se stai utilizzando TensorFlow 1.15, non utilizzare tf.saved_model.save. Vertex Explainable AI non supporta i modelli TensorFlow 1 salvati con questo metodo

Se crei e addestra il modello in Keras, devi convertirlo in uno strumento di stima TensorFlow ed esportarlo in un modello SavedModel. Questa sezione si concentra sul salvataggio di un modello.

Dopo aver creato, compilato, addestrato e valutato il tuo modello Keras, devi:

  • Converti il modello Keras in uno strumento di stima TensorFlow, utilizzando tf.keras.estimator.model_to_estimator
  • Fornisci una funzione di inserimento di pubblicazione, utilizzando tf.estimator.export.build_raw_serving_input_receiver_fn
  • Esporta il modello come SavedModel utilizzando tf.estimator.export_saved_model.
# Build, compile, train, and evaluate your Keras model
model = tf.keras.Sequential(...)
model.compile(...)
model.fit(...)
model.predict(...)

## Convert your Keras model to an Estimator
keras_estimator = tf.keras.estimator.model_to_estimator(keras_model=model, model_dir='export')

## Define a serving input function appropriate for your model
def serving_input_receiver_fn():
  ...
  return tf.estimator.export.ServingInputReceiver(...)

## Export the SavedModel to Cloud Storage, using your serving input function
export_path = keras_estimator.export_saved_model(
  'gs://' + 'YOUR_BUCKET_NAME',
  serving_input_receiver_fn
).decode('utf-8')

print("Model exported to: ", export_path)

Recupero nomi tensori da SignatureDef di un modello salvato

Puoi utilizzare un elemento SignatureDefTensorFlowModelModel, in modo da preparare i metadati esplicativi, a condizione che soddisfino i criteri per il metodo di base" descritti in una sezione precedente. Questo può essere utile se non hai accesso al codice di addestramento che ha prodotto il modello.

Per esaminare SignatureDef di un modello salvato, puoi utilizzare l'interfaccia a riga di comando SalvaModel. Scopri di più su come utilizzare l'interfaccia a riga di comando SavedModel.

Considera l'esempio SignatureDef di seguito:

The given SavedModel SignatureDef contains the following input(s):
  inputs['my_numpy_input'] tensor_info:
      dtype: DT_FLOAT
      shape: (-1, 1)
      name: x:0
The given SavedModel SignatureDef contains the following output(s):
  outputs['probabilities'] tensor_info:
      dtype: DT_FLOAT
      shape: (-1, 1)
      name: dense/Softmax:0
Method name is: tensorflow/serving/predict

Il grafico ha un tensore di input denominato x:0 e un tensore di output denominato dense/Softmax:0. Quando configuri Model per le spiegazioni, utilizza x:0 come nome del tensore di input e dense/Softmax:0 come nome del tensore di output nel messaggio ExplanationMetadata.

Passaggi successivi