Interpreter

class final publik Interpreter

Class pengemudi untuk mendorong inferensi model dengan TensorFlow Lite.

Catatan: Jika Anda tidak memerlukan akses ke salah satu fitur API "eksperimental" di bawah, pilih untuk menggunakan InterpreterApi dan InterpreterFactory, bukan menggunakan Interpreter secara langsung.

Interpreter mengenkapsulasi model TensorFlow Lite terlatih, tempat operasi dijalankan 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 output tensor string skalar:

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 model TensorFlowLite dengan Toco, seperti bentuk default input.

Jika input disediakan sebagai array (multidimensi), tensor input yang sesuai akan diubah ukurannya secara implisit sesuai dengan bentuk array tersebut. Jika input disediakan sebagai jenis Buffer, pengubahan ukuran implisit tidak akan dilakukan; pemanggil harus memastikan bahwa ukuran byte Buffer cocok dengan tensor yang bersangkutan, atau 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 level API Android di bawah 19, tetapi tidak dijamin.

Class Bertingkat

class Interpreter.Options Class opsi untuk mengontrol perilaku penafsir runtime. 

Konstruktor Publik

Penerjemah(File modelFile)
Melakukan inisialisasi Interpreter.
Interpreter(opsi File modelFile, Interpreter.Options)
Menginisialisasi Interpreter dan menentukan opsi untuk menyesuaikan perilaku penafsir.
Penafsir(byteBuffer ByteBuffer)
Melakukan inisialisasi Interpreter dengan ByteBuffer dari file model.
Penafsir(opsi ByteBuffer byteBuffer, opsi Interpreter.Options)
Menginisialisasi Interpreter dengan ByteBuffer file model dan kumpulan Interpreter.Options kustom.

Metode Publik

void
allocateTensors()
Mengupdate alokasi secara eksplisit untuk semua tensor, jika diperlukan.
void
close()
Melepaskan resource yang terkait dengan instance InterpreterApi.
int
getInputIndex(String opName)
Mendapatkan indeks input dengan nama op input tersebut.
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 yang diberikan dan nama metode tanda tangan.
Panjang
getLastNativeInferenceDurationNanoseconds()
Menampilkan waktu inferensi native.
int
getOutputIndex(String opName)
Mendapatkan indeks output dengan nama op output.
Tensor
getOutputTensor(int outputIndex)
Mendapatkan Tensor yang terkait dengan indeks output yang disediakan.
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 SignatureDefs untuk metode signatureKey.
String[]
getSignatureKeys()
Mendapatkan daftar nama metode yang diekspor SignatureDef yang tersedia dalam model.
String[]
getSignatureOutputs(String signatureKey)
Mendapatkan daftar output SignatureDefs untuk metode signatureKey.
void
resetVariableTensors()
Lanjutan: Mereset semua tensor variabel ke nilai default.
void
resizeInput(int idx, int[] dims, boolean strict)
Mengubah ukuran input ke-idx dari model native ke peredupan yang ditentukan.
void
resizeInput(int idx, int[] dims)
Mengubah ukuran input ke-idx dari model native ke peredupan yang ditentukan.
void
run(input Object, output Object)
Menjalankan inferensi model jika model hanya mengambil satu input, dan hanya menyediakan satu output.
void
runForMultipleInputsOutputs(input Object[], output Map<IntegerObject> output)
Menjalankan inferensi model jika model mengambil beberapa input, atau menampilkan beberapa output.
void
runSignature(Map<StringObject> input, Map<StringObject> output)
Sama seperti runSignature(Map, Map, String), tetapi tidak perlu meneruskan signatureKey, dengan asumsi model memiliki satu SignatureDef.
void
runSignature(Map<StringObject> input, Map<String, output Object>, String signatureKey)
Menjalankan inferensi model berdasarkan SignatureDef yang disediakan melalui signatureKey.
void
setCancelled(boolean dibatalkan)
Lanjutan: Mengganggu inferensi di tengah panggilan ke run(Object, Object).

