Quando utilizzi 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 Ricevere spiegazioni.
Questa guida fornisce le informazioni necessarie per l'addestramento di un modello TensorFlow per assicurarti di poterlo utilizzare con Vertex Explainable AI. In particolare, la guida tratta i seguenti argomenti:
Trovare i nomi dei tensori di input e output durante l'addestramento necessari quando configuri una risorsa
Model
Vertex Explainable AI. Ciò include la creazione e la ricerca dei tensori appropriati per Vertex Explainable AI in casi speciali quando quelli tipici non funzionano.Esportare il modello TensorFlow come SavedModel di TensorFlow compatibile con Vertex Explainable AI.
Trovare i nomi di tensori di input e output da un SavedModel di TensorFlow che è già stato esportato. Questa opzione può essere utile se non hai accesso al codice di addestramento del modello.
Trova i nomi dei tensori di input e output durante l'addestramento
Quando utilizzi un container predefinito di TensorFlow per la pubblicazione
previsioni, devi conoscere
nomi dei tensori di input e del tensore di output del modello. Tu specifichi
questi nomi come parte di un messaggio ExplanationMetadata
quando configuri una
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 di tensore durante l'addestramento:
- Gli input non sono in formato serializzato
- Ogni input nell'oggetto
SignatureDef
del modello contiene il valore della caratteristica direttamente (può essere valori numerici o stringhe) - Gli output sono valori numerici, trattati come dati numerici. Il corso è escluso Gli ID, che sono considerati dati categorici.
Se il modello non soddisfa questi criteri, leggi la sezione sulla regolazione dell'addestramento e la ricerca dei nomi dei tensori nei casi speciali.
Il metodo di base
Durante l'addestramento, stampa l'attributo name
dei tensori di input del modello e
dei suoi tensori di output. Nell'esempio seguente, il campo name
dello strato Keras
produce la struttura di base
nome del tensore 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 restituisce 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.
Modificare il codice di addestramento e trovare i nomi dei tensori in casi speciali
Ci sono alcuni casi comuni in cui i tensori di input e output per il
ExplanationMetadata
non deve essere uguale a quelli presenti nella pubblicazione
SignatureDef
:
- Hai input serializzati
- Il grafico include operazioni di preelaborazione
- Gli output di pubblicazione non sono probabilità, logit o altri tipi di tensori con virgola mobile
In questi casi, dovresti usare approcci diversi per trovare i tensori di input e output corretti. L'obiettivo generale è trovare i tensori relativi ai valori delle funzionalità che vuoi spiegare per gli input e i tensori relativi a logit (pre-attivazione), probabilità (post-attivazione) o qualsiasi altra rappresentazione per gli output.
Casi speciali per i tensori di input
Gli input nei metadati della spiegazione sono diversi da quelli di pubblicazioneSignatureDef
se utilizzi un input serializzato per alimentare il modello o se il grafico include operazioni di preelaborazione.
Input serializzati
I SavedModel di TensorFlow possono accettare una serie di input complessi, tra cui:
- Messaggi tf.Example serializzati
- Stringhe JSON
- Stringhe Base64 codificate (per rappresentare i dati immagine)
Se il tuo modello accetta input serializzati come questi, l'utilizzo diretto di questi tensori come input per le spiegazioni non funzionerà o potrebbe produrre risultati non significativi. Piuttosto, ti conviene individuare i successivi tensori di input che alimentano in colonne di caratteristiche all'interno del modello.
Quando esporti il modello, puoi aggiungere un'operazione di analisi al gráfo di TensorFlow chiamando una funzione di analisi nella funzione di input di pubblicazione. 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 scelte migliori per i metadati della spiegazione.
Ad esempio, potresti utilizzare tf.parse_example() durante l'esportazione del modello. Prende un messaggio tf.Example serializzato e produce un dizionario di tensori da inviare alle colonne delle caratteristiche. Puoi utilizzare il suo output per compilare i metadati della spiegazione. Se alcune di queste uscite sono tf.SparseTensor, ovvero una tupla denominata composta da 3 tensori, allora devi ottenere i nomi degli indici, dei valori e dei 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 di pre-elaborazione
Se il grafico del modello contiene alcune operazioni di pre-elaborazione, potresti
ottenere spiegazioni sui tensori dopo la fase di pre-elaborazione. In questo caso,
puoi ottenere i nomi di questi tensori utilizzando la proprietà name
di tf.Tensor e
inserirli nei metadati della 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 nella pubblicazione SignatureDef
sono probabilità o logit.
Se il modello attribuisce probabilità, ma vuoi spiegare i valori di logit, devi trovare i nomi dei tensori di output appropriati che corrispondono ai logit.
Se la pubblicazione di SignatureDef
ha output che non sono probabilità o
devi fare riferimento all'operazione delle 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 sui gradienti integrati
Se vuoi utilizzare l'attribuzione delle funzionalità dei gradienti integrati di Vertex Explainable AI , devi assicurati che gli input siano differenziabili rispetto all'output.
I metadati della spiegazione separano logicamente le caratteristiche di un modello dai relativi input. Quando utilizzi i gradienti integrati con un tensore di input non differenziabile rispetto al tensore di output, devi fornire anche la versione codificata (e differenziabile) della funzionalità.
Utilizza il seguente approccio se hai tensori di input non differenziabili o se operazioni non differenziabili nel grafico:
- Codifica gli input non differenziabili come input differenziabili.
- Imposta
input_tensor_name
sul nome del tensore di input originale non differenziabile e impostaencoded_tensor_name
sul nome della relativa versione codificata e differenziabile.
File di metadati della spiegazione con codifica
Ad esempio, considera un modello che ha una caratteristica categorica con un input
tensore 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 con codifica one-hot dei codici postali, il tensore di input dopo la pre-elaborazione è differenziabile. A
distinguerlo dal tensore di input originale, si può chiamarlo
zip_codes_embedding:0
.
Per utilizzare i dati di entrambi i tensori di input nella richiesta di spiegazioni, imposta ExplanationMetadata
come segue quando configuri Model
per le spiegazioni:
- Imposta la chiave della funzionalità 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
encoding
suCOMBINED_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 di
il tensore di input differenziabile codificato e omette l'originale,
non differenziabile. Il vantaggio di fornire entrambi i tensori è che
le attribuzioni possono essere fatte a singoli valori di codici postali anziché
rappresentazione di codifica one-hot. In questo esempio, escluderai il parametro
tensore originale (zip_codes:0
) e imposta input_tensor_name
su
zip_codes_embedding:0
. Questo approccio non è consigliato perché
sarebbe difficile spiegare le attribuzioni delle caratteristiche risultanti.
Codifica
Per attivare la codifica per Model
, specifica le impostazioni di codifica come mostrato nell'esempio precedente.
La funzionalità di codifica consente di invertire il processo dai dati codificati ai dati di input per le attribuzioni, eliminando la necessità di eseguire il post-trattamento manualmente delle attribuzioni restituite. Consulta l'elenco delle codifiche supportate da Vertex Explainable AI.
Per la codifica COMBINED_EMBEDDING
, il tensore di input è codificato in un formato 1D
un array di dati.
Ad esempio:
- Ingresso:
["This", "is", "a", "test"]
- Input codificato:
[0.1, 0.2, 0.3, 0.4]
Esportare i SavedModel di TensorFlow per Vertex Explainable AI
Dopo aver addestrato un modello TensorFlow, esportalo come SavedModel. TensorFlow
SavedModel contiene il modello TensorFlow addestrato, oltre ai
firme, variabili e altre risorse necessarie per creare il grafico. Ciascuna
SignatureDef
nel SavedModel identifica una funzione nel grafico che
accetta gli input dei tensori e produce degli output dei tensori.
Per assicurarti che il tuo SavedModel sia compatibile con Vertex Explainable AI, segui le istruzioni in una delle seguenti sezioni, a seconda che tu stia utilizzando TensorFlow 2 o TensorFlow 1.
TensorFlow 2
Se utilizzi TensorFlow 2.x, usa tf.saved_model.save
per salvare il
modello. Puoi specificare le firme di input durante il salvataggio del modello. Se hai una firma di input, Vertex Explainable AI utilizza la funzione di pubblicazione predefinita per le tue richieste di spiegazioni. Se hai più di una firma di input,
specifica la firma della funzione predefinita di pubblicazione 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 del 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 anche specificare le firme per la funzione di pre-elaborazione e la funzione del modello. Devi utilizzare l'impostazione esatta
stringhe 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 tue richieste di spiegazione. Assicurati che l'output della funzione di preelaborazione corrisponda all'input previsto dalla funzione del modello.
Scopri di più su specificando le firme per la pubblicazione in TensorFlow.
TensorFlow 1.15
Se lavori con 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 addestri il tuo modello in Keras, devi convertirlo in TensorFlow Estimator e poi esportarlo in un SavedModel. Questa sezione è incentrata sul salvataggio di un modello.
Dopo aver creato, compilato, addestrato e valutato il modello Keras, devi:
- Convertire il modello Keras in un TensorFlow Estimator utilizzando
tf.keras.estimator.model_to_estimator
- Fornisci una funzione di input 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)
Recupera i nomi dei tensori da SignatureDef
di un SavedModel
Puoi utilizzare SignatureDef
di un modello TensorFlow SavedModel per preparare i metadati della spiegazione, a condizione che soddisfi i criteri per il "metodo di base" descritti in una sezione precedente. Questa operazione potrebbe essere utile se non hai accesso al codice di addestramento che ha prodotto il modello.
Per ispezionare il SignatureDef
del tuo SavedModel, puoi utilizzare la CLI di SavedModel. Scopri di più su come utilizzare l'interfaccia a riga di comando SavedModel.
Considera il seguente esempio SignatureDef
:
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 x:0
dense/Softmax:0
. Quando configuri Model
per
spiegazioni, usa x:0
come input
e dense/Softmax:0
come nome del tensore di output nel
ExplanationMetadata
messaggio.
Passaggi successivi
- Usa i nomi dei tensori di input e output per configurare un
Model
per Vertex Explainable AI - Prova un notebook di esempio che mostra Vertex Explainable AI su dati tabulari o di immagini.