Pendahuluan
Dalam artikel ini, saya akan membahas cara mengonversi model TensorFlow ke format ONNX, memeriksa model yang telah dikonversi, dan melakukan inferensi menggunakan model ONNX.
Persiapan Model TensorFlow
Dalam bab ini, saya akan membahas instalasi dependensi yang diperlukan, pengunduhan model.
Menginstal Dependensi
Sebelum memulai, pastikan Anda telah menginstal Python 3.6 atau yang lebih tinggi di sistem Anda. Kemudian, instal paket yang diperlukan untuk TensorFlow dan tf2onnx menggunakan pip:
$ pip install tensorflow
$ pip install tf2onnx
Memuat Model
Untuk memuat model TensorFlow, Anda dapat menggunakan fungsi load_model
dari modul tensorflow.keras.models
. Fungsi ini dapat menangani format SavedModel dan format HDF5.
Untuk SavedModel, berikan path ke direktori yang berisi model:
import tensorflow as tf
model_path = "path/to/your/tensorflow/saved_model"
model = tf.keras.models.load_model(model_path)
Untuk model HDF5, berikan path ke file .h5
:
model_path = "path/to/your/tensorflow/model.h5"
model = tf.keras.models.load_model(model_path)
Jika model Anda memiliki layer atau komponen khusus, Anda mungkin perlu menyediakan kamus custom_objects
ke dalam fungsi load_model
:
custom_objects = {
'CustomLayer': CustomLayer,
'custom_metric': custom_metric
}
model = tf.keras.models.load_model(model_path, custom_objects=custom_objects)
Mengonversi Model ke Format ONNX
Dalam bab ini, saya akan menjelajahi proses mengonversi model TensorFlow ke format ONNX menggunakan perpustakaan tf2onnx. Kita akan membahas proses konversi, opsi kustomisasi.
Melakukan Konversi dengan tf2onnx
Untuk mengonversi model TensorFlow ke format ONNX, kita akan menggunakan fungsi convert.from_keras
dari modul tf2onnx
. Fungsi ini mengambil model TensorFlow sebagai argumen utamanya dan mengembalikan objek protobuf yang mewakili model ONNX:
import tf2onnx
# Perform the conversion
model_proto, _ = tf2onnx.convert.from_keras(model)
Selanjutnya, simpan objek protobuf sebagai file ONNX:
output_onnx_model = "path/to/output/onnx/model.onnx"
with open(output_onnx_model, "wb") as f:
f.write(model_proto.SerializeToString())
Menyesuaikan Proses Konversi
Anda dapat menyesuaikan proses konversi dengan menyediakan argumen tambahan untuk fungsi from_keras()
. Beberapa argumen yang sering digunakan adalah:
target_opset
: Tentukan versi opset ONNX target yang akan digunakan. Default adalah versi opset terbaru yang didukung oleh tf2onnx.
model_proto, _ = tf2onnx.convert.from_keras(model, target_opset=12)
large_model
: Jika model Anda terlalu besar untuk muat di memori, Anda dapat mengaktifkan opsi ini untuk mengonversi model dalam chunk.
model_proto, _ = tf2onnx.convert.from_keras(model, large_model=True)
output_names
: Berikan daftar nama output untuk model ONNX. Secara default, nama output dari model TensorFlow digunakan.
output_names = ["output1", "output2"]
model_proto, _ = tf2onnx.convert.from_keras(model, output_names=output_names)
Untuk opsi kustomisasi lainnya, lihat dokumentasi tf2onnx.
Memeriksa Model ONNX yang Telah Dikonversi
Dalam bab ini, saya akan membahas cara memeriksa dan memvalidasi model ONNX yang telah dikonversi. Kita akan membahas metode untuk memverifikasi struktur model, menguji akurasinya.
Memverifikasi Struktur Model
Untuk memeriksa struktur model ONNX yang telah dikonversi, gunakan perpustakaan onnx
untuk memuat model dan melakukan serangkaian pemeriksaan:
import onnx
onnx_model = onnx.load(output_onnx_model)
onnx.checker.check_model(onnx_model)
Ini akan menimbulkan pengecualian jika model tidak valid atau mengandung operasi yang tidak didukung. Jika model lulus pemeriksaan, Anda dapat melanjutkan untuk menguji akurasinya.
Menguji Akurasi Model
Untuk menguji akurasi model ONNX, jalankan inferensi pada model TensorFlow asli dan model ONNX yang telah dikonversi, dan bandingkan outputnya. Anda dapat menggunakan langkah-langkah berikut:
- Persiapkan input sampel untuk model:
import numpy as np
input_data = np.random.rand(1, 224, 224, 3).astype(np.float32)
- Jalankan inferensi pada model TensorFlow:
tf_output = model.predict(input_data)
- Jalankan inferensi pada model ONNX menggunakan ONNX Runtime:
from onnxruntime import InferenceSession
sess = InferenceSession(output_onnx_model)
input_name = sess.get_inputs()[0].name
onnx_output = sess.run(None, {input_name: input_data})
- Bandingkan output dan hitung perbedaannya:
difference = np.abs(tf_output - onnx_output).max()
print("Difference:", difference)
- Periksa apakah perbedaan berada dalam rentang yang dapat diterima:
assert np.allclose(tf_output, onnx_output, rtol=1e-05, atol=1e-07), "Output values do not match"
Inferensi Menggunakan Model ONNX yang Telah Dikonversi
Dalam bab ini, saya akan menunjukkan cara melakukan inferensi menggunakan model ONNX yang telah dikonversi. Kita akan membahas cara memuat model ONNX dengan ONNX Runtime, mempersiapkan data input, menjalankan inferensi, dan memproses output.
Memuat Model ONNX
Untuk memuat model ONNX yang telah dikonversi, gunakan kelas InferenceSession dari ONNX Runtime:
from onnxruntime import InferenceSession
sess = InferenceSession(output_onnx_model)
Memperkenalkan Data Input
Persiapkan data input untuk model. Data input harus sesuai dengan bentuk input dan tipe data yang diharapkan oleh model. Misalnya:
import numpy as np
input_data = np.random.rand(1, 224, 224, 3).astype(np.float32)
Menjalankan Inferensi
Untuk menjalankan inferensi dengan model ONNX, panggil metode run
pada objek InferenceSession
. Anda perlu menyediakan kamus yang memetakan nama input ke data input yang sesuai:
input_name = sess.get_inputs()[0].name
output = sess.run(None, {input_name: input_data})
Pada contoh ini, kita melewatkan None
sebagai argumen pertama ke metode run
, yang berarti output dari semua node output akan dikembalikan. Sebagai alternatif, Anda dapat menyediakan daftar nama output untuk memperoleh output dari node yang spesifik.
Memproses Output
Setelah menjalankan inferensi, Anda dapat memproses output untuk memperoleh informasi atau prediksi yang diinginkan. Format output akan bergantung pada model dan tugas tertentu. Misalnya, jika model adalah classifier, Anda mungkin ingin mencari kelas dengan probabilitas tertinggi:
predicted_class = np.argmax(output[0], axis=-1)
print("Predicted class:", predicted_class)
Referensi