InterpreterApi

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.
Interfejs publiczny InterpreterApi
Znane podklasy pośrednie

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

Wystąpienie InterpreterApi hermetyzuje wstępnie przeszkolony model TensorFlow Lite, w którym operacje są wykonywane w celu wnioskowania o modelu.

Na przykład, jeśli model przyjmuje tylko jedno wejście i zwraca tylko jedno wyjście:

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

Jeśli model ma wiele wejść lub wyjść:

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 wytwarza tensory strun:

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

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

Gdy dane wejściowe są dostarczane jako (wielowymiarowe) tablice, odpowiedni tensor wejściowy zostanie domyślnie zmieniony zgodnie z kształtem tej tablicy. Gdy dane wejściowe są dostarczane jako typy Buffer , nie jest wykonywana niejawna zmiana rozmiaru; obiekt wywołujący musi upewnić się, że rozmiar bajtu Buffer jest zgodny z odpowiednim tensorem lub że najpierw zmienia rozmiar tensora za pomocą resizeInput(int, int[]) . Informacje o kształcie i typie tensora można uzyskać za pośrednictwem klasy Tensor , dostępnej za pośrednictwem getInputTensor(int) i getOutputTensor(int) .

OSTRZEŻENIE: wystąpienia InterpreterApi nie są bezpieczne wątkowo.

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

Biblioteka TFLite jest zbudowana w oparciu o NDK API 19. Może działać dla poziomów API Androida poniżej 19, ale nie jest gwarantowana.

Klasy zagnieżdżone

klasa InterpreterApi.Options Klasa opcji do kontrolowania zachowania interpretera w czasie wykonywania.

Metody publiczne

abstrakcyjna pustka
alokacjaTensory ()
W razie potrzeby jawnie aktualizuje alokacje dla wszystkich tensorów.
abstrakcyjna pustka
zamknij ()
Zwolnij zasoby skojarzone z instancją InterpreterApi .
statyczny InterpreterApi
utwórz (opcje File modelFile, InterpreterApi.Options )
Konstruuje wystąpienie InterpreterApi przy użyciu określonego modelu i opcji.
statyczny InterpreterApi
utwórz ( opcje ByteBuffer byteBuffer, InterpreterApi.Options )
Konstruuje wystąpienie InterpreterApi przy użyciu określonego modelu i opcji.
streszczenie
getInputIndex ( String nazwa_opcji)
Pobiera indeks wejścia na podstawie nazwy operacji wejścia.
abstrakcyjny tensor
getInputTensor (int inputIndex)
Pobiera tensor skojarzony z podanym indeksem wejściowym.
streszczenie
getInputTensorCount ()
Pobiera liczbę tensorów wejściowych.
streszczenie Długie
getLastNativeInferenceCzas trwaniaNanosekundy ()
Zwraca natywny czas wnioskowania.
streszczenie
getOutputIndex ( String nazwa_opcji)
Pobiera indeks wyjścia na podstawie nazwy operacji wyjścia.
abstrakcyjny tensor
getOutputTensor (int outputIndex)
Pobiera tensor skojarzony z podanym indeksem wyjściowym.
streszczenie
getOutputTensorCount ()
Pobiera liczbę tensorów wyjściowych.
abstrakcyjna pustka
resizeInput (int idx, int[] dims, boolean strict)
Zmienia rozmiar idx-tego wejścia modelu natywnego do podanych wartości.
abstrakcyjna pustka
resizeInput (int idx, int[] dims)
Zmienia rozmiar idx-tego wejścia modelu natywnego do podanych wartości.
abstrakcyjna pustka
run ( wejście obiektu , wyjście obiektu )
Uruchamia wnioskowanie o modelu, jeśli model przyjmuje tylko jedno dane wejściowe i udostępnia tylko jedno dane wyjściowe.
abstrakcyjna pustka
runForMultipleInputsOutputs ( obiekt [] dane wejściowe, mapa < liczba całkowita , obiekt > dane wyjściowe)
Uruchamia wnioskowanie o modelu, jeśli model przyjmuje wiele danych wejściowych lub zwraca wiele danych wyjściowych.