Metode Turunan

Konstruktor Publik

public Penafsir (File modelFile)

Melakukan inisialisasi Interpreter.

Parameter
modelFile File model TF Lite terlatih.
Menampilkan
IllegalArgumentException jika modelFile tidak mengenkode model TensorFlow Lite yang valid.

publik Interpreter (File modelFile, Interpreter.Options)

Menginisialisasi 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 model TensorFlow Lite yang valid.

publik Penafsir (ByteBuffer byteBuffer)

Melakukan inisialisasi Interpreter dengan ByteBuffer dari file model.

ByteBuffer tidak boleh diubah setelah pembuatan Interpreter. ByteBuffer dapat berupa MappedByteBuffer yang memetakan file model oleh memori, atau ByteBuffer langsung dari nativeOrder() yang berisi konten byte suatu model.

Parameter
byteBuffer
Menampilkan
IllegalArgumentException jika byteBuffer bukan MappedByteBuffer atau ByteBuffer langsung dari nativeOrder.

publik Penafsir (Opsi ByteBuffer byteBuffer, Interpreter.Options)

Menginisialisasi Interpreter dengan ByteBuffer file model dan kumpulan Interpreter.Options kustom.

ByteBuffer tidak boleh diubah setelah Interpreter dibuat. ByteBuffer dapat berupa MappedByteBuffer yang dipetakan memori file model, atau ByteBuffer langsung dari nativeOrder() yang berisi konten byte model.

Parameter
byteBuffer
opsi
Menampilkan
IllegalArgumentException jika byteBuffer bukan MappedByteBuffer atau ByteBuffer langsung dari nativeOrder.

Metode Publik

public void allocateTensors ()

Mengupdate alokasi secara eksplisit untuk semua tensor, jika diperlukan.

Ini akan menyebarkan bentuk dan alokasi memori untuk tensor dependen menggunakan bentuk tensor input seperti yang diberikan.

Catatan: Panggilan ini *sepenuhnya 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 output 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 dieksekusi.

public void close ()

Melepaskan resource yang terkait dengan instance InterpreterApi.

public int getInputIndex (String opName)

Mendapatkan indeks input dengan nama op input tersebut.

Parameter
opName

public 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 yang diberikan dan nama metode tanda tangan.

PERINGATAN: Ini adalah API eksperimental dan dapat berubah sewaktu-waktu.

Parameter
inputName Nama input dalam tanda tangan.
signatureKey Kunci tanda tangan yang mengidentifikasi SignatureDef, boleh null jika model memiliki satu tanda tangan.
Menampilkan
IllegalArgumentException jika inputName atau signatureKey null atau kosong, atau nama yang diberikan tidak valid.

public Long getLastNativeInferenceDurationNanoseconds ()

Menampilkan waktu inferensi native.

public int getOutputIndex (String opName)

Mendapatkan indeks output dengan nama op output.

Parameter
opName

public Tensor getOutputTensor (int outputIndex)

Mendapatkan Tensor yang terkait dengan indeks output yang disediakan.

Catatan: Detail tensor output (misalnya, bentuk) mungkin tidak terisi penuh hingga 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 output yang bergantung pada *nilai* input, bentuk output mungkin tidak sepenuhnya ditentukan hingga inferensi berjalan.

Parameter
outputIndex

publik int getOutputTensorCount ()

Mendapatkan jumlah Tensor output.

public 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 penuh hingga 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 output yang bergantung pada *nilai* input, bentuk output mungkin tidak sepenuhnya ditentukan hingga inferensi berjalan.

PERINGATAN: Ini adalah API eksperimental dan dapat berubah sewaktu-waktu.

Parameter
outputName Nama output dalam tanda tangan.
signatureKey Kunci tanda tangan yang mengidentifikasi SignatureDef, boleh null jika model memiliki satu tanda tangan.
Menampilkan
IllegalArgumentException 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 sewaktu-waktu.

