Klasa sterownika do wnioskowania modelu za pomocą TensorFlow Lite.
Uwaga: jeśli nie potrzebujesz dostępu do Funkcje API poniżej – preferuję użycie InterpreterApi i InterpreterFactory zamiast bezpośredniego korzystania z narzędzia Interpreter.
Interpreter
zawiera wytrenowany model TensorFlow Lite, w którym operacje
są wykonywane na potrzeby wnioskowania na podstawie modelu.
Jeśli na przykład model przyjmuje tylko 1 dane wejściowe i zwraca tylko jedno dane wyjściowe:
try (Interpreter interpreter = new Interpreter(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 (Interpreter interpreter = new Interpreter(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 (Interpreter interpreter = new Interpreter(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. Gdy dane wejściowe są podane jako Buffer
nie jest wprowadzana żadna niejawna zmiana rozmiaru; element wywołujący musi zapewnić, że rozmiar w bajtach to Buffer
pasuje do danego tensora lub najpierw zmienia rozmiar tensora za pomocą funkcji resizeInput(int, int[])
. Informacje o kształcie i typie Tensor można uzyskać za pomocą klasy Tensor
, dostępnej za pośrednictwem getInputTensor(int)
i getOutputTensor(int)
.
OSTRZEŻENIE: instancje Interpreter
nie są bezpieczne w przypadku wątków. Interpreter
posiada zasoby, które muszą być wyraźnie zwolnione przez wywołanie metody 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 | Interpreter.Options | Klasa opcji do kontrolowania działania interpretera czasu działania. |
Konstruktorki publiczne
Interpreter(plik modelu Plik, opcje Interpreter.Options)
Inicjuje
Interpreter i określa opcje dostosowywania działania interpretera. |
|
Interpreter(ByteBuffer byteBuffer)
Inicjuje właściwość
Interpreter z elementem ByteBuffer pliku modelu. |
|
Interpreter obrazu(ByteBuffer byteBuffer, opcje Interpreter.Options)
Inicjuje obiekt
Interpreter z użyciem elementu ByteBuffer pliku modelu i zbioru
niestandardowy Interpreter.Options . |
Metody publiczne
nieważne |
allocateTensors()
W razie potrzeby jawnie aktualizuje przydziały wszystkich tensorów.
|
nieważne |
close()
Zwolnij zasoby powiązane z instancją
InterpreterApi . |
int, |
getInputIndex(nazwa opcji ciąg znaków)
Pobiera indeks danych wejściowych o nazwie operacji dla danych wejściowych.
|
Tensor |
getInputTensor(int inputIndex)
Pobiera Tensor powiązany z podanym indeksem danych wejściowych.
|
int, |
getInputTensorCount()
Pobiera liczbę tensorów wejściowych.
|
Tensor |
getInputTensorFromSignature(Ciąg nazwa wejścia, CiągSignatureKey)
Pobiera Tensor powiązany z podaną nazwą danych wejściowych i nazwą metody podpisu.
|
Długi |
getLastNativeInferenceDurationNanoseconds()
Zwraca czas wnioskowania natywnego.
|
int, |
getOutputIndex(opName ciągu)
Pobiera indeks danych wyjściowych o nazwie operacji w danych wyjściowych.
|
Tensor |
getOutputTensor(int outputIndex)
Pobiera Tensor powiązany z podanym indeksem wyjściowym.
|
int, |
getOutputTensorCount()
Pobiera liczbę wyjściowych tensorów.
|
Tensor |
getOutputTensorFromSignature(Ciąg nazwa_wyjściowa, String signatureKey)
Pobiera Tensor powiązany z podaną nazwą danych wyjściowych w określonej metodzie podpisu.
|
String[] |
getSignatureInputs(ciąg podpisu klucza)
Pobiera listę danych wejściowych SignatureDefs dla metody
signatureKey . |
String[] |
getSignatureKeys()
Pobiera listę nazw metod wyeksportowanych SignatureDef dostępnych w modelu.
|
String[] |
getSignatureOutputs(StringSignatureKey)
Pobiera listę danych wyjściowych SignatureDefs dla metody
signatureKey . |
nieważne |
resetVariableTensors()
Zaawansowane: resetuje wszystkie tensory zmienne do wartości domyślnej.
|
nieważne |
resizeInput(int idx, int[] dims, boolean strict)
Zmienia rozmiar danych wejściowych modelu natywnego (IDX).
|
nieważne |
resizeInput(int idx, int[] przyciemnione)
Zmienia rozmiar danych wejściowych modelu natywnego (IDX).
|
nieważne | |
nieważne |
runForMultipleInputsOutputs(dane wejściowe Object[], dane wyjściowe Map <Liczba całkowita, Obiekt>)
Uruchamia wnioskowanie przez model, jeśli model przyjmuje wiele danych wejściowych, lub zwraca wiele danych wyjściowych.
|
nieważne |
runSignature(Map<Ciąg, Object> dane wejściowe, Mapa <Ciąg, Obiekt>)
Działa tak samo jak
runSignature(Map, Map, String) , ale nie wymaga przekazywania klucza podpisu,
zakładając, że model ma 1 element SignatureDef. |
nieważne | |
nieważne |
setCancelled(wartość logiczna anulowana)
Zaawansowane: przerywa wnioskowanie w trakcie rozmowy z
run(Object, Object) . |
Metody dziedziczone
Konstruktorki publiczne
publiczne . Tłumacz ustny (Plik modelu)
Inicjuje interfejs Interpreter
.
Parametry
modelFile | Plik wytrenowanego modelu TF Lite. |
---|
Rzuty
IllegalArgumentException | jeśli modelFile nie koduje prawidłowego TensorFlow Lite
model atrybucji.
|
---|
publiczne . Tłumacz ustny (Plik modelFile, Interpreter.Options)
Inicjuje Interpreter
i określa opcje dostosowywania działania interpretera.
Parametry
modelFile | plik wytrenowanego modelu 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 . Tłumacz ustny (ByteBuffer byteBuffer)
Inicjuje właściwość Interpreter
z elementem ByteBuffer
pliku modelu.
Po utworzeniu obiektu Interpreter
nie należy modyfikować obiektu ByteBuffer.
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.
Parametry
byteBuffer |
---|
Rzuty
IllegalArgumentException | jeśli byteBuffer nie jest wartością MappedByteBuffer ani a
bezpośrednie ByteBuffer obiektu NativeOrder.
|
---|
publiczne . Tłumacz ustny (ByteBuffer byteBuffer, Interpreter.Options)
Inicjuje obiekt Interpreter
z użyciem elementu ByteBuffer
pliku modelu i zbioru
niestandardowy Interpreter.Options
.
Po utworzeniu elementu Interpreter
nie należy modyfikować elementu ByteBuffer
. ByteBuffer
może być obiektem MappedByteBuffer
, który mapuje pamięć
plik modelu lub bezpośredni element ByteBuffer
funkcjinativeOrder(), który zawiera treść bajtów
modelu.
Parametry
byteBuffer | |
---|---|
Opcje |
Rzuty
IllegalArgumentException | jeśli byteBuffer nie jest wartością MappedByteBuffer ani a
bezpośrednie ByteBuffer obiektu NativeOrder.
|
---|
Metody publiczne
publiczne 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.
publiczne nieważne . zamknij ()
Zwolnij zasoby powiązane z instancją InterpreterApi
.
publiczne int, . getInputIndex (Ciąg opName)
Pobiera indeks danych wejściowych o nazwie operacji dla danych wejściowych.
Parametry
opName |
---|
publiczne Tensor getInputTensor (int inputIndex)
Pobiera Tensor powiązany z podanym indeksem danych wejściowych.
Parametry
inputIndex |
---|
publiczne int, . getInputTensorCount ()
Pobiera liczbę tensorów wejściowych.
publiczne Tensor getInputTensorFromSignature (CiąginputName, String signatureKey)
Pobiera Tensor powiązany z podaną nazwą danych wejściowych i nazwą metody podpisu.
OSTRZEŻENIE: to jest eksperymentalny interfejs API, który może ulec zmianie.
Parametry
inputName | Wpisz nazwę w podpisie. |
---|---|
signatureKey | Klucz podpisu identyfikujący obiekt SignatureDef. Może mieć wartość null, jeśli model ma jeden podpis. |
Rzuty
IllegalArgumentException | jeśli inputName lub signatureKey jest pusta lub ma wartość null,
lub podana nazwa jest nieprawidłowa.
|
---|
publiczne int, . getOutputIndex (Ciąg opName)
Pobiera indeks danych wyjściowych o nazwie operacji w danych wyjściowych.
Parametry
opName |
---|
publiczne 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 |
---|
publiczne int, . getOutputTensorCount ()
Pobiera liczbę wyjściowych tensorów.
publiczne Tensor getOutputTensorFromSignature (Ciąg nazwa_wyjściowa, Ciąg signedKey)
Pobiera Tensor powiązany z podaną nazwą danych wyjściowych w określonej metodzie podpisu.
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.
OSTRZEŻENIE: to jest eksperymentalny interfejs API, który może ulec zmianie.
Parametry
outputName | Nazwa wyjściowa w podpisie. |
---|---|
signatureKey | Klucz podpisu identyfikujący obiekt SignatureDef. Może mieć wartość null, jeśli model ma jeden podpis. |
Rzuty
IllegalArgumentException | jeśli outputName lub signatureKey ma wartość null lub
puste lub podana nieprawidłowa nazwa.
|
---|
publiczne String[] getSignatureInputs (CiągSignatureKey)
Pobiera listę danych wejściowych SignatureDefs dla metody signatureKey
.
OSTRZEŻENIE: to jest eksperymentalny interfejs API, który może ulec zmianie.
Parametry
signatureKey |
---|
publiczne String[] getSignatureKeys ()
Pobiera listę nazw metod wyeksportowanych SignatureDef dostępnych w modelu.
OSTRZEŻENIE: to jest eksperymentalny interfejs API, który może ulec zmianie.
publiczne String[] getSignatureOutputs (CiągSignatureKey)
Pobiera listę danych wyjściowych SignatureDefs dla metody signatureKey
.
OSTRZEŻENIE: to jest eksperymentalny interfejs API, który może ulec zmianie.
Parametry
signatureKey |
---|
publiczne nieważne . resetVariableTensors ()
Zaawansowane: resetuje wszystkie tensory zmienne do wartości domyślnej.
Jeśli tensor zmiennej nie ma powiązanego bufora, zostanie on zresetowany do zera.
OSTRZEŻENIE: to jest eksperymentalny interfejs API, który może ulec zmianie.
publiczne 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 |
publiczne nieważne . resizeInput (int idx, int[] przyciemnione)
Zmienia rozmiar danych wejściowych modelu natywnego (IDX).
Parametry
Identyfikatorx | |
---|---|
Przyciemnia |
publiczne 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.
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() ). |
publiczne nieważne . runForMultipleInputsOutputs (dane wejściowe obiektu[], dane wyjściowe mapy <liczby całkowitej, obiekt>)
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.
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. Preferowany sposób to Buffer
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() ). |
publiczne nieważne . runSignature (Map<String, Object> (dane wejściowe), Map<String, Object> (Dane wyjściowe)
Działa tak samo jak runSignature(Map, Map, String)
, ale nie wymaga przekazywania klucza podpisu,
zakładając, że model ma 1 element SignatureDef. Jeśli model ma więcej niż jeden element SignatureDef,
zrobić wyjątek.
OSTRZEŻENIE: to jest eksperymentalny interfejs API, który może ulec zmianie.
Parametry
dane wejściowe | |
---|---|
dane wyjściowe |
publiczne nieważne . runSignature (Map<Ciąg, Obiekt>, dane wejściowe Map<Ciąg, Obiekt>, String signatureKey)
Uruchamia wnioskowanie modelu na podstawie protokołu SignatureDef dostarczonego w usłudze signatureKey
.
Więcej informacji o dozwolonych danych wejściowych i wyjściowych znajdziesz w sekcji run(Object, Object)
typy danych.
OSTRZEŻENIE: to jest eksperymentalny interfejs API, który może ulec zmianie.
Parametry
dane wejściowe | Mapowanie z nazwy danych wejściowych w obiekcie SignatureDef na obiekt wejściowy. |
---|---|
dane wyjściowe | Mapowanie z nazwy wyjściowej w SignatureDef na dane wyjściowe. To pole może być puste, jeśli
element wywołujący chce przesłać zapytanie do danych Tensor bezpośrednio po wywnioskowaniu (np. jeśli
kształt danych wyjściowych jest dynamiczny lub używane są uchwyty bufora wyjściowego). |
signatureKey | Klucz podpisu identyfikujący obiekt SignatureDef. |
Rzuty
IllegalArgumentException | jeśli inputs ma wartość null lub jest pusty, jeśli outputs lub
signatureKey ma wartość null lub jeśli podczas uruchamiania wnioskowania wystąpi błąd.
|
---|
publiczne nieważne . setCancelled (wartość logiczna anulowana)
Zaawansowane: przerywa wnioskowanie w trakcie rozmowy z run(Object, Object)
.
Po wywołaniu tej funkcji flaga anulowania zostanie ustawiona na wartość true (prawda). Tłumacz wyda
sprawdzić flagę między wywołaniami Op. Jeśli jest to true
, tłumacz zostanie zatrzymany.
Tłumacz pozostanie w stanie anulowania do momentu wyraźnego anulowania subskrypcji. autor:
setCancelled(false)
OSTRZEŻENIE: to jest eksperymentalny interfejs API, który może ulec zmianie.
Parametry
anulowano | true , aby anulować wnioskowanie w możliwie najlepszy sposób; false do
do swojego życiorysu zawodowego. |
---|
Rzuty
IllegalStateException | jeśli tłumacz nie został zainicjowany z użyciem funkcji anulowania , która jest domyślnie wyłączona. |
---|