InterpreterApi

interfejs publiczny InterpreterApi
Znane podklasy pośrednie

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

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

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

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 przyjmuje 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 rozróżnienie między kształtem [] a kształtem[1]. Skalarny tensor ciągu znaków dane wyjściowe:

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 z modelem Toco, a także domyślne kształty danych wejściowych.

Jeśli dane wejściowe są podane jako (wielowymiarowe) tablice, odpowiednie tensory wejściowe będą zostanie niejawnie przeskalowana odpowiednio do kształtu tej tablicy. Jeśli dane wejściowe są podane w typach Buffer, nie wprowadza się niejawna zmiana rozmiaru. element wywołujący musi upewnić się, że rozmiar w bajtach Buffer jest zgodny z rozmiarem odpowiedniego tensora lub że rozmiar zmień rozmiar tensora za pomocą funkcji resizeInput(int, int[]). Informacje o kształcie i typie Tensor można uzyskane w ramach klasy Tensor, dostępne poprzez getInputTensor(int) i getOutputTensor(int).

OSTRZEŻENIE: instancje InterpreterApi nie są bezpieczne w przypadku wątków.

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

Biblioteka TFLite jest oparta na interfejsie NDK API 19. Może działać w przypadku interfejsów API Androida poniżej 19, ale nie jest to gwarantowane.

Zagnieżdżone klasy

klasa InterpreterApi.Options Klasa opcji do kontrolowania działania interpretera czasu działania.

Metody publiczne

abstrakcyjne nieważne
allocateTensors()
W razie potrzeby jawnie aktualizuje przydziały wszystkich tensorów.
abstrakcyjne nieważne
close()
Zwolnij zasoby powiązane z instancją InterpreterApi.
statyczny InterpreterApi
create(Plik modelFile, opcje InterpreterApi.Options)
Konstruuje instancję InterpreterApi przy użyciu podanego modelu i opcji.
statyczny InterpreterApi
create(opcje ByteBuffer byteBuffer, InterpreterApi.Options)
Konstruuje instancję InterpreterApi przy użyciu podanego modelu i opcji.
abstrakcyjne int,
getInputIndex(nazwa opcji ciąg znaków)
Pobiera indeks danych wejściowych o nazwie operacji dla danych wejściowych.
abstrakcyjne Tensor
getInputTensor(int inputIndex)
Pobiera Tensor powiązany z podanym indeksem danych wejściowych.
abstrakcyjne int,
getInputTensorCount()
Pobiera liczbę tensorów wejściowych.
abstrakcyjne Długi
getLastNativeInferenceDurationNanoseconds()
Zwraca czas wnioskowania natywnego.
abstrakcyjne int,
getOutputIndex(opName ciągu)
Pobiera indeks danych wyjściowych o nazwie operacji w danych wyjściowych.
abstrakcyjne Tensor
getOutputTensor(int outputIndex)
Pobiera Tensor powiązany z podanym indeksem wyjściowym.
abstrakcyjne int,
getOutputTensorCount()
Pobiera liczbę wyjściowych tensorów.
abstrakcyjne nieważne
resizeInput(int idx, int[] dims, boolean strict)
Zmienia rozmiar danych wejściowych modelu natywnego (IDX).
abstrakcyjne nieważne
resizeInput(int idx, int[] przyciemnione)
Zmienia rozmiar danych wejściowych modelu natywnego (IDX).
abstrakcyjne nieważne
run(Dane wejściowe Object, dane wyjściowe Object)
Uruchamia wnioskowanie przez model, jeśli model przyjmuje tylko 1 dane wejściowe i udostępnia tylko 1 dane wyjściowe.
abstrakcyjne nieważne
runForMultipleInputsOutputs(dane wejściowe Object[], dane wyjściowe Map <Liczba całkowitaObiekt>)
Uruchamia wnioskowanie przez model, jeśli model przyjmuje wiele danych wejściowych, lub zwraca wiele danych wyjściowych.

Metody dziedziczone

Metody publiczne