Parameter
signatureKey

public String[] getSignatureKeys ()

Mendapatkan daftar nama metode yang diekspor SignatureDef yang tersedia dalam model.

PERINGATAN: Ini adalah API eksperimental dan dapat berubah sewaktu-waktu.

public String[] getSignatureOutputs (String signatureKey)

Mendapatkan daftar output SignatureDefs untuk metode signatureKey.

PERINGATAN: Ini adalah API eksperimental dan dapat berubah sewaktu-waktu.

Parameter
signatureKey

publik void 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.

public void resizeInput (int idx, int[] dims, boolean strict)

Mengubah ukuran input ke-idx dari model native ke peredupan yang ditentukan.

Jika `strict` bernilai True, hanya dimensi yang tidak diketahui yang dapat diubah ukurannya. Dimensi yang tidak diketahui ditunjukkan sebagai `-1` dalam array yang ditampilkan oleh `Tensor.shapeSignature()`.

Parameter
idx
dims
ketat

public void resizeInput (int idx, int[] dims)

Mengubah ukuran input ke-idx dari model native ke peredupan yang ditentukan.

Parameter
idx
dims

public void run (Input Object, output Objek)

Menjalankan inferensi model jika model hanya mengambil satu input, dan hanya menyediakan satu output.

Peringatan: API akan lebih efisien jika Buffer (lebih disarankan langsung, tetapi tidak diperlukan) digunakan sebagai jenis data input/output. Sebaiknya gunakan Buffer untuk memberi feed dan mengambil data primitif untuk performa yang lebih baik. Jenis Buffer konkret berikut didukung:

  • ByteBuffer - kompatibel dengan jenis Tensor primitif apa pun yang mendasarinya.
  • FloatBuffer - kompatibel dengan Tensor float.
  • IntBuffer - kompatibel dengan Tensor int32.
  • LongBuffer - kompatibel dengan Tensor int64.
Perhatikan bahwa jenis boolean hanya didukung sebagai array, bukan Buffer, atau sebagai input skalar.

