Kelas driver untuk mendorong inferensi model dengan TensorFlow Lite.
Catatan: Jika Anda tidak memerlukan akses ke salah satu fitur API "eksperimental" di bawah ini, lebih baik gunakan InterpreterApi dan InterpreterFactory daripada menggunakan Interpreter secara langsung.
Interpreter
merangkum model TensorFlow Lite yang telah dilatih sebelumnya, di mana operasi dijalankan untuk inferensi model.
Misalnya, jika model hanya mengambil satu input dan mengembalikan hanya satu output:
try (Interpreter interpreter = new Interpreter(file_of_a_tensorflowlite_model)) {
interpreter.run(input, output);
}
Jika model mengambil 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);
}
Urutan input dan output ditentukan saat mengonversi model TensorFlow ke model TensorFlowLite dengan Toco, seperti juga bentuk default input.
Ketika input disediakan sebagai array (multi-dimensi), tensor input yang sesuai akan diubah ukurannya secara implisit sesuai dengan bentuk array tersebut. Ketika input disediakan sebagai tipe Buffer
, tidak ada pengubahan ukuran implisit yang dilakukan; pemanggil harus memastikan bahwa ukuran byte Buffer
cocok dengan tensor terkait, atau mereka terlebih dahulu mengubah ukuran tensor melalui resizeInput(int, int[])
. Informasi bentuk dan jenis tensor dapat diperoleh melalui kelas Tensor
, tersedia melalui getInputTensor(int)
dan getOutputTensor(int)
.
PERINGATAN: Instance Interpreter
bahasa tidak aman untuk thread. Interpreter
memiliki resource yang harus dibebaskan secara eksplisit dengan memanggil close()
Pustaka TFLite dibuat dengan NDK API 19. Pustaka ini dapat berfungsi untuk Android API level di bawah 19, tetapi tidak dijamin.
Kelas Bersarang
kelas | Interpreter.Options | Kelas opsi untuk mengontrol perilaku juru bahasa runtime. |
Konstruktor Publik
Interpreter ( File modelFile, opsi Interpreter.Options ) Menginisialisasi Interpreter dan menentukan opsi untuk menyesuaikan perilaku interpreter. | |
Interpreter ( opsi ByteBuffer byteBuffer, Interpreter.Options ) Menginisialisasi Interpreter dengan ByteBuffer dari file model dan satu set Interpreter.Options kustom. |
Metode Publik
ruang kosong | mengalokasikanTensor () Memperbarui alokasi secara eksplisit untuk semua tensor, jika perlu. |
ruang kosong | tutup () Lepaskan sumber daya yang terkait dengan instance InterpreterApi . |
ke dalam | |
Tensor | getInputTensor (int inputIndex) Mendapatkan Tensor yang terkait dengan indeks input yang disediakan. |
ke dalam | 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 () Mengembalikan waktu inferensi asli. |
ke dalam | getOutputIndex ( String opName) Mendapat indeks dari sebuah output yang diberi nama op dari output tersebut. |
Tensor | getOutputTensor (int outputIndex) Mendapatkan Tensor yang terkait dengan indeks output yang disediakan. |
ke dalam | getOutputTensorCount () Mendapatkan jumlah Tensor keluaran. |
Tensor | getOutputTensorFromSignature ( String outputName, String signatureKey) Mengaitkan Tensor dengan nama keluaran yang diberikan dalam metode tanda tangan tertentu. |
Rangkaian[] | getSignatureInputs ( String signatureKey) Mendapatkan daftar input SignatureDefs untuk metode signatureKey . |
Rangkaian[] | getSignatureKeys () Mendapatkan daftar nama metode yang diekspor SignatureDef yang tersedia dalam model. |
Rangkaian[] | getSignatureOutputs ( String signatureKey) Mendapatkan daftar keluaran SignatureDefs untuk metode signatureKey . |
ruang kosong | resetVariableTensor () Lanjutan: Mereset semua tensor variabel ke nilai default. |
ruang kosong | resizeInput (int idx, int[] redup, boolean ketat) Mengubah ukuran input ke-idx dari model asli ke redup yang diberikan. |
ruang kosong | resizeInput (int idx, int[] redup) Mengubah ukuran input ke-idx dari model asli ke redup yang diberikan. |
ruang kosong | |
ruang kosong | runForMultipleInputsOutputs ( Object[] input, Map < Integer , Object > outputs) Menjalankan inferensi model jika model mengambil banyak input, atau mengembalikan beberapa output. |
ruang kosong | runSignature ( Map < String , Object > inputs, Map < String , Object > outputs) Sama seperti runSignature(Map, Map, String) tetapi tidak perlu melewati signatureKey, dengan asumsi model memiliki satu SignatureDef. |
ruang kosong | |
ruang kosong | setCancelled (boolean dibatalkan) Lanjutan: Menginterupsi inferensi di tengah panggilan untuk run(Object, Object) . |
Metode yang Diwarisi
Konstruktor Publik
Interpreter publik ( File modelFile)
Menginisialisasi Interpreter
.
Parameter
modelFile | a File model TF Lite yang telah dilatih sebelumnya. |
---|
Melempar
Pengecualian Argumen Ilegal | jika modelFile tidak mengkodekan model TensorFlow Lite yang valid. |
---|
Interpreter publik ( File modelFile, opsi Interpreter.Options )
Menginisialisasi Interpreter
dan menentukan opsi untuk menyesuaikan perilaku interpreter.
Parameter
modelFile | file model TF Lite yang telah dilatih sebelumnya |
---|---|
pilihan | satu set opsi untuk menyesuaikan perilaku juru bahasa |
Melempar
Pengecualian Argumen Ilegal | jika modelFile tidak mengkodekan model TensorFlow Lite yang valid. |
---|
Interpreter publik ( ByteBuffer byteBuffer)
Menginisialisasi Interpreter
dengan ByteBuffer
dari file model.
ByteBuffer tidak boleh dimodifikasi setelah konstruksi Interpreter
. ByteBuffer
dapat berupa MappedByteBuffer
yang memetakan memori file model, atau ByteBuffer
langsung dari nativeOrder() yang berisi konten byte model.
Parameter
byteBuffer |
---|
Melempar
Pengecualian Argumen Ilegal | jika byteBuffer bukan MappedByteBuffer atau ByteBuffer langsung dari nativeOrder. |
---|
Interpreter publik ( ByteBuffer byteBuffer, opsi Interpreter.Options )
Menginisialisasi Interpreter
dengan ByteBuffer
dari file model dan satu set Interpreter.Options
kustom.
ByteBuffer
tidak boleh dimodifikasi setelah konstruksi Interpreter
. ByteBuffer
dapat berupa MappedByteBuffer
yang memetakan memori file model, atau ByteBuffer
langsung dari nativeOrder() yang berisi konten byte model.
Parameter
byteBuffer | |
---|---|
pilihan |
Melempar
Pengecualian Argumen Ilegal | jika byteBuffer bukan MappedByteBuffer atau ByteBuffer langsung dari nativeOrder. |
---|
Metode Publik
public void mengalokasikanTensor ()
Memperbarui alokasi secara eksplisit untuk semua tensor, jika perlu.
Ini akan menyebarkan bentuk dan alokasi memori untuk tensor dependen menggunakan bentuk tensor input seperti yang diberikan.
Catatan: Panggilan ini *semata-mata opsional*. Alokasi tensor akan terjadi secara otomatis selama eksekusi jika ada tensor input yang diubah ukurannya. Panggilan ini paling berguna dalam menentukan bentuk untuk setiap tensor keluaran 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 berbentuk dinamis, dalam hal ini bentuk output mungkin tidak sepenuhnya menyebar sampai inferensi dieksekusi.
kekosongan publik tutup ()
Lepaskan sumber daya yang terkait dengan instance InterpreterApi
.
int publik getInputIndex ( String opName)
Mendapat indeks input yang diberikan nama op input.
Parameter
opName |
---|
Tensor publik getInputTensor (int inputIndex)
Mendapatkan Tensor yang terkait dengan indeks input yang disediakan.
Parameter
masukanIndeks |
---|
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.
Parameter
masukanNama | Masukkan nama dalam tanda tangan. |
---|---|
kunci tanda tangan | Kunci tanda tangan yang mengidentifikasi SignatureDef, bisa nol jika model memiliki satu tanda tangan. |
Melempar
Pengecualian Argumen Ilegal | jika inputName atau signatureKey adalah null atau kosong, atau nama yang diberikan tidak valid. |
---|
int publik getOutputIndex ( String opName)
Mendapat indeks dari sebuah output yang diberi nama op dari output tersebut.
Parameter
opName |
---|
Tensor publik getOutputTensor (int outputIndex)
Mendapatkan Tensor yang terkait dengan indeks output yang disediakan.
Catatan: Detail tensor keluaran (misalnya, bentuk) mungkin tidak terisi penuh hingga setelah inferensi dijalankan. Jika Anda memerlukan detail yang diperbarui *sebelum* menjalankan inferensi (misalnya, setelah mengubah ukuran tensor input, yang dapat membatalkan bentuk tensor output), gunakan allocateTensors()
untuk memicu alokasi dan propagasi bentuk secara eksplisit. Perhatikan bahwa, untuk grafik dengan bentuk keluaran yang bergantung pada *nilai* masukan, bentuk keluaran mungkin tidak sepenuhnya ditentukan hingga inferensi dijalankan.
Parameter
indeks keluaran |
---|
int publik getOutputTensorCount ()
Mendapatkan jumlah Tensor keluaran.
publik Tensor getOutputTensorFromSignature ( String outputName, String signatureKey)
Mengaitkan Tensor dengan nama keluaran yang diberikan dalam metode tanda tangan tertentu.
Catatan: Detail tensor keluaran (misalnya, bentuk) mungkin tidak terisi penuh hingga setelah inferensi dijalankan. Jika Anda memerlukan detail yang diperbarui *sebelum* menjalankan inferensi (misalnya, setelah mengubah ukuran tensor input, yang dapat membatalkan bentuk tensor output), gunakan allocateTensors()
untuk memicu alokasi dan propagasi bentuk secara eksplisit. Perhatikan bahwa, untuk grafik dengan bentuk keluaran yang bergantung pada *nilai* masukan, bentuk keluaran mungkin tidak sepenuhnya ditentukan hingga inferensi dijalankan.
PERINGATAN: Ini adalah API eksperimental dan dapat berubah.
Parameter
nama keluaran | Nama keluaran dalam tanda tangan. |
---|---|
kunci tanda tangan | Kunci tanda tangan yang mengidentifikasi SignatureDef, bisa nol jika model memiliki satu tanda tangan. |
Melempar
Pengecualian Argumen Ilegal | jika outputName atau signatureKey adalah null atau kosong, atau nama yang diberikan tidak valid. |
---|
public String[] getSignatureInputs ( String signatureKey)
Mendapatkan daftar input SignatureDefs untuk metode signatureKey
.
PERINGATAN: Ini adalah API eksperimental dan dapat berubah.
Parameter
kunci tanda tangan |
---|
String publik[] getSignatureKeys ()
Mendapatkan daftar nama metode yang diekspor SignatureDef yang tersedia dalam model.
PERINGATAN: Ini adalah API eksperimental dan dapat berubah.
public String[] getSignatureOutputs ( String signatureKey)
Mendapatkan daftar keluaran SignatureDefs untuk metode signatureKey
.
PERINGATAN: Ini adalah API eksperimental dan dapat berubah.
Parameter
kunci tanda tangan |
---|
publik void resetVariableTensors ()
Lanjutan: Mereset semua tensor variabel ke nilai default.
Jika tensor variabel tidak memiliki buffer terkait, itu akan direset ke nol.
PERINGATAN: Ini adalah API eksperimental dan dapat berubah.
public void resizeInput (int idx, int[] redup, boolean ketat)
Mengubah ukuran input ke-idx dari model asli ke redup yang diberikan.
Jika `strict` adalah True, hanya dimensi yang tidak diketahui yang dapat diubah ukurannya. Dimensi yang tidak diketahui ditunjukkan sebagai `-1` dalam larik yang dikembalikan oleh `Tensor.shapeSignature()`.
Parameter
idx | |
---|---|
redup | |
ketat |
public void resizeInput (int idx, int[] meredup)
Mengubah ukuran input ke-idx dari model asli ke redup yang diberikan.
Parameter
idx | |
---|---|
redup |
public void run ( Input objek , Output objek )
Menjalankan inferensi model jika model hanya membutuhkan satu input, dan hanya menyediakan satu output.
Peringatan: API lebih efisien jika Buffer
(sebaiknya langsung, tetapi tidak wajib) digunakan sebagai tipe data input/output. Harap pertimbangkan untuk menggunakan Buffer
untuk memberi makan dan mengambil data primitif untuk kinerja yang lebih baik. Jenis Buffer
beton berikut ini 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
s, atau sebagai input skalar. Parameter
memasukkan | array atau array multidimensi, atau Buffer tipe primitif termasuk int, float, long, dan byte. Buffer adalah cara yang lebih disukai untuk melewatkan data input besar untuk tipe primitif, sedangkan tipe string memerlukan penggunaan jalur input array (multi-dimensi). Ketika Buffer digunakan, isinya harus tetap tidak berubah sampai inferensi model selesai, dan pemanggil harus memastikan bahwa Buffer berada pada posisi baca yang sesuai. Nilai null hanya diperbolehkan jika pemanggil menggunakan Delegate yang memungkinkan buffer menangani interop, dan buffer tersebut telah diikat ke input Tensor . |
---|---|
keluaran | array multidimensi data keluaran, atau Buffer tipe primitif termasuk int, float, long, dan byte. Ketika Buffer digunakan, pemanggil harus memastikan bahwa itu diatur pada posisi tulis yang sesuai. Nilai null diperbolehkan, dan berguna untuk kasus tertentu, misalnya, jika pemanggil menggunakan Delegate yang memungkinkan interop pegangan buffer, dan buffer tersebut telah diikat ke Tensor keluaran (lihat juga Interpreter.Options#setAllowBufferHandleOutput(boolean) ), atau jika grafik memiliki keluaran berbentuk dinamis dan pemanggil harus menanyakan bentuk Tensor keluaran setelah inferensi dipanggil, mengambil data langsung dari tensor keluaran (melalui Tensor.asReadOnlyBuffer() ). |
public void runForMultipleInputsOutputs ( Object[] input, Map < Integer , Object > outputs)
Menjalankan inferensi model jika model mengambil banyak input, atau mengembalikan beberapa output.
Peringatan: API lebih efisien jika Buffer
s (sebaiknya langsung, tetapi tidak wajib) digunakan sebagai tipe data input/output. Harap pertimbangkan untuk menggunakan Buffer
untuk memberi makan dan mengambil data primitif untuk kinerja yang lebih baik. Jenis Buffer
beton berikut ini 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
s, atau sebagai input skalar. Catatan: nilai null
untuk elemen inputs
dan outputs
individu hanya diperbolehkan jika pemanggil menggunakan Delegate
yang memungkinkan interop pegangan buffer, dan buffer tersebut telah diikat ke Tensor
input atau output yang sesuai.
Parameter
masukan | array data masukan. Input harus dalam urutan yang sama dengan input model. Setiap input dapat berupa array atau array multidimensi, atau Buffer tipe primitif termasuk int, float, long, dan byte. Buffer adalah cara yang lebih disukai untuk melewatkan data input yang besar, sedangkan tipe string memerlukan penggunaan jalur input array (multi-dimensi). Ketika Buffer digunakan, isinya harus tetap tidak berubah sampai model inferensi selesai, dan pemanggil harus memastikan bahwa Buffer berada pada posisi baca yang sesuai. |
---|---|
keluaran | peta indeks keluaran pemetaan ke array multidimensi data keluaran atau Buffer s tipe primitif termasuk int, float, long, dan byte. Itu hanya perlu menyimpan entri untuk output yang akan digunakan. Ketika Buffer digunakan, pemanggil harus memastikan bahwa itu diatur pada posisi tulis yang sesuai. Peta mungkin kosong untuk kasus di mana salah satu pegangan buffer digunakan untuk data tensor keluaran, atau kasus di mana keluaran berbentuk dinamis dan pemanggil harus menanyakan bentuk Tensor keluaran setelah inferensi dipanggil, mengambil data langsung dari tensor keluaran ( melalui Tensor.asReadOnlyBuffer() ). |
public void runSignature ( Map < String , Object > inputs, Map < String , Object > outputs)
Sama seperti runSignature(Map, Map, String)
tetapi tidak perlu melewati signatureKey, dengan asumsi model memiliki satu SignatureDef. Jika model memiliki lebih dari satu SignatureDef, itu akan menimbulkan pengecualian.
PERINGATAN: Ini adalah API eksperimental dan dapat berubah.
Parameter
masukan | |
---|---|
keluaran |
public void runSignature ( Map < String , Object > inputs, Map < String , Object > outputs, String signatureKey)
Menjalankan inferensi model berdasarkan SignatureDef yang disediakan melalui signatureKey
.
Lihat run(Object, Object)
untuk detail lebih lanjut tentang tipe data input dan output yang diizinkan.
PERINGATAN: Ini adalah API eksperimental dan dapat berubah.
Parameter
masukan | Peta dari nama input di SignatureDef ke objek input. |
---|---|
keluaran | Peta dari nama keluaran di SignatureDef ke data keluaran. Ini mungkin kosong jika pemanggil ingin menanyakan data Tensor secara langsung setelah inferensi (misalnya, jika bentuk outputnya dinamis, atau pegangan buffer output digunakan). |
kunci tanda tangan | Kunci tanda tangan yang mengidentifikasi SignatureDef. |
Melempar
Pengecualian Argumen Ilegal | jika inputs null atau kosong, jika outputs atau signatureKey adalah null, atau jika terjadi kesalahan saat menjalankan inferensi. |
---|
public void setCancelled (boolean dibatalkan)
Lanjutan: Menginterupsi inferensi di tengah panggilan untuk run(Object, Object)
.
Tanda pembatalan akan disetel ke true saat fungsi ini dipanggil. Interpreter akan memeriksa flag di antara pemanggilan Op, dan jika true
, interpreter akan menghentikan eksekusi. Penerjemah akan tetap dalam status dibatalkan hingga secara eksplisit "dibatalkan" oleh setCancelled(false)
.
PERINGATAN: Ini adalah API eksperimental dan dapat berubah.
Parameter
dibatalkan | true untuk membatalkan inferensi dengan cara upaya terbaik; false untuk melanjutkan. |
---|
Melempar
Pengecualian Status Ilegal | jika penerjemah tidak diinisialisasi dengan opsi yang dapat dibatalkan, yang secara default dinonaktifkan. |
---|