Ein- und Ausgaben für Erläuterungen verstehen

Bevor Sie Erläuterungen anfordern, müssen Sie eine Erklärungs-Metadatendatei einreichen, um Ihre Erklärungsanfrage zu konfigurieren. Diese Metadatendatei muss die Ein- und Ausgaben Ihres Modells enthalten. Außerdem enthält es optionale Einstellungen wie Eingabe-Baselines und Visualisierungseinstellungen für Bilddaten.

Durch die Angabe der Ein- und Ausgaben Ihres Modells können Sie bestimmte Features für Ihre Erklärungsanfrage auswählen, ohne dass Sie das Modell ändern müssen. Sie können das Explainable AI SDK für Sie automatisch verwenden, wenn Sie ein neues Modell erstellen. Wenn Sie das Explainable AI SDK nicht verwenden, müssen Sie Ihre Eingaben und Ausgaben manuell identifizieren.

In diesem Leitfaden wird beschrieben, wie Sie Ihre Eingabe- und Ausgabetensoren manuell identifizieren, damit Sie Ihre Erklärungs-Metadatendatei vorbereiten können.

Ein- und Ausgaben für Erklärungsmetadaten

Zur Vorbereitung der Erklärungsmetadaten müssen Sie die Ein- und Ausgaben für das Modell in einer Datei namens explanation_metadata.json angeben:

{
  "inputs": {
    string <input feature key>: {
      "input_tensor_name": string,
  },
  "outputs": {
    string <output value key>:  {
      "output_tensor_name": string
    },
  },
  "framework": "tensorflow"
}

Sie müssen die Namen der Eingabe- und Ausgabetensoren für die Erklärungsanfrage über die Objekte inputs und outputs der Datei angeben.

  • Mit den Schlüsseln für die jeweiligen Eingaben und Ausgaben ("input feature key" und "output value key" im vorherigen Beispiel) können Sie jedem Tensor einen aussagekräftigen Namen geben. Im folgenden Beispiel ist der "input feature key" degrees_celsius und der "output value key" probabilities.
  • Für die Werte in den einzelnen Metadaten-inputs und -outputs müssen Sie den tatsächlichen Namen des Tensors als input_tensor_name bzw. output_tensor_name angeben. Im Beispiel unten ist x:0 der input_tensor_name und dense/Softmax:0 der output_tensor_name.
{
    "inputs": {
      "degrees_celsius": {
        "input_tensor_name": "x:0",
      }
    },
    "outputs": {
      "probabilities": {
        "output_tensor_name": "dense/Softmax:0"
      }
    },
  "framework": "tensorflow"
}

Die tatsächlichen Tensornamen haben das Format name:index.

Eingabe- und Ausgabetensoren suchen

Nach dem Training eines TensorFlow-Modells exportieren Sie es als SavedModel. Das TensorFlow-SavedModel enthält das trainierte TensorFlow-Modell sowie serialisierte Signaturen, Variablen und andere Assets, die zum Ausführen des Graphen erforderlich sind. Jede SignatureDef identifiziert eine Funktion im Graphen, die Tensoreingaben akzeptiert und Tensorausgaben erzeugt. Auf ähnliche Weise werden mit der Erklärungsmetadaten-Datei die Eingaben und Ausgaben des Graphen für die Featureattributions-Anfrage an AI Explanations definiert.

Häufig werden die Eingabe- und Ausgabetensoren, die Sie in der Erklärungsmetadaten-Datei angeben, genau den Signaturen zugeordnet, die Sie beim Speichern des Modells definieren. Wenn dies der Fall ist, sind die Namen der Eingabe- und Ausgabetensoren relativ leicht zu ermitteln. In manchen Fällen unterscheiden sich die zu erklärenden Eingaben oder Ausgaben jedoch von denen, die Sie beim Speichern des Modells definiert haben.

Ihre Eingaben und Ausgaben für Erklärungen entsprechen in folgenden Fällen denen, die Sie in der Bereitstellungs-SignatureDef festgelegt haben:

  • Die Eingaben haben keine serialisierte Form.
  • Jede Eingabe für SignatureDef enthält direkt den Wert des Features. Dabei kann es sich um numerische Werte oder Strings handeln.
  • Die Ausgaben sind numerische Werte, die als numerische Daten behandelt werden. Dies schließt Klassen-IDs aus, die als kategoriale Daten betrachtet werden.

In diesen Fällen können Sie die Namen der Eingabe- und Ausgabetensoren beim Erstellen des Modells abrufen. Sie können sich auch die SignatureDef des SavedModels mit der SavedModel-Befehlszeile ansehen, um die Namen der Ein- und Ausgabetensoren zu ermitteln.

Für Fälle, die nicht den obigen Kriterien entsprechen, gibt es weitere Ansätze, mit denen Sie die richtigen Eingabe- und Ausgabetensoren ermitteln können.

Tensornamen während des Trainings abrufen

Während des Trainings ist es am einfachsten, auf die Eingabe- und Ausgabetensornamen zuzugreifen. Sie können diese Werte in der Erklärungsmetadaten-Datei speichern, solange Ihr Programm oder Ihre Umgebung noch Zugriff auf die Variablen hat, die Sie beim Erstellen des Modells festgelegt haben. In diesem Beispiel erzeugt das Feld name der Keras-Ebene den zugrunde liegenden Tensornamen, den Sie für die Erklärungsmetadaten benötigen:

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 = keras.Model(inputs=bow_inputs, outputs=predictions)
print('input_tensor_name:', bow_inputs.name)
print('output_tensor_name:', predictions.name)
input_tensor_name: input_1:0
output_tensor_name: dense_1/Sigmoid:0

Ein vollständiges Praxisbeispiel finden Sie unter Beispielnotebooks.

Tensornamen aus Signaturdefinitionen abrufen

Da sowohl SignatureDefs als auch Erklärungsmetadaten Tensoreingaben und -ausgaben identifizieren, können Sie die SignatureDef verwenden, um die Erklärungsmetadaten-Datei vorzubereiten – vorausgesetzt, sie erfüllt die zuvor genannten Kriterien.

Sehen Sie sich die folgende Beispiel-SignatureDef an:

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

Der Graph hat einen Eingabetensor namens x:0 und einen Ausgabetensor namens dense/Softmax:0. Beide Tensoren haben auch aussagekräftige Namen: my_numpy_input bzw. probabilities. Wenn Sie Erklärungen zu probabilities in Bezug auf my_numpy_input anfordern möchten, können Sie so eine Erklärungsmetadaten-Datei erstellen:

{
    "inputs": {
      "my_numpy_input": {
        "input_tensor_name": "x:0",
      }
    },
    "outputs": {
      "probabilities": {
        "output_tensor_name": "dense/Softmax:0"
      }
    },
  "framework": "tensorflow"
}

Zum Prüfen der SignatureDef Ihres SavedModels können Sie die SavedModel-Befehlszeile verwenden. Weitere Informationen über die Verwendung der SavedModel-Befehlszeile

Umgang mit Eingabe- und Ausgabediskrepanzen

Es gibt ein paar übliche Fälle, in denen die Eingabe- und Ausgabetensoren in der Erklärungsmetadaten-Datei nicht mit denen in der Bereitstellungs-SignatureDef übereinstimmen sollten:

  • Ihre Eingaben sind serialisiert.
  • Ihr Graph beinhaltet Vorverarbeitungsvorgänge.
  • Ihre Bereitstellungsausgaben sind keine Wahrscheinlichkeiten, Logits oder andere Typen von Gleitkommatensoren.

In diesen Fällen sollten Sie verschiedene Ansätze verwenden, um die richtigen Eingabe- und Ausgabetensoren zu finden. Das übergreifende Ziel besteht darin, die Tensoren für die Featurewerte zu finden, die Sie hinsichtlich der Eingaben erklären möchten, sowie Tensoren für Logits (Vorabaktivierung), Wahrscheinlichkeiten (nach der Aktivierung) oder eine beliebige andere Darstellungsform von Ausgaben.

Eingabediskrepanzen

Die Eingaben in den Erklärungsmetadaten unterscheiden sich dann von denen in der Bereitstellungs-SignatureDef, wenn Sie für das Modell eine serialisierte Eingabe verwenden oder wenn Ihr Graph Vorverarbeitungsvorgänge enthält.

Serialisierte Eingaben

TensorFlow SavedModels können eine Vielzahl komplexer Eingaben verarbeiten, darunter:

  • Serialisierte tf.Example-Nachrichten
  • JSON-Strings
  • Codierte Base64-Strings zur Darstellung von Bilddaten

Wenn Ihr Modell serialisierte Eingaben wie diese akzeptiert, funktioniert es nicht, diese Tensoren direkt als Eingabe für Ihre Erklärungen zu verwenden bzw. könnte dies zu unsinnigen Ergebnissen führen. Stattdessen möchten Sie nachfolgende Eingabetensoren finden, die Featurespalten innerhalb des Modells versorgen.

Wenn Sie das Modell exportieren, können Sie dem TensorFlow-Graphen einen Parser-Vorgang hinzufügen, indem Sie in Ihrer Bereitstellungseingabefunktion eine Parser-Funktion aufrufen. Parser-Funktionen finden Sie im tf.io-Modul. Diese Parser-Funktionen geben in der Regel Tensoren als Antwort zurück, die sich besser für die Erklärungsmetadaten eignen.

Sie könnten z. B. tf.parse_example() beim Exportieren des Modells verwenden. Die Funktion verwendet eine serialisierte tf.Example-Nachricht und gibt ein Wörterbuch der Tensoren aus, die Featurespalten versorgen. Sie können deren Ausgabe verwenden, um die Erklärungsmetadaten anzugeben. Wenn manche dieser Ausgaben die Form des benannten Tupels "tf.SparseTensor" haben, das aus drei Tensoren besteht, sollten Sie die Namen der Indexe, Werte und dense_shape-Tensoren notieren und in die entsprechenden Felder in den Metadaten eingeben.

Das folgende Beispiel zeigt, wie nach einem Decodierungsvorgang der Name des Eingabetensors abgerufen wird:

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)

