InterpreterApi

interfejs publiczny InterpreterApi
Znane podklasy pośrednie

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

Instancja InterpreterApi zawiera wstępnie wytrenowany model TensorFlow Lite, w którym wykonywane są operacje 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 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 bierze lub produkuje 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);
 }
 

Zauważ, że istnieje rozróżnienie między kształtem [] a kształtem [1]. Dla wyjść skalarnego tensora strun:

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ść wejść i wyjść jest określana podczas konwersji modelu TensorFlow na model TensorFlowLite za pomocą Toco, podobnie jak domyślne kształty wejść.

Gdy dane wejściowe są dostarczane jako (wielowymiarowe) tablice, odpowiednie tensory wejściowe zostaną domyślnie zmienione zgodnie z kształtem tej tablicy. Gdy dane wejściowe są dostarczane jako typy Buffer , nie jest wykonywana niejawna zmiana rozmiaru; osoba wywołująca musi upewnić się, że rozmiar bajtu Buffer jest zgodny z odpowiednim tensorem lub że najpierw zmieni 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: Instancje InterpreterApi nie są bezpieczne wątkowo.

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

Biblioteka TFLite jest zbudowana w oparciu o NDK API 19. Może działać na poziomach API Androida poniżej 19, ale nie jest to gwarantowane.

Klasy zagnieżdżone

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

Metody publiczne