Metody odziedziczone

Metody publiczne

public abstract void alocateTensors ()

W razie potrzeby jawnie aktualizuje alokacje dla wszystkich tensorów.

Spowoduje to propagowanie kształtów i alokacji pamięci dla tensorów zależnych przy użyciu podanego kształtu (kształtów) tensora wejściowego.

Uwaga: to połączenie jest *czysto opcjonalne*. Alokacja tensorów nastąpi automatycznie podczas wykonywania, jeśli zmieniono rozmiar dowolnych tensorów wejściowych. To wywołanie jest najbardziej przydatne przy określaniu kształtów dla dowolnych 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 być w pełni propagowany do momentu wykonania wnioskowania.

Rzuty
Nielegalny wyjątek stanu gdyby tensory grafu nie mogły zostać pomyślnie przydzielone.

publiczne streszczenie nieważne zamknij ()

Zwolnij zasoby skojarzone z instancją InterpreterApi .

publiczny statyczny InterpreterApi utworzyć (opcje File modelFile, InterpreterApi.Options )

Konstruuje wystąpienie InterpreterApi przy użyciu określonego modelu i opcji. Model zostanie wczytany z pliku.

Parametry
modelFile Plik zawierający przeszkolony model TF Lite.
opcje Zestaw opcji dostosowywania zachowania interpretera.
Rzuty
Niedozwolony argumentWyjątek jeśli modelFile nie koduje prawidłowego modelu TensorFlow Lite.

publiczny statyczny InterpreterApi create ( opcje ByteBuffer byteBuffer, InterpreterApi.Options )

Konstruuje wystąpienie InterpreterApi przy użyciu określonego modelu i opcji. Model zostanie odczytany z ByteBuffer .

Parametry
bajtBufor Wstępnie wytrenowany model TF Lite w postaci serializowanej w postaci binarnej. Nie należy modyfikować ByteBuffer po skonstruowaniu wystąpienia InterpreterApi . ByteBuffer może być albo MappedByteBuffer , który mapuje w pamięci plik modelu, albo bezpośrednim ByteBuffer nativeOrder(), który zawiera zawartość bajtów modelu.
opcje Zestaw opcji dostosowywania zachowania interpretera.
Rzuty
Niedozwolony argumentWyjątek jeśli byteBuffer nie jest MappedByteBuffer ani bezpośrednim ByteBuffer nativeOrder.

public abstract int getInputIndex ( String nazwa_opcji)

Pobiera indeks wejścia na podstawie nazwy operacji wejścia.

Parametry
opName
Rzuty
Niedozwolony argumentWyjątek jeśli opName nie pasuje do żadnych danych wejściowych w modelu użytym do zainicjowania interpretera.

public abstract Tensor getInputTensor (int inputIndex)

Pobiera tensor skojarzony z podanym indeksem wejściowym.

Parametry
inputIndex
Rzuty
Niedozwolony argumentWyjątek jeśli inputIndex jest ujemny lub nie jest mniejszy niż liczba danych wejściowych modelu.

public abstract int getInputTensorCount ()

Pobiera liczbę tensorów wejściowych.

public abstract Long getLastNativeInferenceCzas trwaniaNanosekundy ()

Zwraca natywny czas wnioskowania.

Rzuty
Niedozwolony argumentWyjątek jeśli model nie został zainicjowany przez interpreter.

public abstract int getOutputIndex ( String nazwa_opcji)

Pobiera indeks wyjścia na podstawie nazwy operacji wyjścia.

Parametry
opName
Rzuty
Niedozwolony argumentWyjątek jeśli opName nie pasuje do żadnego wyniku w modelu użytym do zainicjowania interpretera.

public abstract Tensor getOutputTensor (int outputIndex)

