InterpreterApi

interfejs publiczny InterpreterApi
Znane podklasy pośrednie

Interfejs interpretera modelu TensorFlow Lite z wyłączeniem metod eksperymentalnych.

Instancja InterpreterApi zawiera wytrenowany model TensorFlow Lite, w którym operacje są wykonywane w celu wnioskowania na podstawie modelu.

Jeśli na przykład model przyjmuje tylko 1 dane wejściowe i zwraca tylko 1 wyjście:

try (InterpreterApi interpreter =
     new InterpreterApi.create(file_of_a_tensorflowlite_model)) {
   interpreter.run(input, output);
 }
 

Jeśli model przyjmuje wiele danych wejściowych lub wyjściowych:

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 (InterpreterApi interpreter =
     new InterpreterApi.create(file_of_a_tensorflowlite_model)) {
   interpreter.runForMultipleInputsOutputs(inputs, map_of_indices_to_outputs);
 }
 

Jeśli model pobiera lub generuje tensory ciągów:

String[] input = {"foo", "bar"};  // Input tensor shape is [2].
 String[][] output = new String[3][2];  // Output tensor shape is [3, 2].
 try (InterpreterApi interpreter =
     new InterpreterApi.create(file_of_a_tensorflowlite_model)) {
   interpreter.runForMultipleInputsOutputs(input, output);
 }
 

Istnieje różnica między kształtem [] a kształtem[1]. Dla danych wyjściowych tensora ciągu skalarnego:

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);
 

Kolejność danych wejściowych i wyjściowych jest określana podczas konwertowania modelu TensorFlow na TensorFlowLite za pomocą Toco, podobnie jak domyślne kształty danych wejściowych.

Gdy dane wejściowe są podawane w postaci (wielowymiarowych) tablic, rozmiar odpowiednich tensorów wejściowych będzie domyślnie zmieniany zgodnie z kształtem tej tablicy. Gdy dane wejściowe są podane jako typy Buffer, nie jest przeprowadzana niejawna zmiana rozmiaru. Element wywołujący musi upewnić się, że rozmiar w bajtach Buffer odpowiada rozmiarowi odpowiedniego tensora, lub że najpierw zmienia tensor za pomocą resizeInput(int, int[]). Informacje o Kształcie i typie Tensor można uzyskać za pomocą klasy Tensor dostępnej w getInputTensor(int) i getOutputTensor(int).

OSTRZEŻENIE: instancje InterpreterApi nie są bezpieczne w wątkach.

OSTRZEŻENIE: instancja InterpreterApi posiada zasoby, które muszą zostać jawnie zwolnione przez wywołanie close()

Biblioteka TFLite została stworzona na podstawie interfejsu NDK API 19. Może działać w przypadku poziomów API Androida poniżej 19, ale nie jest to gwarantowane.

Zagnieżdżone klasy

klasa InterpreterApi.Options Klasa opcji do kontrolowania działania interpretatora w czasie działania. 

Metody publiczne

abstrakcja void
allocateTensors()
W razie potrzeby jawnie aktualizuje przydziały wszystkich tensorów.
abstrakcja void
close()
Zwolnij zasoby powiązane z instancją InterpreterApi.
statyczny InterpreterApi
create(Plik modelFile, opcje InterpreterApi.Options)
Konstruuje instancję InterpreterApi przy użyciu określonego modelu i opcji.
statyczny InterpreterApi
create(opcje ByteBuffer byteBuffer i InterpreterApi.Options)
Konstruuje instancję InterpreterApi przy użyciu określonego modelu i opcji.
abstrakcja int
getInputIndex(String opName)
Pobiera indeks danych wejściowych, podając nazwę operacji.
abstrakcyjny Tensor
getInputTensor(int inputIndex)
Pobiera Tensor powiązany z podanym indeksem danych wejściowych.
abstrakcja int
getInputTensorCount(),
Pobiera liczbę tensorów wejściowych.
abstrakcyjny Długi
getLastNativeInferenceDurationNanoseconds()
Zwraca natywny czas wnioskowania.
abstrakcja int
getOutputIndex(ciąg znaków opName)
Pobiera indeks danych wyjściowych na podstawie nazwy operacji.
abstrakcyjny Tensor
getOutputTensor(intoutputIndex)
Pobiera Tensor powiązany z podanym indeksem wyjściowym.
abstrakcja int
getOutputTensorCount()
Pobiera liczbę wyjściowych Tensor.
abstrakcja void
resizeInput(int idx, int[] dims, boolean strict)
Zmienia rozmiar danych wejściowych idx modelu natywnego na dane przyciemnienia.
abstrakcja void
resizeInput(int idx, int[] przyciemniony)
Zmienia rozmiar danych wejściowych idx modelu natywnego na dane przyciemnienia.
abstrakcja void
run(dane wejściowe obiektu, dane wyjściowe obiektu)
Uruchamia wnioskowanie na podstawie modelu, jeśli model przyjmuje tylko 1 dane wejściowe i udostępnia tylko 1 wynik.
abstrakcja void
runForMultipleInputsOutputs(dane wejściowe Object[], mapa<liczba całkowita, dane wyjściowe obiektu>)
Uruchamia wnioskowanie na podstawie modelu, jeśli model przyjmuje wiele danych wejściowych lub zwraca wiele danych wyjściowych.

