Menggunakan TensorFlow untuk penjelasan

Saat Anda bekerja dengan model TensorFlow yang dilatih khusus, ada informasi spesifik yang Anda perlukan untuk menyimpan model dan mengonfigurasi penjelasan.

Jika ingin menggunakan Vertex Explainable AI dengan model tabel AutoML, Anda tidak perlu melakukan konfigurasi apa pun; Vertex AI akan otomatis mengonfigurasi model untuk Vertex Explainable AI. Lewati dokumen ini dan baca Mendapatkan penjelasan.

Panduan ini memberikan informasi yang akan Anda perlukan saat melatih model TensorFlow untuk memastikan bahwa Anda dapat menggunakannya dengan Vertex Explainable AI. Secara khusus, panduan ini mencakup topik-topik berikut:

  • Menemukan nama tensor input dan output selama pelatihan yang perlu Anda tentukan saat mengonfigurasi resource Model untuk Vertex Explainable AI. Hal ini termasuk membuat dan menemukan tensor yang sesuai untuk Vertex Explainable AI dalam kasus khusus ketika tensor standar tidak dapat digunakan.

  • Mengekspor model TensorFlow sebagai SavedModel TensorFlow yang kompatibel dengan Vertex Explainable AI.

  • Menemukan nama tensor input dan output dari SavedModel TensorFlow yang telah diekspor. Hal ini dapat membantu jika Anda tidak memiliki akses ke kode pelatihan untuk model.

Menemukan nama tensor input dan output selama pelatihan

Saat menggunakan container bawaan TensorFlow untuk menginferensi prediksi, Anda harus mengetahui nama tensor input dan tensor output model Anda. Nama-nama ini ditentukan sebagai bagian dari pesan ExplanationMetadata saat Anda mengonfigurasi Model untuk Vertex Explainable AI

Jika model TensorFlow Anda memenuhi kriteria berikut, Anda dapat menggunakan "metode dasar" yang dijelaskan di bagian berikutnya untuk menentukan nama tensor ini selama pelatihan:

  • Input Anda tidak berbentuk seri
  • Setiap input ke SignatureDef model berisi nilai fitur secara langsung (dapat berupa nilai numerik atau string)
  • Output berupa nilai numerik, yang diperlakukan sebagai data numerik. Ini tidak termasuk ID kelas, yang dianggap sebagai data kategoris.

Jika model Anda tidak memenuhi kriteria ini, baca bagian Menyesuaikan kode pelatihan dan menemukan nama tensor dalam kasus khusus.

Metode dasar

Selama pelatihan, cetak atribut name tensor input model Anda dan tensor output-nya. Dalam contoh berikut, kolom name lapisan Keras menghasilkan nama tensor dasar yang Anda perlukan untuk 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)

Menjalankan kode Python ini akan mencetak output berikut:

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

Selanjutnya, Anda dapat menggunakan input_1:0 sebagai nama tensor input dan dense_1/Sigmod:0 sebagai nama tensor output saat mengonfigurasi Model untuk penjelasan.

Menyesuaikan kode pelatihan dan menemukan nama tensor dalam kasus khusus

Ada beberapa kasus umum di mana tensor input dan output untuk ExplanationMetadata tidak boleh sama dengan tensor input dan output di SignatureDef inferensi Anda:

  • Anda memiliki input serial
  • Grafik Anda mencakup operasi pra-pemrosesan
  • Output inferensi Anda bukan probabilitas, logit, atau jenis tensor floating point lainnya

Dalam hal ini, Anda harus menggunakan pendekatan lain untuk menemukan tensor input dan output yang tepat. Tujuan keseluruhannya adalah menemukan tensor yang relevan dengan nilai fitur yang ingin Anda jelaskan untuk input dan tensor yang terkait dengan logit (pra-aktivasi), probabilitas (pasca-aktivasi), atau representasi output lainnya.

Kasus khusus untuk tensor input

Input dalam metadata penjelasan berbeda dengan input dalam SignatureDef inferensi, jika Anda menggunakan input seri untuk dikirim ke model, atau jika grafik Anda mencakup operasi pra-pemrosesan.

Input seri

SavedModel TensorFlow dapat menerima berbagai input yang kompleks, termasuk:

  • Pesan tf.Example seri
  • String JSON
  • String berenkode Base64 (untuk merepresentasikan data gambar)

Jika model Anda menerima input seri seperti ini, penggunaan tensor ini secara langsung sebagai input untuk penjelasan tidak akan berhasil, atau akan memberikan hasil yang tidak masuk akal. Sebagai gantinya, Anda perlu menemukan tensor input berikutnya yang masuk ke kolom fitur dalam model Anda.