publiczne abstrakcyjne nieważne . allocateTensors ()

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

Spowoduje to rozpowszechnienie kształtów i alokacji pamięci dla tensorów zależnych z użyciem danych wejściowych podane kształty tensora.

Uwaga: to połączenie jest *wyłącznie opcjonalne*. Alokacja Tensor będzie wykonywana automatycznie podczas po zmianie rozmiaru tensorów wejściowych. To połączenie jest najbardziej przydatne przy określaniu kształtów dowolnych tensorów wyjściowych przed wykonaniem grafu, 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: dane wyjściowe niektórych wykresów mają dynamicznie kształtowane dane wyjściowe. W takim przypadku kształt wyjściowy może nie w pełni propagować do momentu wykonania wnioskowania.

Rzuty
IllegalStateException jeśli nie można przydzielić tensorów grafu.

publiczne abstrakcyjne nieważne . zamknij ()

Zwolnij zasoby powiązane z instancją InterpreterApi.

publiczne statyczny InterpreterApi utwórz (Plik modelu, opcje InterpreterApi.Options)

Konstruuje instancję InterpreterApi przy użyciu podanego modelu i opcji. Model zostanie wczytana z pliku.

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

publiczne statyczny InterpreterApi utwórz (ByteBuffer byteBuffer, InterpreterApi.Options)

Konstruuje instancję InterpreterApi przy użyciu podanego modelu i opcji. Model zostanie odczytany z urządzenia ByteBuffer.

Parametry
byteBuffer Wstępnie wytrenowany model TF Lite w postaci binarnej zserializowanej. ByteBuffer powinien nie może zostać zmodyfikowana po utworzeniu instancji InterpreterApi. Obiekt ByteBuffer może być obiektem typu MappedByteBuffer, który mapuje w pamięci plik modelu, bezpośrednie polecenie ByteBuffer funkcji natywnychOrder(), które zawierają treść bajtów modelu.
Opcje Zestaw opcji umożliwiających dostosowanie działania tłumacza.
Rzuty
IllegalArgumentException jeśli byteBuffer nie jest wartością MappedByteBuffer ani a bezpośrednie ByteBuffer obiektu NativeOrder.

publiczne abstrakcyjne int, . getInputIndex (Ciąg opName)

Pobiera indeks danych wejściowych o nazwie operacji dla danych wejściowych.

Parametry
opName
Rzuty
IllegalArgumentException jeśli opName nie pasuje do żadnych danych wejściowych w używanym modelu aby zainicjować tłumacza.

publiczne abstrakcyjne Tensor getInputTensor (int inputIndex)

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

Parametry
inputIndex
Rzuty
IllegalArgumentException jeśli inputIndex jest ujemny lub nie jest mniejszy niż liczby wejściowej modelu.

publiczne abstrakcyjne int, . getInputTensorCount ()

Pobiera liczbę tensorów wejściowych.

publiczne abstrakcyjne Długi getLastNativeInferenceDurationNanoseconds ()

Zwraca czas wnioskowania natywnego.

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

publiczne abstrakcyjne int, . getOutputIndex (Ciąg opName)

Pobiera indeks danych wyjściowych o nazwie operacji w danych wyjściowych.

Parametry
opName
Rzuty
IllegalArgumentException jeśli opName nie pasuje do żadnych danych wyjściowych w używanym modelu aby zainicjować tłumacza.

publiczne abstrakcyjne Tensor getOutputTensor (int outputIndex)

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

Uwaga: szczegóły tensora wyjściowego (np.kształt) mogą nie zostać w pełni wypełnione do czasu wnioskowania. . Jeśli potrzebujesz aktualizacji szczegółów *przed* uruchomieniem wnioskowania (np. po zmianie rozmiaru tensor wejściowy, który może unieważnić kształty tensora wyjściowego), użyj funkcji allocateTensors(), aby bezpośrednio aktywować przydzielanie i propagację kształtu. Pamiętaj, że w przypadku wykresów z kształtami wyjściowymi zależne od *wartości* wejściowych, kształt wyjściowy może zostać w pełni określony dopiero aktywnego wnioskowania.