Parameter
input array atau array multidimensi, atau Buffer jenis elemen primitif termasuk int, float, long, dan byte. Buffer adalah cara yang direkomendasikan untuk meneruskan data input besar untuk jenis primitif, sedangkan jenis string memerlukan penggunaan jalur input array (multi-dimensi). Saat Buffer digunakan, kontennya tidak boleh berubah sampai inferensi model selesai, dan pemanggil harus memastikan bahwa Buffer berada di posisi baca yang tepat. Nilai null hanya diizinkan jika pemanggil menggunakan Delegate yang memungkinkan interop penanganan buffer, dan buffer tersebut telah terikat ke Tensor input.
hasil array data output multidimensi, atau Buffer jenis primitif yang mencakup int, float, long, dan byte. Saat Buffer digunakan, pemanggil harus memastikan bahwa posisi tulis yang sesuai telah ditetapkan. Nilai null diizinkan, dan berguna untuk kasus tertentu, misalnya, jika pemanggil menggunakan Delegate yang memungkinkan interop menangani buffer, dan buffer tersebut telah terikat dengan Tensor output (lihat juga Interpreter.Options#setAllowBufferHandleOutput(boolean)), atau jika grafik memiliki output berbentuk dinamis dan pemanggil harus mengkueri bentuk Tensor output setelah inferensi dipanggil, pengambilan data secara langsung dari Tensor.asReadOnlyBuffer() output).

public void runForMultipleInputsOutputs (inputObject[], Map<IntegerObject> output)

Menjalankan inferensi model jika model mengambil beberapa input, atau menampilkan beberapa output.

Peringatan: API akan lebih efisien jika Buffer (lebih disarankan langsung, tetapi tidak diperlukan) digunakan sebagai jenis data input/output. Sebaiknya gunakan Buffer untuk memberi feed dan mengambil data primitif untuk performa yang lebih baik. Jenis Buffer konkret berikut didukung:

  • ByteBuffer - kompatibel dengan jenis Tensor primitif apa pun yang mendasarinya.
  • FloatBuffer - kompatibel dengan Tensor float.
  • IntBuffer - kompatibel dengan Tensor int32.
  • LongBuffer - kompatibel dengan Tensor int64.
Perhatikan bahwa jenis boolean hanya didukung sebagai array, bukan Buffer, atau sebagai input skalar.

Catatan: Nilai null untuk elemen individual inputs dan outputs hanya diizinkan jika pemanggil menggunakan Delegate yang memungkinkan interop menangani buffer, dan buffer tersebut telah terikat ke input atau output Tensor yang sesuai.

Parameter
input array data input. Input harus dalam urutan yang sama dengan input model. Setiap input dapat berupa array atau array multidimensi, atau Buffer dari jenis dasar seperti int, float, long, dan byte. Buffer adalah cara yang direkomendasikan untuk meneruskan data input besar, sedangkan jenis string memerlukan penggunaan jalur input array (multidimensi). Saat Buffer digunakan, kontennya tidak boleh berubah sampai inferensi model selesai, dan pemanggil harus memastikan bahwa Buffer berada di posisi baca yang tepat.
output peta yang memetakan output indeks ke array multidimensi dari data output atau Buffer dari jenis primitif seperti int, float, long, dan byte. Modul ini hanya perlu menyimpan entri agar output yang akan digunakan. Saat Buffer digunakan, pemanggil harus memastikan bahwa posisi tulis yang sesuai telah ditetapkan. Peta mungkin kosong untuk kasus di mana tuas buffer digunakan untuk data tensor output, atau kasus ketika output berbentuk dinamis dan pemanggil harus mengkueri bentuk Tensor output setelah inferensi dipanggil, mengambil data secara langsung dari tensor output (melalui Tensor.asReadOnlyBuffer()).

public void runSignature (Map<StringObject> input, Map<StringObject> output)

Sama seperti runSignature(Map, Map, String), tetapi tidak perlu meneruskan signatureKey, dengan asumsi model memiliki satu SignatureDef. Jika model memiliki lebih dari satu SignatureDef, model akan menampilkan pengecualian.

PERINGATAN: Ini adalah API eksperimental dan dapat berubah sewaktu-waktu.

Parameter
input
output

public void runSignature (Map<StringObject> input, Map<StringObject> output, String signatureKey)

Menjalankan inferensi model berdasarkan SignatureDef yang disediakan melalui signatureKey.

Lihat run(Object, Object) untuk detail selengkapnya tentang jenis data input dan output yang diizinkan.

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 untuk menghasilkan data. Kolom ini mungkin kosong jika pemanggil ingin membuat kueri data Tensor secara langsung setelah inferensi (misalnya, jika bentuk output bersifat dinamis, atau tuas buffer output digunakan).
signatureKey Kunci tanda tangan yang mengidentifikasi SignatureDef.
Menampilkan
IllegalArgumentException jika inputs null atau kosong, jika outputs atau signatureKey adalah null, atau jika terjadi error saat menjalankan inferensi.

publik void setCancelled (boolean cancelled)

Lanjutan: Mengganggu inferensi di tengah panggilan ke run(Object, Object).

Tanda pembatalan akan disetel ke benar (true) ketika fungsi ini dipanggil. Penafsir akan memeriksa flag di antara pemanggilan Op, dan jika berupa true, penafsir akan menghentikan eksekusi. Penafsir akan tetap dalam status dibatalkan hingga "dibatalkan" secara eksplisit oleh setCancelled(false).

PERINGATAN: Ini adalah API eksperimental dan dapat berubah sewaktu-waktu.

Parameter
dibatalkan true untuk membatalkan inferensi dengan upaya terbaik; false untuk melanjutkan.
Menampilkan
IllegalStateException jika penafsir tidak diinisialisasi dengan opsi yang dapat dibatalkan, yang secara default nonaktif.