Eingaben vorverarbeiten

Wenn Ihr Modellgraph Vorverarbeitungsvorgänge enthält, möchten Sie möglicherweise nach dem Vorverarbeitungsschritt Erklärungen zu den Tensoren abrufen. In diesem Fall können Sie die Namen der Tensoren mithilfe des name-Attributs von tf.Tensor abrufen und diese in die Erklärungsmetadaten einfügen:

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)

Der decodierte Name des Tensors lautet input_pixels:0.

Ausgabediskrepanzen

Die Ausgaben in Ihrer Bereitstellungs-SignatureDef sind in den meisten Fällen entweder Wahrscheinlichkeiten oder Logits.

Wenn Ihr Modell Wahrscheinlichkeiten zuordnet, Sie aber stattdessen die Logit-Werte erklären möchten, müssen Sie die passenden Ausgabetensornamen finden, die den Logits entsprechen.

Wenn die Bereitstellungs-SignatureDef Ausgaben hat, die weder Wahrscheinlichkeiten noch Logits sind, sollten Sie auf den Wahrscheinlichkeitsvorgang im Trainingsgraphen verweisen. Dieses Szenario ist bei Keras-Modellen unwahrscheinlich. In diesem Fall können Sie mit TensorBoard oder einem anderen Graph-Visualisierungstool nach den richtigen Ausgabetensornamen suchen.

Weitere Hinweise für integrierte Gradienten

AI Explanations bietet zwei Methoden zur Featureattribution: "Sampled Shapley" und integrierte Gradienten. Bei der Methode der integrierten Gradienten müssen Sie sicherstellen, dass die Eingaben in Bezug auf die Ausgabe differenzierbar sind. Berücksichtigen Sie dies bei der Vorbereitung der Erklärungsmetadaten. Sie müssen dagegen nicht darauf achten, dass die Eingaben differenzierbar sind, wenn Sie die Featureattributions-Methode "Sampled Shapley" verwenden. Hier finden Sie weitere Informationen zu den Methoden zur Featureattribution, die in AI Explanations unterstützt werden.