Pobiera tensor skojarzony z podanym indeksem wyjściowym.

Uwaga: Szczegóły tensora danych wyjściowych (np. kształt) mogą nie zostać w pełni wypełnione, dopóki nie zostanie wykonane wnioskowanie. Jeśli potrzebujesz zaktualizowanych szczegółów *przed* uruchomieniem wnioskowania (np. po zmianie rozmiaru tensora wejściowego, co może unieważnić kształty tensora wyjściowego), użyj funkcji allocateTensors() , aby jawnie wyzwolić alokację i propagację kształtu. Należy zauważyć, ż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 zostać w pełni określony do momentu przeprowadzenia wnioskowania.

Parametry
OutputIndex
Rzuty
Niedozwolony wyjątek Argumentu jeśli outputIndex jest ujemny lub nie jest mniejszy niż liczba wyników modelu.

public abstract int getOutputTensorCount ()

Pobiera liczbę tensorów wyjściowych.

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

Zmienia rozmiar idx-tego wejścia modelu natywnego do podanych wartości.

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

Parametry
idx
ściemniać
ścisły
Rzuty
Niedozwolony argumentWyjątek czy idx jest ujemne lub nie jest mniejsze niż liczba wejść modelu; lub jeśli wystąpi błąd podczas zmiany rozmiaru wejścia idx-th. Ponadto błąd występuje podczas próby zmiany rozmiaru tensora o stałych wymiarach, gdy „strict” ma wartość True.

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

Zmienia rozmiar idx-tego wejścia modelu natywnego do podanych wartości.

Parametry
idx
ściemniać
Rzuty
Niedozwolony argumentWyjątek czy idx jest ujemne lub nie jest mniejsze niż liczba wejść modelu; lub jeśli wystąpi błąd podczas zmiany rozmiaru wejścia idx-th.

public abstract void run (wejście obiektu , wyjście obiektu )

Uruchamia wnioskowanie o modelu, jeśli model przyjmuje tylko jedno dane wejściowe i udostępnia tylko jedno dane wyjściowe.

Ostrzeżenie: API jest bardziej wydajne, jeśli Buffer (najlepiej bezpośredni, ale nie jest wymagany) jest używany jako typ danych wejściowych/wyjściowych. Rozważ użycie Buffer do przesyłania i pobierania danych pierwotnych w celu uzyskania lepszej wydajności. Obsługiwane są następujące typy konkretnych Buffer :

  • ByteBuffer — kompatybilny z dowolnym podstawowym typem Tensora.
  • FloatBuffer - kompatybilny z pływak Tensor.
  • IntBuffer - kompatybilny z tensorami int32.
  • LongBuffer - kompatybilny z tensorami int64.
Należy zauważyć, że typy logiczne są obsługiwane tylko jako tablice, a nie Buffer lub jako dane wejściowe skalarne.