Metody dziedziczone

Metody publiczne

public abstract void allocateTensors ()

W razie potrzeby jawnie aktualizuje przydziały wszystkich tensorów.

Spowoduje to propagację kształtów i przydziałów pamięci dla tensorów zależnych z użyciem podanych kształtów tensorów wejściowych.

Uwaga: to połączenie jest *opcjonalne*. Jeśli zmienisz rozmiar co najmniej 1 tensorów wejściowych, alokacja Tensor będzie przeprowadzana automatycznie podczas wykonywania. To wywołanie jest najbardziej przydatne do określania kształtów wszelkich tensorów wyjściowych przed wykonaniem wykresu, np.

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

Uwaga: niektóre wykresy mają dynamicznie kształtowane dane wyjściowe. W takim przypadku kształt wyjściowy może nie zostać w pełni rozpowszechniony, dopóki nie zostanie wykonane wnioskowanie.

Rzuty
IllegalStateException jeśli nie udało się odpowiednio przydzielić tensorów wykresu.

public abstract void close ()

Zwolnij zasoby powiązane z instancją InterpreterApi.

public static InterpreterApi create (Plik modelFile, opcje InterpreterApi.Options)

Konstruuje instancję InterpreterApi przy użyciu określonego modelu i opcji. Model zostanie wczytany z pliku.

Parametry
modelFile Plik zawierający wytrenowany model TF Lite.
Opcje Zestaw opcji umożliwiających dostosowanie działania tłumaczenia rozmowy.
Rzuty
IllegalArgumentException jeśli modelFile nie koduje prawidłowego modelu TensorFlow Lite.

public static InterpreterApi create (ByteBuffer byteBuffer, InterpreterApi.Options)

Konstruuje instancję InterpreterApi przy użyciu określonego modelu i opcji. Model będzie odczytywany z ByteBuffer.

Parametry
byteBuffer Wytrenowany model TF Lite w postaci binarnej zserializowanej. Po utworzeniu instancji InterpreterApi nie należy modyfikować bufora bajtów. Element ByteBuffer może być MappedByteBuffermapą pliku modelu w pamięci lub bezpośrednim obiektem ByteBuffer {8/}Order() zawierającym zawartość bajtów modelu.
Opcje Zestaw opcji umożliwiających dostosowanie działania tłumaczenia rozmowy.
Rzuty
IllegalArgumentException , jeśli byteBuffer nie jest MappedByteBuffer ani bezpośrednim ByteBuffer elementem natywnym.

public abstract int getInputIndex (String opName)

Pobiera indeks danych wejściowych, podając nazwę operacji.

Parametry
opName
Rzuty
IllegalArgumentException jeśli opName nie pasuje do żadnych danych wejściowych w modelu używanym do zainicjowania interpretera.

public abstract Tensor getInputTensor (int inputIndex)

Pobiera Tensor powiązany z podanym indeksem danych wejściowych.

Parametry
inputIndex
Rzuty
IllegalArgumentException jeśli inputIndex ma wartość ujemną lub nie jest mniejsza od liczby danych wejściowych modelu.

public abstract int getInputTensorCount ()

Pobiera liczbę tensorów wejściowych.

public abstract Long getLastNativeInferenceDurationNanoseconds ()

Zwraca natywny czas wnioskowania.

Rzuty
IllegalArgumentException jeśli model nie został zainicjowany przez interpreter.