Die Erklärungsmetadaten sorgen für eine logische Trennung der Features eines Modells von seinen Eingaben. Wenn Sie integrierte Gradienten mit einem Eingabetensor verwenden, der in Bezug auf den Ausgabetensor nicht differenzierbar ist, müssen Sie auch die codierte (differenzierbare) Version des jeweiligen Features bereitstellen.

Verwenden Sie den folgenden Ansatz, wenn Sie nicht differenzierbare Eingabetensoren haben oder in Ihrem Graphen nicht differenzierbare Vorgänge haben:

  • Codieren Sie die nicht differenzierbaren Eingaben als differenzierbare Eingaben.
  • Legen Sie input_tensor_name auf den Namen des ursprünglichen, nicht differenzierbaren Eingangstensors und encoded_tensor_name auf den Namen seiner codierten, differenzierbaren Version fest.

Erklärungsmetadaten-Datei mit Codierung

Nehmen wir als Beispiel ein Modell an, das ein kategoriales Feature mit einem Eingabetensor namens zip_codes:0 aufweist. Da die Eingabedaten Postleitzahlen als Strings enthalten, ist der Eingabetensor zip_codes:0 nicht differenzierbar. Wenn das Modell diese Daten zusätzlich vorverarbeitet, um eine One-Hot-Codierungsdarstellung der Postleitzahlen zu erhalten, ist der Eingabetensor nach der Vorverarbeitung differenzierbar. Um ihn vom ursprünglichen Eingabetensor zu unterscheiden, können Sie ihn zip_codes_embedding:0 nennen.

Wenn Sie die Daten von beiden Eingabetensoren in Ihrer Erklärungsanfrage verwenden möchten, legen Sie die Metadaten-inputs so fest:

  • Legen Sie den "input feature key" auf einen aussagekräftigen Namen fest, z. B. zip_codes.
  • Legen Sie input_tensor_name auf den Namen des ursprünglichen Tensors (zip_codes:0) fest.
  • Legen Sie encoded_tensor_name auf den Namen des Tensors nach der One-Hot-Codierung fest (zip_codes_embedding:0).
  • Setzen Sie encoding auf 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"
      }
    },
  "framework": "tensorflow"
}

Alternativ können Sie input_tensor_name auf den Namen des codierten, differenzierbaren Eingabetensors setzen und den ursprünglichen, nicht differenzierbaren Tensor weglassen. Der Vorteil der Bereitstellung beider Tensoren besteht darin, dass Attributionen zu einzelnen Postleitzahlwerten statt zu deren One-Hot-Codierungsdarstellung vorgenommen werden können. In diesem Beispiel würden Sie den ursprünglichen Tensor (zip_codes:0) weglassen und input_tensor_name auf zip_codes_embedding:0 festlegen. Dieser Ansatz ist nicht empfehlenswert, da die resultierenden Featureattributionen schwer zu verstehen wären.

Codierung

Wenn Sie in der Erklärungsanfrage die Codierung aktivieren möchten, geben Sie die Codierungseinstellungen wie im vorherigen Beispiel gezeigt an.

Mit dem Codierungsfeature können Sie den Prozess der Umwandlung von codierten Daten in Eingabedaten für Attributionen rückgängig machen, sodass die zurückgegebenen Attributionen nicht manuell nachbearbeitet werden müssen. Zurzeit unterstützt AI Explanations combined_embedding, wobei ein Feature mit variabler Länge mit einer Einbettung kombiniert wird. Ein Beispielvorgang, der dieser combined_embedding entspricht, ist tf.nn.embedding_lookup_sparse.

Für die combined_embedding gilt:

Der Eingabetensor wird in einem 1D-Array codiert. Beispiel:

  • Eingabe: ["This", "is", "a", "test"]
  • Codiert: [0.1, 0.2, 0.3, 0.4]

Nächste Schritte