Quando lavori con modelli TensorFlow con addestramento personalizzato, hai bisogno di 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 Ottenere spiegazioni.
Questa guida fornisce le informazioni di cui hai bisogno per addestrare un modello TensorFlow per assicurarti di poterlo utilizzare con Vertex Explainable AI. Nello specifico, la guida tratta 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 Explainable AI. Questo include la creazione e la ricerca dei tensori appropriati per Vertex Explainable AI in casi speciali quando quelli tipici non funzionano.Esportazione del modello TensorFlow come modello TensorFlow SaveModel compatibile con Vertex Explainable AI.
Ricerca dei nomi dei tensori di input e di output da un modello salvato TensorFlow già esportato. Ciò può essere utile se non hai accesso al codice di addestramento per il 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. Puoi specificare questi nomi come parte di un messaggio ExplanationMetadata
quando configuri un Model
per 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 tensore durante l'addestramento:
- I dati inseriti non sono in serie
- Ogni input per il modello
SignatureDef
contiene il valore dell'elemento direttamente (può essere un valore numerico o una stringa) - Gli output sono valori numerici, trattati come dati numerici. Sono esclusi gli ID classe, considerati dati categorici.
Se il tuo modello non soddisfa questi criteri, leggi la sezione Aggiustamento del codice di addestramento e ricerca dei nomi dei tensori in casi speciali.
Il metodo di base
Durante l'addestramento, stampa l'attributo name
dei tensori di input e dei tensori di output del modello. Nell'esempio seguente, il campo name
del livello Keras genera il nome del tenant sottostante necessario per il tuo 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 della pubblicazioneSignatureDef
:
- Hai ingressi serializzati
- Il grafico include le operazioni di pre-elaborazione
- Gli output di pubblicazione non sono probabilità, logit o altri tipi di tensori a virgola mobile
In questi casi, dovresti utilizzare approcci diversi per trovare i tensori di input e di output giusti. L'obiettivo generale è trovare i tensori relativi ai valori delle caratteristiche che vuoi spiegare per gli input e i tensori di logit (pre-attivazione), le probabilità (post-attivazione) o qualsiasi altra rappresentazione per gli output.
Casi speciali per i tensori di ingresso
Gli input nei metadati delle spiegazioni sono diversi da quelli nella pubblicazione
SignatureDef
se utilizzi un input serializzato per alimentare il modello o se il grafico
include operazioni di pre-elaborazione.
Input serializzati
TensorFlow SaveModels può accettare una varietà di input complessi, tra cui:
- Messaggi serializzati tf.Example
- Stringhe JSON
- Stringhe Base64 codificate (per rappresentare i dati dell'immagine)
Se il tuo modello accetta input seriali come questi, l'utilizzo di questi tensori direttamente come input per le spiegazioni non funzionerà o potrebbe produrre risultati privi di senso. Invece, vuoi individuare i tensori di input successivi che vengono inseriti nelle colonne delle funzionalità all'interno del tuo modello.
Quando esporti il modello, puoi aggiungere un'operazione di analisi al grafico TensorFlow chiamando una funzione di analisi nella funzione di input di pubblicazione. Nel modulo tf.io sono elencate le funzioni di analisi. Queste funzioni di analisi di solito restituiscono i tensori in risposta e sono più scelte per i metadati di spiegazione.
Ad esempio, potresti utilizzare tf.parse_example() quando esporti il modello. Utilizza un messaggio seriale tf.Example e genera un dizionario di tensori che alimenta le colonne delle caratteristiche. Puoi utilizzare l'output per compilare 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 per la pre-elaborazione
Se il grafico del modello contiene alcune operazioni di pre-elaborazione, potresti volere una spiegazione sui tensori dopo il passaggio di pre-elaborazione. In questo caso, puoi ottenere i nomi di tali 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 nella pubblicazione SignatureDef
sono probabilità o logit.
Se il tuo modello attribuisce le probabilità, ma vuoi spiegare i valori logit, devi trovare i nomi dei tensori di output appropriati che corrispondono ai logit.
Se la tua pubblicazione SignatureDef
ha output che non sono probabilità o
logi, 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 del grafico) per individuare i nomi dei tensori di output corretti.
Considerazioni speciali per i gradienti integrati
Se vuoi utilizzare il metodo di attribuzione delle funzionalità di gradiente integrato di Vertex Explainable AI, devi assicurarti che gli input siano differenziabili rispetto all'output.
I metadati della spiegazione separano logicamente le funzionalità di un modello dagli input. Quando utilizzi gradienti integrati con un tensore di input che non è differenziabile rispetto al tensore di output, devi fornire anche la versione codificata (e differenziabile) di quella funzionalità.
Utilizza il seguente approccio se hai tensori di input indistinguibili o se esistono operazioni non distinguibili nel grafico:
- Codificare gli input non distinguibili come input differenziabili.
- Imposta
input_tensor_name
sul nome del tensore di input originale e non differenziabile e impostaencoded_tensor_name
sul nome della versione codificata e distinguibile.
File dei metadati della spiegazione con codifica
Ad esempio, prendi in considerazione un modello con una funzionalità categorica con un tensore di input denominato zip_codes:0
. Poiché i dati di input includono codici postali come stringhe, il tensore di input zip_codes:0
non è distinguibile. Se il modello
pre-elabora anche questi dati per ottenere una rappresentazione codificata one-hot dei codici postali, il tensore di input dopo la pre-elaborazione è differenziabile. Per distinguerlo dal tensore di input originale, potresti 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 il tuo Model
per le spiegazioni:
- Imposta la chiave della funzionalità di immissione 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 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 fatte a singoli valori di codice postale anziché alla rappresentazione con codifica one-hot. In questo esempio, escludi il tensore originale (zip_codes:0
) e imposti input_tensor_name
su zip_codes_embedding:0
. Questo approccio non è consigliato, perché sarebbe difficile ragionare su questa attribuzione.
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 restituite. Consulta l'elenco delle codifiche supportate da Vertex Explainable AI.
Per la codifica COMBINED_EMBEDDING
, il tensore di input è codificato in un array 1D.
Ecco alcuni esempi:
- Ingresso:
["This", "is", "a", "test"]
- Input codificato:
[0.1, 0.2, 0.3, 0.4]
Esporta Modelli salvati di TensorFlow per Vertex Explainable AI
Dopo l'addestramento di un modello TensorFlow, esportalo come salvatoModel. TensorFlow
SavedModel contiene il modello addestrato di TensorFlow, insieme a
firme serializzate, variabili e altri asset necessari per eseguire il grafico. Ogni elemento
SignatureDef
nel SaveModel identifica una funzione nel grafico che accetta input tensor e produce output tensor.
Per garantire che il tuo ProtectedModel 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, utilizza tf.saved_model.save
per salvare il modello. Puoi specificare le firme di input quando salvi il tuo 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, devi specificare 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 tua 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 del 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 tua funzione di pre-elaborazione e quella del modello per le tue richieste di spiegazione. Assicurati che l'output della funzione di pre-elaborazione corrisponda all'input previsto dalla funzione del modello.
Scopri di più su come specificare le firme di gestione in TensorFlow.
TensorFlow 1.15
Se utilizzi 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 tuo modello in Keras, devi convertirlo in uno strumento di stima di TensorFlow e poi esportarlo in un modello salvato. 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 input di pubblicazione, utilizzando
tf.estimator.export.build_raw_serving_input_receiver_fn
- Esporta il modello come SaveModel, 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)
Ottieni i nomi di tensor da un SignatureDef
ModelModel
Puoi utilizzare l'oggetto SignatureDef
di TensorFlowSavedModel per preparare i metadati esplicativi, purché soddisfi i criteri per il "metodo di base" descritti in una sezione precedente. Ciò può essere utile se non hai accesso al codice di addestramento che ha prodotto il modello.
Per controllare il SignatureDef
del tuo SaveModel, puoi utilizzare l'interfaccia a riga di comando SaveModel. Scopri di più su come utilizzare l'interfaccia a riga di comando SalvaModel.
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
- Utilizza i nomi dei tensori di input e di output per configurare un
Model
per Vertex Explainable AI - Prova un blocco note di esempio che mostra Vertex Explainable AI su dati tabulari o immagine.