Parametry
outputIndex
Rzuty
IllegalArgumentException jeśli outputIndex jest ujemny lub nie jest mniejszy niż liczby wyników modelu.

publiczne abstrakcyjne int, . getOutputTensorCount ()

Pobiera liczbę wyjściowych tensorów.

publiczne abstrakcyjne nieważne . resizeInput (int idx, int[] dims, rygorystyczna wartość logiczna)

Zmienia rozmiar danych wejściowych modelu natywnego (IDX).

Gdy tryb „rygorystyczny” ma wartość Prawda, można zmieniać rozmiar tylko nieznanych wymiarów. Nieznane wymiary to jest wskazywany jako „–1” w tablicy zwracanej przez funkcję „Tensor.shapeSignature()”.

Parametry
Identyfikatorx
Przyciemnia
dokładny
Rzuty
IllegalArgumentException jeśli idx jest ujemny lub nie jest mniejszy niż liczba danych wejściowych modelu; lub jeśli podczas zmiany rozmiaru danych wejściowych idx-th wystąpi błąd. Dodatkowo błąd ma miejsce podczas próby zmiany rozmiaru tensora o stałych wymiarach, gdy tryb „strict” ma wartość True.

publiczne abstrakcyjne nieważne . resizeInput (int idx, int[] przyciemnione)

Zmienia rozmiar danych wejściowych modelu natywnego (IDX).

Parametry
Identyfikatorx
Przyciemnia
Rzuty
IllegalArgumentException jeśli idx jest ujemny lub nie jest mniejszy niż liczba danych wejściowych modelu; lub jeśli podczas zmiany rozmiaru danych wejściowych idx-th wystąpi błąd.

publiczne abstrakcyjne nieważne . bieg (Dane wejściowe obiektu, dane wyjściowe Object)

Uruchamia wnioskowanie przez model, jeśli model przyjmuje tylko 1 dane wejściowe i udostępnia tylko 1 dane wyjściowe.

Ostrzeżenie: interfejs API jest wydajniejszy, jeśli Buffer (najlepiej bezpośredni, ale nie wymagany) jest używany jako typ danych wejściowych/wyjściowych. Zastanów się nad użyciem atrybutu Buffer do plików danych i pobierania podstawowych danych w celu zwiększenia wydajności. Oto konkretne typy Buffer obsługiwane:

  • ByteBuffer – zgodność z dowolnym podstawowym typem Tensor.
  • FloatBuffer – kompatybilny z tensorami pływackimi.
  • IntBuffer – zgodny z procesorami Tensor int32.
  • LongBuffer – zgodny z procesorami Tensor int64.
. Pamiętaj, że wartości logiczne są obsługiwane tylko jako tablice, a nie jako wartości Buffer lub jako dane wejściowe skalarne.

