Memahami input dan output untuk penjelasan

Sebelum meminta penjelasan, Anda harus mengirimkan file metadata penjelasan untuk mengonfigurasi permintaan penjelasan. File metadata ini harus menyertakan input dan output model Anda. Selain itu, terdapat setelan opsional, seperti dasar pengukuran input dan setelan visualisasi untuk data gambar.

Menentukan input dan output model memungkinkan Anda memilih fitur tertentu untuk permintaan penjelasan, tanpa harus mengubah model. Anda dapat menggunakan Explainable AI SDK untuk melakukannya secara otomatis saat mem-build model baru. Jika tidak menggunakan Explainable AI SDK, Anda harus mengidentifikasi input dan output secara manual.

Panduan ini berfokus pada cara mengidentifikasi reCAPTCHA input dan output secara manual untuk membantu Anda menyiapkan file metadata penjelasan.

Input dan output dalam metadata penjelasan

Untuk menyiapkan metadata penjelasan, Anda harus menentukan input dan output untuk model Anda dalam file bernama explanation_metadata.json:

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

Dalam objek inputs dan outputs file, Anda harus memberikan nama tensor input dan output untuk permintaan penjelasan Anda.

  • Kunci untuk setiap input dan output ("kunci fitur input" dan "kunci nilai output" di contoh sebelumnya) memungkinkan Anda memberikan nama yang bermakna untuk setiap TensorFlow. Pada contoh di bawah, kunci fitur input adalah degrees_celsius, dan kunci nilai output adalah probabilities.
  • Untuk nilai di setiap metadata input dan output, Anda harus memberikan nama tensor yang sebenarnya sebagai input_tensor_name atau output_tensor_name. Pada contoh di bawah, input_tensor_name adalah x:0 dan output_tensor_name adalah dense/Softmax:0.
{
    "inputs": {
      "degrees_celsius": {
        "input_tensor_name": "x:0",
      }
    },
    "outputs": {
      "probabilities": {
        "output_tensor_name": "dense/Softmax:0"
      }
    },
  "framework": "tensorflow"
}

Nama TensorFlow sebenarnya diformat sebagai name:index.

Menemukan_tensor input dan output

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 mengidentifikasi fungsi dalam grafik Anda yang menerima input tensor dan menghasilkan output5. Demikian pula, file metadata penjelasan Anda menentukan input dan output grafik untuk permintaan atribusi fitur ke AI Explanations.

Sering kali, Tensor input dan output yang Anda tentukan dalam file metadata penjelasan memetakan persis dengan tanda tangan yang Anda tentukan saat menyimpan model. Jika demikian, menemukan nama TensorFlow input dan output Anda relatif mudah. Namun, dalam beberapa kasus, input atau output yang ingin Anda jelaskan mungkin berbeda dengan yang Anda tentukan saat menyimpan model.

Input dan output untuk penjelasan sama dengan yang Anda tetapkan dalam SignatureDef penayangan jika:

  • Input Anda tidak berbentuk seri
  • Setiap input ke SignatureDef 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.

Untuk kasus ini, Anda bisa mendapatkan nama-nama Tensor input dan output saat mem-build model. Atau, Anda dapat memeriksa SignatureDefSavedModel dengan SavedModel CLI untuk menemukan nama_tensor input dan output Anda.

Untuk kasus yang tidak sesuai dengan kriteria sebelumnya, ada pendekatan lain yang dapat Anda gunakan untuk menemukan tensor input dan output yang tepat.

Mendapatkan nama TensorFlow selama pelatihan

Cara paling mudah untuk mengakses nama TensorFlow input dan output selama pelatihan. Anda dapat menyimpan nilai ini ke file metadata penjelasan saat program atau lingkungan Anda masih memiliki akses ke variabel yang ditetapkan saat membuat model. Dalam contoh ini, kolom name lapisan Keras menghasilkan nama tensor dasar yang Anda perlukan untuk metadata penjelasan:

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

Untuk contoh yang berfungsi penuh, lihat contoh notebook.

Mendapatkan nama TensorFlow dari definisi tanda tangan

Mengingat bahwa SignatureDef dan metadata penjelasan mengidentifikasi input dan output tensor, Anda dapat menggunakan SignatureDef untuk menyiapkan file metadata penjelasan - asalkan memenuhi kriteria yang disebutkan sebelumnya.

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. Kedua TensorFlow juga memiliki nama yang bermakna: my_numpy_input dan probabilities. Guna meminta penjelasan untuk probabilities sehubungan dengan my_numpy_input, Anda dapat membuat file metadata penjelasan sebagai berikut:

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

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

Menangani perbedaan input dan output

Ada beberapa kasus umum saat argumen input dan output di metadata penjelasan Anda tidak boleh sama dengan yang ada di SignatureDef penyaluran:

  • 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.

Perbedaan 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.

Perbedaan 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 tambahan untuk gradien terintegrasi

AI Explanations menyediakan dua metode atribusi fitur: Shapley dengan sampel dan gradien terintegrasi. Penggunaan metode gradien terintegrasi mengharuskan Anda memastikan bahwa input Anda dapat dibedakan sehubungan dengan output, jadi Anda harus mengingat hal ini saat menyiapkan metadata penjelasan. Anda tidak perlu memastikan bahwa input Anda dapat dibedakan jika menggunakan metode atribusi fitur Shapley yang dijadikan sampel. Pelajari lebih lanjut metode atribusi fitur yang didukung dalam AI Explanations.

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:

  • Enkode input yang tidak terdiferensiasi sebagai input terdiferensiasi.
  • 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 TensorFlow input dalam permintaan penjelasan Anda, tetapkan metadata inputs sebagai berikut:

  • 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"
      }
    },
  "framework": "tensorflow"
}

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

Untuk mengaktifkan encoding dalam permintaan penjelasan, tentukan setelan encoding seperti yang ditunjukkan pada 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. Saat ini, AI Explanations mendukung combined_embedding, yang menggabungkan fitur dengan panjang variabel yang digabungkan ke dalam embedding. Contoh operasi yang cocok dengan combined_embedding ini adalah tf.nn.embedding_lookup_sparse.

Untuk combined_embedding:

Tensor input dienkode ke dalam array 1D. Contoh:

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

Langkah selanjutnya