public abstract int getOutputIndex (String opName)

Pobiera indeks danych wyjściowych na podstawie nazwy operacji.

Parametry
opName
Rzuty
IllegalArgumentException jeśli opName nie pasuje do żadnych danych wyjściowych w modelu używanym do zainicjowania interpretera.

public abstract Tensor getOutputTensor (intoutputIndex)

Pobiera Tensor powiązany z podanym indeksem wyjściowym.

Uwaga: szczegóły tensora wyjściowego (np. kształt) mogą nie być w pełni wypełnione, dopóki nie zostanie wykonane wnioskowanie. Jeśli potrzebujesz aktualizacji szczegółów *przed* wykonaniem wnioskowania (np. po zmianie rozmiaru tensora wejściowego, co może unieważnić kształty tensorów wyjściowych), użyj funkcji allocateTensors(), aby bezpośrednio aktywować przydział i propagację kształtów. Pamiętaj, że w przypadku wykresów z kształtami wyjściowymi, które są zależne od *wartości* wejściowych, kształt wyjściowy może nie być w pełni określony, dopóki nie zostanie wykonane wnioskowanie.

Parametry
outputIndex
Rzuty
IllegalArgumentException jeśli outputIndex ma wartość ujemną lub nie jest mniejsza od liczby danych wyjściowych modelu.

public abstract int getOutputTensorCount ()

Pobiera liczbę wyjściowych Tensor.

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

Zmienia rozmiar danych wejściowych idx modelu natywnego na dane przyciemnienia.

Gdy „Ścisły” ma wartość Prawda, można zmieniać rozmiar tylko nieznanych wymiarów. Nieznane wymiary są oznaczone jako „-1” w tablicy zwracanej przez „Tensor.shapeSignature()”.

Parametry
idx
dims
dokładny
Rzuty
IllegalArgumentException jeśli idx ma wartość ujemną lub nie jest mniejsza niż liczba danych wejściowych modelu lub jeśli podczas zmiany rozmiaru wartości wejściowej idx wystąpi błąd. Poza tym błąd występuje podczas próby zmiany rozmiaru tensora o stałych wymiarach, gdy ustawienie „ścisłe” ma wartość Prawda.

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

Zmienia rozmiar danych wejściowych idx modelu natywnego na dane przyciemnienia.

Parametry
idx
dims
Rzuty
IllegalArgumentException jeśli idx ma wartość ujemną lub nie jest mniejsza niż liczba danych wejściowych modelu lub jeśli podczas zmiany rozmiaru wartości wejściowej idx wystąpi błąd.

public abstract void run (obiekt wejściowe, obiekt dane wyjściowe)

Uruchamia wnioskowanie na podstawie modelu, jeśli model przyjmuje tylko 1 dane wejściowe i udostępnia tylko 1 wynik.

Ostrzeżenie: interfejs API jest wydajniejszy, jeśli jako typ danych wejściowych/wyjściowych używany jest Buffer (najlepiej bezpośredni, ale nie jest wymagany). Rozważ użycie funkcji Buffer do przesyłania i pobierania podstawowych danych, aby zwiększyć wydajność. Obsługiwane są te konkretne typy Buffer:

  • ByteBuffer – zgodny ze wszystkimi podstawowymi typami Tensor.
  • FloatBuffer – zgodny ze zmiennymi Tensor.
  • IntBuffer – zgodny z Tensors int32.
  • LongBuffer – zgodny z Tensors Int64.
Pamiętaj, że typy wartości logicznych są obsługiwane tylko jako tablice, nie Buffer lub jako skalarne dane wejściowe.