Parametry
dane wejściowe tablica lub tablica wielowymiarowa albo Buffer typów podstawowych int, float, long i byte. Buffer to preferowany sposób przesyłania dużych danych wejściowych dla typów podstawowych, natomiast typy ciągów znaków wymagają użycia funkcji (wielowymiarowe) tablicowa ścieżka wejściowa. Kiedy używana jest właściwość Buffer, jej zawartość powinna pozostać niezmieniona do sugerowanie modelu i element wywołujący musi upewnić się, że Buffer jest w w odpowiednim miejscu do czytania. Wartość null jest dozwolona tylko wtedy, gdy osoba wywołująca używa funkcji Delegate, który pozwala na interoperacyjność uchwytu bufora i taki bufor został powiązany z wpisz Tensor.
output wielowymiarowa tablica danych wyjściowych lub Buffer typów podstawowych int, float, long i byte. Gdy używane jest Buffer, osoba wywołująca musi upewnić się, że: że jest ustawiona odpowiednia pozycja zapisu. Wartość null jest dozwolona i jest przydatna dla w określonych przypadkach, np.gdy rozmówca używa funkcji Delegate, która umożliwia buforowanie. współpracy i taki bufor został powiązany z danymi wyjściowymi Tensor (zobacz też Interpreter.Options#setAllowBufferHandleOutput(boolean)). lub jeśli dane wyjściowe grafu mają dynamicznie kształtowane dane wyjściowe, a element wywołujący po wywołaniu wnioskowania musi przesłać zapytanie dotyczące kształtu wyjściowego Tensor, pobierając je bezpośrednio z tych danych. Tensor (przez Tensor.asReadOnlyBuffer()).
Rzuty
IllegalArgumentException jeśli input ma wartość null lub jest pusty albo jeśli wystąpi błąd, gdy aktywnego wnioskowania.
IllegalArgumentException (EKSPERYMENTALNE, może ulec zmianie), jeśli wnioskowanie jest przerwany przez: setCancelled(true).

publiczne abstrakcyjne nieważne . runForMultipleInputsOutputs (dane wejściowe obiektu[], dane wyjściowe mapy <liczby całkowitejobiekt>)

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

Ostrzeżenie: interfejs API jest bardziej wydajny, jeśli interfejs Buffer (najlepiej bezpośredni, ale nie jest wymagany) są używane jako typy danych wejściowych/wyjściowych. Zastanów się nad użyciem atrybutu Buffer do plików danych i pobierania podstawowych danych w celu zwiększenia wydajności. Oto konkretne typy Buffer obsługiwane:

  • ByteBuffer – zgodność z dowolnym podstawowym typem Tensor.
  • FloatBuffer – kompatybilny z tensorami pływackimi.
  • IntBuffer – zgodny z procesorami Tensor int32.
  • LongBuffer – zgodny z procesorami Tensor int64.
. Pamiętaj, że wartości logiczne są obsługiwane tylko jako tablice, a nie jako wartości Buffer lub jako dane wejściowe skalarne.

Uwaga: wartości parametru null w elementach inputs i outputs to dozwolone tylko wtedy, gdy wywołujący obiekt używa Delegate, który umożliwia współdziałanie uchwytu bufora; taki bufor został powiązany z odpowiednimi danymi wejściowymi lub wyjściowymi Tensor.

Parametry
dane wejściowe tablicę danych wejściowych. Dane wejściowe powinny być w tej samej kolejności co dane wejściowe funkcji model atrybucji. Każde dane wejściowe mogą być tablicą lub wielowymiarową tablicą albo obiektem Buffer podstawowych typów, takich jak int, float, long i byte. Buffer to preferowany sposób do przekazywania dużych danych wejściowych, natomiast typy ciągów znaków wymagają stosowania (wielowymiarowej) tablicy ścieżkę wejściową. Gdy jest używana funkcja Buffer, jej zawartość powinna pozostać niezmieniona do czasu użycia modelu wnioskowania i element wywołujący musi upewnić się, że Buffer jest w odpowiednim miejscu pozycji odczytu.
dane wyjściowe dane wyjściowe mapowania map indeksują wielowymiarowe tablice danych wyjściowych lub elementów Buffer typów podstawowych, w tym int, float, long i byte. Wystarczy zachować wskazuje dane wyjściowe, które mają być używane. Gdy używane jest Buffer, osoba wywołująca musi upewnić się, że: że jest ustawiona odpowiednia pozycja zapisu. Mapa może być pusta w przypadkach, gdy: uchwyty bufora są używane w przypadku danych tensora wyjściowego lub w sytuacjach, gdy dane wyjściowe są dynamicznie generowane ma kształt i element wywołujący musi przesłać zapytanie dotyczące wyjściowego kształtu Tensor po zastosowaniu wnioskowania Dane są pobierane bezpośrednio z tensora wyjściowego (przez Tensor.asReadOnlyBuffer()).
Rzuty
IllegalArgumentException jeśli inputs ma wartość null lub jest pusty, jeśli outputs to wartość null lub jeśli podczas uruchamiania wnioskowania wystąpi błąd.