Class pengemudi untuk mendorong inferensi model dengan TensorFlow Lite.
Catatan: Jika Anda tidak membutuhkan akses ke "eksperimental" Fitur API di bawah ini, lebih suka menggunakan InterpreterApi dan InterpreterFactory daripada menggunakan Interpreter secara langsung.
Interpreter
mengenkapsulasi model TensorFlow Lite terlatih, dengan operasi
dieksekusi untuk inferensi model.
Misalnya, jika model hanya mengambil satu input dan hanya menampilkan satu output:
try (Interpreter interpreter = new Interpreter(file_of_a_tensorflowlite_model)) {
interpreter.run(input, output);
}
Jika model menggunakan beberapa input atau output:
Object[] inputs = {input0, input1, ...};
Map<Integer, Object> map_of_indices_to_outputs = new HashMap<>();
FloatBuffer ith_output = FloatBuffer.allocateDirect(3 * 2 * 4); // Float tensor, shape 3x2x4.
ith_output.order(ByteOrder.nativeOrder());
map_of_indices_to_outputs.put(i, ith_output);
try (Interpreter interpreter = new Interpreter(file_of_a_tensorflowlite_model)) {
interpreter.runForMultipleInputsOutputs(inputs, map_of_indices_to_outputs);
}
Jika model mengambil atau menghasilkan tensor string:
String[] input = {"foo", "bar"}; // Input tensor shape is [2].
String[][] output = new String[3][2]; // Output tensor shape is [3, 2].
try (Interpreter interpreter = new Interpreter(file_of_a_tensorflowlite_model)) {
interpreter.runForMultipleInputsOutputs(input, output);
}
Perhatikan bahwa ada perbedaan antara bentuk [] dan bentuk[1]. Untuk tensor string skalar output:
String[] input = {"foo"}; // Input tensor shape is [1].
ByteBuffer outputBuffer = ByteBuffer.allocate(OUTPUT_BYTES_SIZE); // Output tensor shape is [].
try (Interpreter interpreter = new Interpreter(file_of_a_tensorflowlite_model)) {
interpreter.runForMultipleInputsOutputs(input, outputBuffer);
}
byte[] outputBytes = new byte[outputBuffer.remaining()];
outputBuffer.get(outputBytes);
// Below, the `charset` can be StandardCharsets.UTF_8.
String output = new String(outputBytes, charset);
Urutan input dan output ditentukan saat mengonversi model TensorFlow ke TensorFlowLite dengan Toco, serta bentuk default input-nya.
Ketika input diberikan sebagai array (multi-dimensi), tensor input yang sesuai akan
secara implisit diubah ukurannya
sesuai dengan bentuk {i>array<i} itu. Jika input diberikan sebagai Buffer
tidak perlu mengubah ukuran secara implisit; pemanggil harus memastikan bahwa ukuran byte Buffer
cocok dengan tensor yang terkait, atau yang terlebih dahulu mengubah ukuran tensor melalui resizeInput(int, int[])
. Informasi bentuk dan jenis tensor dapat diperoleh melalui class Tensor
, yang tersedia melalui getInputTensor(int)
dan getOutputTensor(int)
.
PERINGATAN: Instance Interpreter
tidak aman untuk thread. Interpreter
memiliki resource yang harus dibebaskan secara eksplisit dengan memanggil close()
Library TFLite dibuat berdasarkan NDK API 19. Fitur ini mungkin berfungsi untuk API Android dengan level di bawah 19, tetapi tidak dijamin.
Class Bertingkat
class | Interpreter.Options | Class opsi untuk mengontrol perilaku penafsir runtime. |
Konstruktor Publik
Penerjemah(opsi File modelFile, Interpreter.Options)
Melakukan inisialisasi
Interpreter dan menentukan opsi untuk menyesuaikan perilaku penafsir. |
|
Penerjemah(opsi ByteBuffer byteBuffer, Interpreter.Options)
Melakukan inisialisasi
Interpreter dengan ByteBuffer dari file model dan sekumpulan
Interpreter.Options kustom. |
Metode Publik
void |
allocateTensors()
Secara eksplisit mengupdate alokasi untuk semua tensor, jika diperlukan.
|
void |
close()
Melepaskan resource yang terkait dengan instance
InterpreterApi . |
int | |
Tensor |
getInputTensor(int inputIndex)
Mendapatkan Tensor yang terkait dengan indeks input yang disediakan.
|
int |
getInputTensorCount()
Mendapatkan jumlah tensor input.
|
Tensor |
getInputTensorFromSignature(String inputName, String signatureKey)
Mendapatkan Tensor yang terkait dengan nama input dan nama metode tanda tangan yang diberikan.
|
Panjang |
getLastNativeInferenceDurationNanoseconds()
Menampilkan waktu inferensi native.
|
int | |
Tensor |
getOutputTensor(int outputIndex)
Mendapatkan Tensor yang terkait dengan indeks output yang diberikan.
|
int |
getOutputTensorCount()
Mendapatkan jumlah Tensor output.
|
Tensor |
getOutputTensorFromSignature(String outputName, String signatureKey)
Mendapatkan Tensor yang terkait dengan nama output yang diberikan dalam metode tanda tangan tertentu.
|
String[] |
getSignatureInputs(String signatureKey)
Mendapatkan daftar input SignatureDef untuk metode
signatureKey . |
String[] |
getSignatureKeys()
Mendapatkan daftar nama metode yang diekspor SignatureDef yang tersedia di model.
|
String[] |
getSignatureOutputs(String signatureKey)
Mendapatkan daftar output SignatureDef untuk metode
signatureKey . |
void |
resetVariableTensors()
Lanjutan: Mereset semua tensor variabel ke nilai default.
|
void |
resizeInput(int idx, int[] dims, boolean strict)
Mengubah ukuran input idx-th model native ke redup yang diberikan.
|
void |
resizeInput(int idx, int[] dims)
Mengubah ukuran input idx-th model native ke redup yang diberikan.
|
void | |
void |
runForMultipleInputsOutputs(input Object[], output Map<Integer, Object>)
Menjalankan inferensi model jika model mengambil beberapa input, atau menampilkan beberapa output.
|
void |
runSignature(Map<String, Object> input, Map<String, Objek> output)
Sama seperti
runSignature(Map, Map, String) tetapi tidak memerlukan penerusan signatureKey,
dengan asumsi model memiliki satu SignatureDef. |
void | |
void |
setCancelled(boolean dibatalkan)
Lanjutan: Mengganggu inferensi saat panggilan ke
run(Object, Object) . |
Metode Turunan
Konstruktor Publik
publik Penerjemah (File modelFile)
Melakukan inisialisasi Interpreter
.
Parameter
modelFile | File model TF Lite terlatih. |
---|
Menampilkan
IllegalArgumentException | jika modelFile tidak mengenkode TensorFlow Lite yang valid
model transformer.
|
---|
publik Penerjemah (File modelFile, opsi Interpreter.Options)
Melakukan inisialisasi Interpreter
dan menentukan opsi untuk menyesuaikan perilaku penafsir.
Parameter
modelFile | file model TF Lite terlatih |
---|---|
opsi | sekumpulan opsi untuk menyesuaikan perilaku penerjemah |
Menampilkan
IllegalArgumentException | jika modelFile tidak mengenkode TensorFlow Lite yang valid
model transformer.
|
---|
publik Penerjemah (ByteBuffer byteBuffer)
Menginisialisasi Interpreter
dengan ByteBuffer
file model.
ByteBuffer tidak boleh diubah setelah pembuatan Interpreter
. Tujuan
ByteBuffer
dapat berupa MappedByteBuffer
yang memetakan file model, atau
ByteBuffer
langsung dari nativeOrder() yang berisi konten byte dari suatu model.
Parameter
byteBuffer |
---|
Menampilkan
IllegalArgumentException | jika byteBuffer bukan MappedByteBuffer atau
ByteBuffer langsung dari nativeOrder.
|
---|
publik Penerjemah (ByteBuffer byteBuffer, opsi Interpreter.Options)
Melakukan inisialisasi Interpreter
dengan ByteBuffer
dari file model dan sekumpulan
Interpreter.Options
kustom.
ByteBuffer
tidak boleh diubah setelah pembuatan Interpreter
. ByteBuffer
dapat berupa MappedByteBuffer
yang dipetakan memori
file model, atau ByteBuffer
langsung dari nativeOrder() yang berisi konten byte
dari suatu model.
Parameter
byteBuffer | |
---|---|
opsi |
Menampilkan
IllegalArgumentException | jika byteBuffer bukan MappedByteBuffer atau
ByteBuffer langsung dari nativeOrder.
|
---|
Metode Publik
publik kosong allocateTensors ()
Secara eksplisit mengupdate alokasi untuk semua tensor, jika diperlukan.
Ini akan menyebarkan bentuk dan alokasi memori untuk tensor dependen menggunakan input Tensor shape(s) seperti yang diberikan.
Catatan: Panggilan ini *murni opsional*. Alokasi tensor akan otomatis terjadi selama eksekusi jika ada tensor input yang diubah ukurannya. Panggilan ini paling berguna dalam menentukan bentuk untuk tensor output apa pun sebelum mengeksekusi grafik, misalnya,
interpreter.resizeInput(0, new int[]{1, 4, 4, 3}));
interpreter.allocateTensors();
FloatBuffer input = FloatBuffer.allocate(interpreter.getInputTensor(0).numElements());
// Populate inputs...
FloatBuffer output = FloatBuffer.allocate(interpreter.getOutputTensor(0).numElements());
interpreter.run(input, output)
// Process outputs...
Catatan: Beberapa grafik memiliki output yang berbentuk dinamis, dalam hal ini bentuk output mungkin tidak sepenuhnya disebarkan hingga inferensi dijalankan.
publik kosong tutup ()
Melepaskan resource yang terkait dengan instance InterpreterApi
.
publik Int getInputIndex (String opName)
Mendapatkan indeks input berdasarkan nama op input.
Parameter
opName |
---|
publik Tensor getInputTensor (int inputIndex)
Mendapatkan Tensor yang terkait dengan indeks input yang disediakan.
Parameter
inputIndex |
---|
publik Int getInputTensorCount ()
Mendapatkan jumlah tensor input.
publik Tensor getInputTensorFromSignature (String inputName, String signatureKey)
Mendapatkan Tensor yang terkait dengan nama input dan nama metode tanda tangan yang diberikan.
PERINGATAN: Ini adalah API eksperimental dan dapat berubah sewaktu-waktu.
Parameter
inputName | Nama input dalam tanda tangan. |
---|---|
signatureKey | Kunci tanda tangan yang mengidentifikasi SignatureDef, bisa bernilai null jika model memiliki satu tanda tangan. |
Menampilkan
IllegalArgumentException | jika inputName atau signatureKey adalah null atau kosong,
atau nama yang diberikan tidak valid.
|
---|
publik Int getOutputIndex (String opName)
Mendapatkan indeks output berdasarkan nama op output.
Parameter
opName |
---|
publik Tensor getOutputTensor (int outputIndex)
Mendapatkan Tensor yang terkait dengan indeks output yang diberikan.
Catatan: Detail tensor output (misalnya, bentuk) mungkin tidak terisi sepenuhnya hingga setelah inferensi
dieksekusi. Jika Anda memerlukan detail yang diperbarui *sebelum* menjalankan inferensi (mis., setelah mengubah ukuran
tensor input, yang dapat membatalkan bentuk tensor output), gunakan allocateTensors()
untuk
secara eksplisit memicu alokasi
dan propagasi bentuk. Perhatikan bahwa, untuk grafik dengan bentuk output
bergantung pada *nilai* input, bentuk output mungkin tidak ditentukan sepenuhnya sampai
menjalankan inferensi.
Parameter
outputIndex |
---|
publik Int getOutputTensorCount ()
Mendapatkan jumlah Tensor output.
publik Tensor getOutputTensorFromSignature (String outputName, String signatureKey)
Mendapatkan Tensor yang terkait dengan nama output yang diberikan dalam metode tanda tangan tertentu.
Catatan: Detail tensor output (misalnya, bentuk) mungkin tidak terisi sepenuhnya hingga setelah inferensi
dieksekusi. Jika Anda memerlukan detail yang diperbarui *sebelum* menjalankan inferensi (mis., setelah mengubah ukuran
tensor input, yang dapat membatalkan bentuk tensor output), gunakan allocateTensors()
untuk
secara eksplisit memicu alokasi
dan propagasi bentuk. Perhatikan bahwa, untuk grafik dengan bentuk output
bergantung pada *nilai* input, bentuk output mungkin tidak ditentukan sepenuhnya sampai
menjalankan inferensi.
PERINGATAN: Ini adalah API eksperimental dan dapat berubah sewaktu-waktu.
Parameter
outputName | Nama output dalam tanda tangan. |
---|---|
signatureKey | Kunci tanda tangan yang mengidentifikasi SignatureDef, bisa bernilai null jika model memiliki satu tanda tangan. |
Menampilkan
IllegalArgumentException | jika outputName atau signatureKey adalah null atau
nama yang diberikan kosong, atau tidak valid.
|
---|
publik String[] getSignatureInputs (String signatureKey)
Mendapatkan daftar input SignatureDef untuk metode signatureKey
.
PERINGATAN: Ini adalah API eksperimental dan dapat berubah sewaktu-waktu.
Parameter
signatureKey |
---|
publik String[] getSignatureKeys ()
Mendapatkan daftar nama metode yang diekspor SignatureDef yang tersedia di model.
PERINGATAN: Ini adalah API eksperimental dan dapat berubah sewaktu-waktu.
publik String[] getSignatureOutputs (String signatureKey)
Mendapatkan daftar output SignatureDef untuk metode signatureKey
.
PERINGATAN: Ini adalah API eksperimental dan dapat berubah sewaktu-waktu.
Parameter
signatureKey |
---|
publik kosong resetVariableTensors ()
Lanjutan: Mereset semua tensor variabel ke nilai default.
Jika tensor variabel tidak memiliki buffer terkait, tensor akan direset ke nol.
PERINGATAN: Ini adalah API eksperimental dan dapat berubah sewaktu-waktu.
publik kosong resizeInput (int idx, int[] dims, boolean ketat)
Mengubah ukuran input idx-th model native ke redup yang diberikan.
Jika `strict` bernilai Benar, hanya dimensi yang tidak diketahui yang dapat diubah ukurannya. Dimensi yang tidak diketahui adalah ditunjukkan sebagai `-1` dalam array yang ditampilkan oleh `Tensor.shapeSignature()`.
Parameter
IDX | |
---|---|
redupkan | |
ketat |
publik kosong resizeInput (int idx, int[] dims)
Mengubah ukuran input idx-th model native ke redup yang diberikan.
Parameter
IDX | |
---|---|
redupkan |
publik kosong jalankan (Input Objek, output Objek)
Menjalankan inferensi model jika model hanya mengambil satu input, dan hanya memberikan satu output.
Peringatan: API lebih efisien jika Buffer
(sebaiknya langsung, tetapi tidak wajib)
digunakan sebagai tipe data input/output. Sebaiknya gunakan Buffer
untuk melakukan feed dan mengambil
data primitif untuk kinerja yang lebih baik. Jenis Buffer
konkret berikut adalah
didukung:
ByteBuffer
- kompatibel dengan semua jenis Tensor primitif yang mendasarinya.FloatBuffer
- kompatibel dengan Tensor float.IntBuffer
- kompatibel dengan Tensor int32.LongBuffer
- kompatibel dengan Tensor int64.
Buffer
, atau sebagai input skalar.Parameter
input | array atau array multidimensi, atau Buffer jenis primitif
termasuk int, float, long, dan byte. Buffer adalah cara yang direkomendasikan untuk meneruskan
untuk jenis primitif, sedangkan jenis string memerlukan penggunaan string
input array. Saat Buffer digunakan, kontennya tidak boleh berubah sampai
inferensi model selesai, dan pemanggil harus memastikan bahwa Buffer berada di
posisi baca yang sesuai. Nilai null hanya diizinkan jika pemanggil menggunakan
Delegate yang memungkinkan interop penanganan buffer, dan buffer tersebut telah diikat ke
masukkan Tensor . |
---|---|
hasil | array multidimensi dari data output, atau Buffer jenis primitif
termasuk int, float, long, dan byte. Saat Buffer digunakan, pemanggil harus memastikan
perintahnya mengatur posisi
tulis yang sesuai. Nilai {i>null <i}diizinkan, dan berguna untuk
kasus tertentu, misalnya, jika pemanggil menggunakan Delegate yang memungkinkan handle buffer
interop, dan buffer semacam itu telah terikat ke output Tensor (lihat juga Interpreter.Options#setAllowBufferHandleOutput(boolean)),
atau jika grafik memiliki output yang berbentuk dinamis dan pemanggil harus membuat kueri bentuk Tensor output setelah inferensi dipanggil, mengambil data langsung dari output
Tensor (melalui Tensor.asReadOnlyBuffer() ). |
publik kosong runForMultipleInputsOutputs (Input Objek[], Map<Integer, Objek> output)
Menjalankan inferensi model jika model mengambil beberapa input, atau menampilkan beberapa output.
Peringatan: API lebih efisien jika Buffer
(sebaiknya langsung, tetapi tidak wajib)
digunakan sebagai tipe data input/output. Sebaiknya gunakan Buffer
untuk melakukan feed dan mengambil
data primitif untuk kinerja yang lebih baik. Jenis Buffer
konkret berikut adalah
didukung:
ByteBuffer
- kompatibel dengan semua jenis Tensor primitif yang mendasarinya.FloatBuffer
- kompatibel dengan Tensor float.IntBuffer
- kompatibel dengan Tensor int32.LongBuffer
- kompatibel dengan Tensor int64.
Buffer
, atau sebagai input skalar.
Catatan: Nilai null
untuk elemen individu inputs
dan outputs
adalah
hanya diizinkan jika pemanggil menggunakan Delegate
yang memungkinkan interop penanganan buffer, dan
buffer tersebut telah terikat dengan Tensor
input atau output yang sesuai.
Parameter
input | array data input. Input harus dalam urutan yang sama dengan input
model transformer. Setiap input dapat berupa array atau array multidimensi, atau Buffer dari
jenis primitif termasuk int, float, long, dan byte. Buffer adalah cara yang direkomendasikan
untuk meneruskan data input besar, sedangkan jenis string memerlukan penggunaan array (multi-dimensi)
input teks. Saat Buffer digunakan, kontennya tidak boleh berubah sampai model
inferensi selesai, dan pemanggil harus memastikan bahwa Buffer berada di
posisi baca. |
---|---|
output | indeks output pemetaan peta ke array multidimensi dari data output atau Buffer jenis primitif termasuk int, float, long, dan byte. Sistem hanya perlu menyimpan
entri untuk output yang akan digunakan. Saat Buffer digunakan, pemanggil harus memastikan
perintahnya mengatur posisi
tulis yang sesuai. Peta mungkin kosong untuk kasus di mana
handle buffer digunakan untuk data tensor output, atau saat output
dibentuk dan pemanggil harus mengkueri bentuk Tensor output setelah inferensi
dipanggil, mengambil data langsung dari tensor output (melalui Tensor.asReadOnlyBuffer() ). |
publik kosong runSignature (Map<String, Object> input, Map<String, Objek> output)
Sama seperti runSignature(Map, Map, String)
tetapi tidak memerlukan penerusan signatureKey,
dengan asumsi model memiliki satu SignatureDef. Jika model memiliki lebih dari
satu SignatureDef, maka
menampilkan pengecualian.
PERINGATAN: Ini adalah API eksperimental dan dapat berubah sewaktu-waktu.
Parameter
input | |
---|---|
output |
publik kosong runSignature (Map<String, Object> input, Map<String, Object> output, String signatureKey)
Menjalankan inferensi model berdasarkan SignatureDef yang disediakan melalui signatureKey
.
Lihat run(Object, Object)
untuk detail selengkapnya tentang input dan output yang diizinkan
tipe data.
PERINGATAN: Ini adalah API eksperimental dan dapat berubah sewaktu-waktu.
Parameter
input | Peta dari nama input di SignatureDef ke objek input. |
---|---|
output | Peta dari nama output di SignatureDef ke data output. Kolom ini mungkin kosong jika
pemanggil ingin membuat kueri data Tensor langsung setelah inferensi (mis., jika
bentuk output bersifat dinamis, atau handle buffer output digunakan). |
signatureKey | Kunci tanda tangan yang mengidentifikasi SignatureDef. |
Menampilkan
IllegalArgumentException | jika inputs adalah null atau kosong, jika outputs atau
signatureKey adalah null, atau jika terjadi error saat menjalankan inferensi.
|
---|
publik kosong setCancelled (boolean dibatalkan)
Lanjutan: Mengganggu inferensi saat panggilan ke run(Object, Object)
.
Tanda pembatalan akan ditetapkan ke true saat fungsi ini dipanggil. Penerjemah akan
memeriksa flag di antara pemanggilan Op, dan jika yang ditampilkan adalah true
, penafsir akan berhenti
dalam proses eksekusi. Penerjemah akan tetap berstatus dibatalkan hingga "tidak dibatalkan" secara eksplisit dengan cara
setCancelled(false)
.
PERINGATAN: Ini adalah API eksperimental dan dapat berubah sewaktu-waktu.
Parameter
dibatalkan | true untuk membatalkan inferensi dengan cara terbaik; false hingga
resume. |
---|
Menampilkan
IllegalStateException | jika penafsir tidak diinisialisasi dengan cancellable , yang secara default nonaktif. |
---|