Parametry
dane wejściowe tablicy lub wielowymiarowej tablicy albo Buffer typów podstawowych, takich jak int, float, long i byte. Buffer jest preferowanym sposobem przekazywania dużych danych wejściowych w przypadku typów podstawowych, natomiast typy ciągów wymagają korzystania z (wielowymiarowej) ścieżki wejściowej tablicy. Gdy używany jest element Buffer, jego treść powinna pozostać niezmieniona do czasu wnioskowania modelu. Element wywołujący musi upewnić się, że obiekt Buffer znajduje się w odpowiednim miejscu do odczytu. Wartość null jest dozwolona tylko wtedy, gdy element wywołujący używa interfejsu Delegate, który umożliwia interoperacyjność z uchwytem bufora, a taki bufor jest powiązany z danymi wejściowymi Tensor.
wynik wielowymiarowa tablica danych wyjściowych lub Buffer typów podstawowych, takich jak int, float, long i byte. W przypadku użycia metody Buffer element wywołujący musi upewnić się, że ma ustawioną odpowiednią pozycję zapisu. Wartość null jest dozwolona i przydatna w określonych przypadkach, np. gdy element wywołujący używa interfejsu Delegate, który umożliwia interoperacyjność uchwytu bufora, a taki bufor jest powiązany z danymi wyjściowymi Tensor (patrz również Interpreter.Options#setAllowBufferHandleOutput(boolean)) lub gdy wykres ma dynamicznie kształtowane dane wyjściowe, a element wywołujący musi wysyłać zapytanie o dane wyjściowe za pomocą dziesięciokrotnego pobierania po tym, jak zostało bezpośrednio wnioskowane dane wyjściowe Tensor.Tensor.asReadOnlyBuffer()
Rzuty
IllegalArgumentException jeśli input ma wartość null lub jest pusta albo jeśli podczas uruchamiania wnioskowania wystąpi błąd.
IllegalArgumentException (EKSPERYMENTALNE, może ulec zmianie), jeśli wnioskowanie zostanie przerwane przez setCancelled(true).

public abstract void runForMultipleInputsOutputs (Object[] wejściowe, Map<liczba całkowitaobiekt>)

Uruchamia wnioskowanie na podstawie modelu, jeśli model przyjmuje wiele danych wejściowych lub zwraca wiele danych wyjściowych.

Ostrzeżenie: interfejs API jest wydajniejszy, jeśli jako typy danych wejściowych i wyjściowych są używane parametry Buffer (najlepiej bezpośrednie, ale nie są wymagane). Rozważ użycie funkcji Buffer do przesyłania i pobierania podstawowych danych, aby zwiększyć wydajność. Obsługiwane są te konkretne typy Buffer:

  • ByteBuffer – zgodny ze wszystkimi podstawowymi typami Tensor.
  • FloatBuffer – zgodny ze zmiennymi Tensor.
  • IntBuffer – zgodny z Tensors int32.
  • LongBuffer – zgodny z Tensors Int64.
Pamiętaj, że typy wartości logicznych są obsługiwane tylko jako tablice, nie Buffer lub jako skalarne dane wejściowe.

Uwaga: wartości null w przypadku pojedynczych elementów elementów inputs i outputs są dozwolone tylko wtedy, gdy element wywołujący używa interfejsu Delegate, który umożliwia interoperacyjność z uchwytem bufora, a taki bufor jest powiązany z odpowiednimi wejściami lub wyjściami Tensor.

Parametry
dane wejściowe tablicę danych wejściowych. Dane wejściowe powinny mieć taką samą kolejność jak dane wejściowe modelu. Każde dane wejściowe mogą być tablicą lub tablicą wielowymiarową albo obiektem Buffer typów podstawowych, w tym typu int, float, Long i byte. Buffer jest preferowanym sposobem przekazywania dużych danych wejściowych, natomiast typy ciągów znaków wymagają użycia (wielowymiarowej) ścieżki wejściowej tablicy. Gdy używany jest element Buffer, jego treść powinna pozostać niezmieniona do czasu wnioskowania modelu. Element wywołujący musi upewnić się, że obiekt Buffer jest w odpowiednim miejscu odczytu.
dane wyjściowe mapuje indeksy wyjściowe odwzorowujące wielowymiarowe tablice danych wyjściowych lub obiekty Buffer typów podstawowych, w tym typu int, float, Long i byte. Wystarczy, że będzie przechowywać wpisy, aby były używane dane wyjściowe. W przypadku użycia metody Buffer element wywołujący musi upewnić się, że ma ustawioną odpowiednią pozycję zapisu. Mapa może być pusta w przypadkach, gdy do obsługi danych tensora wyjściowego są używane uchwyty bufora lub gdy dane wyjściowe mają kształt dynamiczny, a element wywołujący musi wysyłać zapytanie do kształtu Tensor wyjściowego po wywołaniu wnioskowania, pobierając dane bezpośrednio z tensora wyjściowego (za pomocą Tensor.asReadOnlyBuffer()).
Rzuty
IllegalArgumentException jeśli inputs ma wartość null lub jest pusta, outputs ma wartość null lub występuje błąd podczas wnioskowania.