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, model ini mencakup setelan opsional, seperti dasar pengukuran input dan setelan visualisasi untuk data gambar.
Dengan menentukan input dan output model, Anda dapat memilih fitur tertentu untuk permintaan penjelasan, tanpa perlu 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 tensor 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 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"
dalam contoh sebelumnya) memungkinkan Anda memberikan nama yang bermakna ke setiap tensor.
Pada contoh di bawah, kunci fitur input adalah
degrees_celsius
, dan kunci nilai output adalahprobabilities
. - Untuk nilai di setiap metadata
input
danoutput
, Anda harus memberikan nama sebenarnya dari tensor sebagaiinput_tensor_name
atauoutput_tensor_name
. Dalam contoh di bawah,input_tensor_name
adalahx:0
danoutput_tensor_name
adalahdense/Softmax:0
.
{
"inputs": {
"degrees_celsius": {
"input_tensor_name": "x:0",
}
},
"outputs": {
"probabilities": {
"output_tensor_name": "dense/Softmax:0"
}
},
"framework": "tensorflow"
}
Nama tensor yang 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 yang menerima input
tensor dan menghasilkan output tensor. 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 dipetakan persis ke tanda tangan yang Anda tentukan saat menyimpan model. Jika demikian, menemukan nama tensor input dan output Anda relatif mudah. Namun, dalam beberapa kasus, input atau output yang ingin Anda jelaskan dapat berbeda dengan yang Anda tentukan saat menyimpan model.
Input dan output Anda untuk penjelasan sama dengan yang Anda tetapkan di
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 tensor input dan output saat membuat model. Atau, Anda dapat memeriksa SignatureDef
SavedModel dengan
CLI SavedModel
untuk menemukan nama tensor input dan output.
Untuk kasus yang tidak sesuai dengan kriteria sebelumnya, ada pendekatan lain yang dapat Anda lakukan untuk menemukan tensor input dan output yang tepat.
Mendapatkan nama tensor selama pelatihan
Cara termudah untuk mengakses nama tensor input dan output adalah selama pelatihan. Anda
dapat menyimpan nilai ini ke file metadata penjelasan saat program
atau lingkungan Anda masih memiliki akses ke variabel yang Anda tetapkan saat mem-build
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 kerja lengkap, lihat contoh notebook.
Mendapatkan nama tensor 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 tensor juga memiliki nama yang bermakna:
my_numpy_input
dan probabilities
. Untuk meminta penjelasan tentang 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 di mana tensor input dan output dalam
metadata penjelasan Anda 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.
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 Integrated Gradients
AI Explanations menyediakan dua metode atribusi fitur: sampel Shapley dan gradien terintegrasi. Penggunaan metode Integrated Gradients mengharuskan Anda untuk memastikan bahwa input Anda terdiferensiasi terhadap output-nya, jadi Anda harus mengingat hal ini saat menyiapkan metadata penjelasan. Anda tidak perlu memastikan bahwa input Anda terdiferensiasi jika menggunakan metode atribusi fitur Shapley sampel. Pelajari lebih lanjut metode atribusi fitur yang didukung di Penjelasan AI.
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 tetapkanencoded_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
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
kecombined_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, Anda menentukan 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. Saat ini, Penjelasan AI mendukung combined_embedding
,
dengan fitur panjang variabel digabungkan ke dalam penyematan. Contoh
operasi yang cocok dengan combined_embedding
ini adalah
tf.nn.embedding_lookup_sparse
.
Untuk combined_embedding
:
Tensor input dienkode menjadi array 1D. Contoh:
- Input:
["This", "is", "a", "test"]
- Dienkode:
[0.1, 0.2, 0.3, 0.4]
Langkah selanjutnya
- Mencoba contoh notebook
- Pelajari cara men-deploy model dengan penjelasan