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 | |
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 | |
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 | |
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ć MappedByteBuffer mapą 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.
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łkowita, obiekt>)
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.
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.
|
---|