Parametry
Wejście tablica lub tablica wielowymiarowa lub Buffer typów pierwotnych, w tym int, float, long i byte. Buffer jest preferowanym sposobem przekazywania dużych danych wejściowych dla typów pierwotnych, podczas gdy typy ciągów wymagają użycia (wielowymiarowej) ścieżki wejściowej tablicy. Gdy używany jest Buffer , jego zawartość powinna pozostać niezmieniona do momentu zakończenia wnioskowania modelu, a osoba wywołująca musi upewnić się, że Buffer znajduje się w odpowiedniej pozycji odczytu. Wartość null jest dozwolona tylko wtedy, gdy obiekt wywołujący używa Delegate , który umożliwia współdziałanie uchwytu bufora, a taki bufor został powiązany z danymi wejściowymi Tensor .
wyjście wielowymiarowa tablica danych wyjściowych lub Buffer typów pierwotnych, w tym int, float, long i byte. Gdy używany jest Buffer , osoba wywołująca musi upewnić się, że jest ustawiona w odpowiedniej pozycji zapisu. Wartość null jest dozwolona i jest użyteczna w niektórych przypadkach, np. jeśli wywołujący używa Delegate , który umożliwia interop uchwytu bufora, a taki bufor został powiązany z tensorem wyjściowym (zobacz także Interpreter.Options# Tensor (boolean) ) lub jeśli wykres ma dynamicznie kształtowane dane wyjściowe, a obiekt wywołujący musi zapytać o kształt Tensor wyjściowego po wywołaniu wnioskowania, pobierając dane bezpośrednio z tensora wyjściowego (za pośrednictwem Tensor.asReadOnlyBuffer() ).
Rzuty
Niedozwolony argumentWyjątek jeśli input ma wartość null lub jest pusty, lub jeśli wystąpi błąd podczas uruchamiania wnioskowania.
Niedozwolony argumentWyjątek (EKSPERYMENTALNE, może ulec zmianie), jeśli wnioskowanie zostanie przerwane przez setCancelled(true) .

public abstract void runForMultipleInputsOutputs ( Object[] inputs, Map < Integer , Object > outputs)

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

Ostrzeżenie: API jest bardziej wydajne, jeśli Buffer (najlepiej bezpośrednie, ale nie wymagane) są używane jako typy danych wejściowych/wyjściowych. Rozważ użycie Buffer do przesyłania i pobierania danych pierwotnych w celu uzyskania lepszej wydajności. Obsługiwane są następujące typy konkretnych Buffer :

  • ByteBuffer — kompatybilny z dowolnym podstawowym typem Tensora.
  • FloatBuffer - kompatybilny z pływak Tensor.
  • IntBuffer - kompatybilny z tensorami int32.
  • LongBuffer - kompatybilny z tensorami int64.
Należy zauważyć, że typy logiczne są obsługiwane tylko jako tablice, a nie Buffer lub jako dane wejściowe skalarne.

Uwaga: wartości null dla poszczególnych elementów danych inputs i outputs są dozwolone tylko wtedy, gdy obiekt wywołujący używa Delegate , który umożliwia współdziałanie uchwytu bufora, a taki bufor został powiązany z odpowiednim Tensor wejściowym lub wyjściowym.

Parametry
wejścia tablica danych wejściowych. Dane wejściowe powinny być w tej samej kolejności co dane wejściowe modelu. Każde dane wejściowe może być tablicą lub tablicą wielowymiarową lub Buffer typów pierwotnych, w tym int, float, long i byte. Buffer jest preferowanym sposobem przekazywania dużych danych wejściowych, podczas gdy typy łańcuchowe wymagają użycia (wielowymiarowej) ścieżki wejściowej tablicy. Gdy używany jest Buffer , jego zawartość powinna pozostać niezmieniona do momentu zakończenia wnioskowania modelu, a osoba wywołująca musi upewnić się, że Buffer znajduje się w odpowiedniej pozycji odczytu.
wyjścia mapowanie indeksów wyjściowych na wielowymiarowe tablice danych wyjściowych lub Buffer typów pierwotnych, w tym int, float, long i byte. Wystarczy zachować wpisy dotyczące wyjść, które mają być używane. Gdy używany jest Buffer , osoba wywołująca musi upewnić się, że jest ustawiona w odpowiedniej pozycji zapisu. Mapa może być pusta w przypadkach, w których uchwyty bufora są używane do wyjściowych danych tensora lub w przypadkach, w których dane wyjściowe są kształtowane dynamicznie, a obiekt wywołujący musi zapytać o kształt Tensor wyjściowego po wywołaniu wnioskowania, pobierając dane bezpośrednio z tensora wyjściowego ( za pośrednictwem Tensor.asReadOnlyBuffer() ).
Rzuty
Niedozwolony argumentWyjątek jeśli inputs mają wartość null lub są puste, jeśli dane outputs mają wartość null lub jeśli wystąpi błąd podczas uruchamiania wnioskowania.