abstrakcyjna pustka
alokujTensory ()
W razie potrzeby jawnie aktualizuje alokacje dla wszystkich tensorów.
abstrakcyjna pustka
zamknij ()
Zwolnij zasoby powiązane z instancją InterpreterApi .
static InterpreterApi
utwórz ( Plik modelu pliku, opcje InterpreterApi.Options )
Tworzy wystąpienie InterpreterApi przy użyciu określonego modelu i opcji.
static InterpreterApi
utwórz ( ByteBuffer byteBuffer, opcje InterpreterApi.Options )
Tworzy wystąpienie InterpreterApi przy użyciu określonego modelu i opcji.
streszczenie int
getInputIndex ( Ciąg opNazwa)
Pobiera indeks danych wejściowych na podstawie nazwy operacji danych wejściowych.
abstrakcyjny tensor
getInputTensor (int inputIndex)
Pobiera Tensor skojarzony z podanym indeksem wejściowym.
streszczenie int
getInputTensorCount ()
Pobiera liczbę tensorów wejściowych.
streszczenie Długie
getLastNativeInferenceDurationNanosekundy ()
Zwraca rodzimy czas wnioskowania.
streszczenie int
getOutputIndex ( Ciąg opNazwa)
Pobiera indeks danych wyjściowych na podstawie nazwy operacji danych wyjściowych.
abstrakcyjny tensor
getOutputTensor (int outputIndex)
Pobiera Tensor skojarzony z podanym indeksem danych wyjściowych.
streszczenie int
getOutputTensorCount ()
Pobiera liczbę tensorów wyjściowych.
abstrakcyjna pustka
resizeInput (int idx, int[] dim, boolean strict)
Zmienia rozmiar wejścia idx-tego modelu natywnego na podane dim.
abstrakcyjna pustka
resizeInput (int idx, int [] dim)
Zmienia rozmiar wejścia idx-tego modelu natywnego na podane dim.
abstrakcyjna pustka
uruchom (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 ( Wejścia obiektu [] , Map < Integer , Obiekt > wyjścia)
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 przydziel Tensory ()

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

Spowoduje to propagację kształtów i alokacji pamięci dla zależnych tensorów przy użyciu podanych kształtów tensora wejściowego.

Uwaga: To połączenie jest *wyłącznie opcjonalne*. Alokacja tensorów nastąpi automatycznie podczas wykonywania, jeśli zmieniono rozmiar jakichkolwiek 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ą dane wyjściowe kształtowane dynamicznie, w takim przypadku kształt wyjściowy może nie być w pełni propagowany, dopóki nie zostanie wykonane wnioskowanie.

Rzuty
Niedozwolony wyjątek stanu jeśli tensory wykresu nie mogły zostać pomyślnie przydzielone.

publiczne streszczenie void zamknij ()

Zwolnij zasoby powiązane z instancją InterpreterApi .

public static Tworzenie InterpreterApi ( plik modelu pliku , opcje InterpreterApi.Options )

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

Parametry
ModelPlik Plik zawierający wstępnie wytrenowany model TF Lite.
opcje Zestaw opcji dostosowywania zachowania tłumacza.
Rzuty
Niedozwolony wyjątek Argument jeśli modelFile nie koduje prawidłowego modelu TensorFlow Lite.

publiczne statyczne tworzenie InterpreterApi ( ByteBuffer byteBuffer, opcje InterpreterApi.Options )

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

Parametry
ByteBuffer Wstępnie przeszkolony model TF Lite w binarnej postaci serializowanej. ByteBuffer nie powinien być modyfikowany po zbudowaniu instancji InterpreterApi . ByteBuffer może być albo MappedByteBuffer , który odwzorowuje plik modelu w pamięci, albo bezpośrednim ByteBuffer nativeOrder(), który zawiera bajty zawartości modelu.
opcje Zestaw opcji dostosowywania zachowania tłumacza.
Rzuty
Niedozwolony wyjątek Argument jeśli byteBuffer nie jest MappedByteBuffer ani bezpośrednim ByteBuffer nativeOrder.

public abstract int getInputIndex ( String opName)

Pobiera indeks danych wejściowych na podstawie nazwy operacji danych wejściowych.

Parametry
Nazwa op
Rzuty
Niedozwolony wyjątek Argument 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 wyjątek Argument jeśli inputIndex jest ujemny lub nie jest mniejszy niż liczba danych wejściowych modelu.

publiczne streszczenie int getInputTensorCount ()

Pobiera liczbę tensorów wejściowych.

streszczenie publiczne Long getLastNativeInferenceDurationNanosekundy ()

Zwraca rodzimy czas wnioskowania.

Rzuty
Niedozwolony wyjątek Argument jeśli model nie jest inicjowany przez interpreter.

public abstract int getOutputIndex ( String opName)

Pobiera indeks danych wyjściowych na podstawie nazwy operacji danych wyjściowych.

Parametry
Nazwa op
Rzuty
Niedozwolony wyjątek Argument jeśli opName nie pasuje do żadnego wyjścia w modelu użytym do zainicjowania interpretera.

public abstract Tensor getOutputTensor (int outputIndex)

Pobiera Tensor skojarzony z podanym indeksem danych wyjściowych.

Uwaga: Szczegóły wyjściowego tensora (np. kształt) mogą nie zostać w pełni wypełnione, dopóki nie zostanie wykonane wnioskowanie. Jeśli potrzebujesz zaktualizować szczegóły *przed* uruchomieniem wnioskowania (np. po zmianie rozmiaru tensora wejściowego, co może unieważnić kształty tensora wyjściowego), użyj allocateTensors() w celu jawnego wyzwolenia alokacji i propagacji kształtu. Należy zauważyć, że w przypadku wykresów z kształtami wyjściowymi zależnymi od *wartości* wejściowych kształt wyjściowy może nie być w pełni określony, dopóki nie uruchomi się wnioskowania.

Parametry
wskaźnik wyjściowy
Rzuty
Niedozwolony wyjątek Argument jeśli outputIndex jest ujemny lub nie jest mniejszy niż liczba wyjść modelu.

publiczne streszczenie int getOutputTensorCount ()

Pobiera liczbę tensorów wyjściowych.

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

Zmienia rozmiar wejścia idx-tego modelu natywnego na podane dim.

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

Parametry
idx
przyciemnia
ścisły
Rzuty
Niedozwolony wyjątek Argument jeśli idx jest ujemne lub nie jest mniejsze od liczby wejść modelu; lub jeśli wystąpi błąd podczas zmiany rozmiaru idx-tego wejścia. Ponadto błąd występuje podczas próby zmiany rozmiaru tensora o stałych wymiarach, gdy parametr „ścisłe” ma wartość Prawda.

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

Zmienia rozmiar wejścia idx-tego modelu natywnego na podane dim.

Parametry
idx
przyciemnia
Rzuty
Niedozwolony wyjątek Argument jeśli idx jest ujemne lub nie jest mniejsze od liczby wejść modelu; lub jeśli wystąpi błąd podczas zmiany rozmiaru idx-tego wejścia.

publiczny abstrakcyjny przebieg nieważności (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: interfejs API jest bardziej wydajny, jeśli Buffer (najlepiej bezpośredni, ale nie wymagany) jest używany jako typ danych wejścia/wyjścia. Rozważ użycie funkcji Buffer do przesyłania i pobierania danych pierwotnych w celu uzyskania lepszej wydajności. Obsługiwane są następujące konkretne typy Buffer :

  • ByteBuffer — kompatybilny z dowolnym pierwotnym typem tensora.
  • FloatBuffer - kompatybilny z tensorami typu float.
  • IntBuffer - kompatybilny z tensorami int32.
  • LongBuffer — kompatybilny z tensorami int64.
Należy zauważyć, że typy boolowskie są obsługiwane tylko jako tablice, a nie Buffer s lub jako skalarne dane wejściowe.

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 ł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 o modelu, a wywołujący musi upewnić się, że Buffer znajduje się na odpowiedniej pozycji do odczytu. Wartość null jest dozwolona tylko wtedy, gdy obiekt wywołujący używa Delegate , który zezwala na interopcję obsługi bufora, a taki bufor został powiązany z wejściem Tensor .
wyjście wielowymiarowa tablica danych wyjściowych lub Buffer typów pierwotnych, w tym int, float, long i byte. Gdy Buffer jest używany, osoba wywołująca musi upewnić się, że jest ustawiona odpowiednia pozycja zapisu. Wartość null jest dozwolona i jest przydatna w pewnych przypadkach, np. jeśli wywołujący używa Delegate , który pozwala na interopcję obsługi bufora, a taki bufor został powiązany z wyjściowym Tensor (zobacz także Interpreter.Options#setAllowBufferHandleOutput(boolean) Tensor Tensor.asReadOnlyBuffer()
Rzuty
Niedozwolony wyjątek Argument jeśli input mają wartość NULL lub są puste lub jeśli podczas uruchamiania wnioskowania wystąpi błąd.
Niedozwolony wyjątek Argument (EKSPERYMENTALNE, może ulec zmianie), jeśli wnioskowanie zostanie przerwane przez setCancelled(true) .

public abstract void runForMultipleInputsOutputs ( Wejścia obiektu [] , Map < Integer , Obiekt > wyjścia)

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

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

  • ByteBuffer — kompatybilny z dowolnym pierwotnym typem tensora.
  • FloatBuffer - kompatybilny z tensorami typu float.
  • IntBuffer - kompatybilny z tensorami int32.
  • LongBuffer — kompatybilny z tensorami int64.
Należy zauważyć, że typy boolowskie są obsługiwane tylko jako tablice, a nie Buffer s lub jako skalarne dane wejściowe.

Uwaga: wartości null dla poszczególnych elementów inputs i outputs są dozwolone tylko wtedy, gdy wywołujący używa Delegate , który pozwala na interopcję obsługi bufora, a taki bufor został powiązany z odpowiednim Tensor (ami) wejścia lub wyjścia.

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