Saat mengekspor model, Anda dapat menambahkan operasi penguraian ke grafik TensorFlow dengan memanggil fungsi penguraian di fungsi input inferensi. Anda dapat menemukan fungsi penguraian yang tercantum dalam modul tf.io. Fungsi penguraian ini biasanya menampilkan tensor sebagai respons, dan tensor ini lebih sesuai untuk metadata penjelasan Anda.

Misalnya, Anda dapat menggunakan tf.parse_example() saat mengekspor model. Model Anda akan mengambil pesan tf.Example seri dan meng-output daftar tensor yang masuk ke kolom fitur. Anda dapat menggunakan output-nya untuk mengisi metadata penjelasan. Jika sebagian dari output ini adalah tf.SparseTensor, yang merupakan tuple bernama yang terdiri atas 3 tensor, Anda harus mendapatkan nama indeks, nilai, dan tensor dense_shape, serta mengisi kolom yang terkait di metadata.

Contoh berikut menunjukkan cara mendapatkan nama tensor input setelah operasi dekode:

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 pra-pemrosesan

Jika grafik model Anda berisi beberapa operasi pra-pemrosesan, sebaiknya dapatkan penjelasan tentang tensor setelah langkah pra-pemrosesan. Dalam hal ini, Anda dapat memperoleh nama tensor tersebut menggunakan properti name tf.Tensor dan memasukkannya dalam metadata penjelasan:

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)

Nama tensor yang didekode menjadi input_pixels:0.

Kasus khusus untuk tensor output

Biasanya, output dalam SignatureDef inferensi Anda berupa probabilitas atau logit.

Jika model Anda mengatribusikan probabilitas, tetapi Anda ingin menjelaskan nilai logit, Anda harus menemukan nama tensor output yang sesuai dan terkait dengan logit tersebut.

Jika SignatureDef inferensi Anda memiliki output yang bukan probabilitas atau logit, sebaiknya Anda melihat operasi probabilitas di grafik pelatihan. Skenario ini kecil kemungkinan untuk terjadi pada model Keras. Jika terjadi, Anda dapat menggunakan TensorBoard (atau alat visualisasi grafik lainnya) untuk membantu menemukan nama tensor output yang tepat.

Pertimbangan khusus untuk Integrated Gradients

Jika ingin menggunakan metode atribusi fitur Integrated Gradients dari Vertex Explainable AI, Anda harus memastikan bahwa input Anda terdiferensiasi terhadap output-nya.

Metadata penjelasan secara logis memisahkan fitur model dari inputnya. Saat menggunakan Integrated Gradients dengan tensor input yang tidak terdiferensiasi terhadap tensor output, Anda juga harus menyediakan versi berenkode (dan terdiferensiasi) dari fitur tersebut.

Gunakan pendekatan berikut jika Anda memiliki tensor input yang tidak terdiferensiasi, atau jika ada operasi yang tidak terdiferensiasi dalam grafik Anda:

  1. Enkode input yang tidak terdiferensiasi sebagai input terdiferensiasi.
  2. Tetapkan input_tensor_name ke nama tensor input asli yang tidak terdiferensiasi, dan tetapkan encoded_tensor_name ke nama versi berenkode dan terdiferensiasi-nya.

File metadata penjelasan dengan encoding

Sebagai contoh, pertimbangkan model yang memiliki fitur kategoris dengan tensor input bernama zip_codes:0. Karena data input ini menyertakan kode pos sebagai string, tensor input zip_codes:0 tidak terdiferensiasi. Jika model juga melakukan prapemrosesan data ini untuk mendapatkan representasi enkode one-hot kode pos tersebut, tensor input setelah pra-pemrosesan menjadi terdiferensiasi. Untuk membedakannya dari tensor input asli, Anda dapat menamainya zip_codes_embedding:0.

Untuk menggunakan data dari kedua tensor input dalam permintaan penjelasan Anda, tetapkan ExplanationMetadata sebagai berikut saat Anda mengonfigurasi Model untuk penjelasan:

  • Tetapkan kunci fitur input ke nama yang bermakna, seperti zip_codes.
  • Tetapkan input_tensor_name ke nama tensor aslinya, zip_codes:0.
  • Tetapkan encoded_tensor_name ke nama tensor setelah enkode one-hot, zip_codes_embedding:0.
  • Tetapkan encoding ke 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"
      }
    }
}

Atau, Anda dapat menetapkan input_tensor_name ke nama tensor input berenkode dan terdiferensiasi, serta menghapus tensor tidak terdiferensiasi aslinya. Dengan memberikan kedua tensor ini, atribusi dapat dibuat ke nilai kode pos individual, bukan ke representasi enkode one-hot-nya. Dalam contoh ini, Anda akan mengecualikan tensor asli (zip_codes:0) dan menetapkan input_tensor_name ke zip_codes_embedding:0. Pendekatan ini tidak direkomendasikan, karena atribusi fitur yang dihasilkan akan sulit untuk dicerna.

Encoding

Guna mengaktifkan encoding untuk Model, tentukan setelan encoding seperti yang ditunjukkan dalam contoh sebelumnya.

Fitur encoding membantu membalik proses dari data berenkode menjadi data input untuk atribusi, sehingga Anda tidak perlu melakukan pasca-pemrosesan terhadap atribusi yang ditampilkan secara manual. Lihat daftar encoding yang didukung Vertex Explainable AI.

Untuk encoding COMBINED_EMBEDDING, tensor input dienkode menjadi array 1D.

Contoh:

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

Mengekspor SavedModel TensorFlow untuk Vertex Explainable AI

Setelah melatih model TensorFlow, ekspor model tersebut sebagai SavedModel. SavedModel TensorFlow berisi model TensorFlow terlatih, beserta tanda tangan, variabel, dan aset seri lainnya yang diperlukan untuk menjalankan grafik. Setiap SignatureDef di SavedModel mengidentifikasi sebuah fungsi dalam grafik yang menerima input tensor dan menghasilkan output tensor.

Untuk memastikan SaveModel Anda kompatibel dengan Vertex Explainable AI, ikuti petunjuk di salah satu bagian berikut, bergantung pada apakah Anda menggunakan TensorFlow 2 atau TensorFlow 1.

TensorFlow 2

Jika Anda menggunakan TensorFlow 2.x, gunakan tf.saved_model.save untuk menyimpan model Anda. Anda dapat menentukan tanda tangan input saat menyimpan model. Jika Anda memiliki satu tanda tangan input, Vertex Explainable AI akan menggunakan fungsi inferensi default untuk permintaan penjelasan Anda. Jika memiliki lebih dari satu tanda tangan input, Anda harus menentukan tanda tangan untuk fungsi default inferensi saat menyimpan model:

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

Dalam hal ini, Vertex Explainable AI akan menggunakan tanda tangan fungsi model yang Anda simpan dengan kunci xai_model untuk permintaan penjelasan Anda. Gunakan string yang sama persis dengan xai_model untuk kunci tersebut.

Jika menggunakan fungsi pra-pemrosesan, Anda juga harus menentukan tanda tangan untuk fungsi pra-pemrosesan dan fungsi model. Anda harus menggunakan string yang sama persis dengan xai_preprocess dan xai_model sebagai kunci:

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

Dalam hal ini, Vertex Explainable AI akan menggunakan fungsi pra-pemrosesan dan fungsi model Anda untuk permintaan penjelasan. Pastikan output fungsi pra-pemrosesan Anda cocok dengan input yang diharapkan oleh fungsi model Anda.

Pelajari lebih lanjut cara menentukan tanda tangan inferensi di TensorFlow.

TensorFlow 1.15

Jika Anda menggunakan TensorFlow 1.15, jangan gunakan tf.saved_model.save. Vertex Explainable AI tidak mendukung model TensorFlow 1 yang disimpan dengan metode ini.

Jika membangun dan melatih model di Keras, Anda harus mengonversi model menjadi Estimator TensorFlow, lalu mengekspornya ke SavedModel. Bagian ini berfokus pada penyimpanan model.

Setelah membangun, mengompilasi, melatih, dan mengevaluasi model Keras, Anda harus:

  • Mengonversi model Keras menjadi Estimator TensorFlow menggunakan tf.keras.estimator.model_to_estimator
  • Memberikan fungsi input inferensi menggunakan tf.estimator.export.build_raw_serving_input_receiver_fn
  • Mengekspor model sebagai SavedModel menggunakan 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)

Mendapatkan nama tensor dari SignatureDef SavedModel

Anda dapat menggunakan SignatureDef SavedModel TensorFlow untuk menyiapkan metadata penjelasan, asalkan kriteria untuk "metode dasar" yang dijelaskan di bagian sebelumnya terpenuhi. Hal ini berguna jika Anda tidak memiliki akses ke kode pelatihan yang menghasilkan model.

Untuk memeriksa SignatureDef SavedModel, Anda dapat menggunakan CLI SavedModel. Pelajari lebih lanjut cara menggunakan CLI SavedModel.

Perhatikan contoh SignatureDef berikut:

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

Grafik ini memiliki tensor input dengan nama x:0 dan tensor output dengan nama dense/Softmax:0. Saat mengonfigurasi Model untuk penjelasan, gunakan x:0 sebagai nama tensor input dan dense/Softmax:0 sebagai nama tensor output dalam pesan ExplanationMetadata.

Langkah selanjutnya