Klasa sterownika do prowadzenia wnioskowania o modelu za pomocą TensorFlow Lite.
Uwaga: jeśli nie potrzebujesz dostępu do żadnej z poniższych „eksperymentalnych” funkcji API, wolisz używać InterpreterApi i InterpreterFactory niż bezpośrednio używać Interpretera.
Interpreter
obejmuje 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 (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 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 (Interpreter interpreter = new Interpreter(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 Interpreter
nie są bezpieczne dla wątków. Interpreter
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 | Tłumacz.Opcje | Klasa opcji do kontrolowania zachowania interpretera w czasie wykonywania. |
Konstruktory publiczne
Interpreter ( plik modelpliku, interpreter.opcje opcji) Inicjuje Interpreter i określa opcje dostosowywania zachowania interpretera. | |
Metody publiczne
próżnia | alokujTensory () W razie potrzeby jawnie aktualizuje alokacje dla wszystkich tensorów. |
próżnia | zamknij () Zwolnij zasoby powiązane z instancją InterpreterApi . |
int | getInputIndex ( Ciąg opNazwa) Pobiera indeks danych wejściowych na podstawie nazwy operacji danych wejściowych. |
Napinacz | getInputTensor (int inputIndex) Pobiera Tensor skojarzony z podanym indeksem wejściowym. |
int | getInputTensorCount () Pobiera liczbę tensorów wejściowych. |
Napinacz | getInputTensorFromSignature ( String inputName, String signatureKey) Pobiera Tensor skojarzony z podaną nazwą wejściową i nazwą metody podpisu. |
Długi | getLastNativeInferenceDurationNanosekundy () Zwraca rodzimy czas wnioskowania. |
int | getOutputIndex ( Ciąg opNazwa) Pobiera indeks danych wyjściowych na podstawie nazwy operacji danych wyjściowych. |
Napinacz | getOutputTensor (int outputIndex) Pobiera Tensor skojarzony z podanym indeksem danych wyjściowych. |
int | getOutputTensorCount () Pobiera liczbę tensorów wyjściowych. |
Napinacz | getOutputTensorFromSignature ( String nazwa_wyjścia, String signatureKey) Pobiera Tensor skojarzony z podaną nazwą danych wyjściowych w określonej metodzie podpisu. |
Strunowy[] | getSignatureInputs ( Ciąg znaków klucz podpisu) Pobiera listę danych wejściowych SignatureDefs dla metody signatureKey . |
Strunowy[] | getSignatureKeys () Pobiera listę wyeksportowanych nazw metod SignatureDef dostępnych w modelu. |
Strunowy[] | getSignatureOutputs ( Ciąg znaków klucz podpisu) Pobiera listę danych wyjściowych SignatureDefs dla metody signatureKey . |
próżnia | resetowanieTensory zmiennej () Zaawansowane: Resetuje wszystkie tensory zmiennych do wartości domyślnych. |
próżnia | resizeInput (int idx, int[] dim, boolean strict) Zmienia rozmiar wejścia idx-tego modelu natywnego na podane dim. |
próżnia | resizeInput (int idx, int [] dim) Zmienia rozmiar wejścia idx-tego modelu natywnego na podane dim. |
próżnia | |
próżnia | 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. |
próżnia | runSignature ( Map < String , Object > inputs, Map < String , Object > outputs) To samo co runSignature(Map, Map, String) ale nie wymaga przekazywania klucza signatureKey, przy założeniu, że model ma jeden SignatureDef. |
próżnia | |
próżnia | setCancelled (anulowana wartość logiczna) Zaawansowane: Przerywa wnioskowanie w trakcie wywołania run(Object, Object) . |
Metody odziedziczone
Konstruktory publiczne
public Interpreter ( Plik modeluPlik)
Inicjuje Interpreter
.
Parametry
ModelPlik | a Plik wstępnie wytrenowanego modelu TF Lite. |
---|
Rzuty
Niedozwolony wyjątek Argument | jeśli modelFile nie koduje prawidłowego modelu TensorFlow Lite. |
---|
public Interpreter ( File modelFile, Interpreter.Options opcje)
Inicjuje Interpreter
i określa opcje dostosowywania zachowania interpretera.
Parametry
ModelPlik | plik wstępnie wytrenowanego modelu TF Lite |
---|---|
opcje | zestaw opcji dostosowywania zachowania tłumacza |
Rzuty
Niedozwolony wyjątek Argument | jeśli modelFile nie koduje prawidłowego modelu TensorFlow Lite. |
---|
publiczny interpreter ( ByteBuffer byteBuffer)
Inicjuje Interpreter
z ByteBuffer
pliku modelu.
ByteBuffer nie powinien być modyfikowany po zbudowaniu Interpreter
. 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.
Parametry
ByteBuffer |
---|
Rzuty
Niedozwolony wyjątek Argument | jeśli byteBuffer nie jest MappedByteBuffer ani bezpośrednim ByteBuffer nativeOrder. |
---|
public Interpreter ( ByteBuffer byteBuffer, opcje Interpreter.Options )
Inicjuje Interpreter
z ByteBuffer
pliku modelu i zestawem niestandardowych Interpreter.Options
.
ByteBuffer
nie powinien być modyfikowany po zbudowaniu Interpreter
. 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.
Parametry
ByteBuffer | |
---|---|
opcje |
Rzuty
Niedozwolony wyjątek Argument | jeśli byteBuffer nie jest MappedByteBuffer ani bezpośrednim ByteBuffer nativeOrder. |
---|
Metody publiczne
public 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.
publiczne nieważne zamknij ()
Zwolnij zasoby powiązane z instancją InterpreterApi
.
public int getInputIndex ( String opName)
Pobiera indeks danych wejściowych na podstawie nazwy operacji danych wejściowych.
Parametry
Nazwa op |
---|
publiczny Tensor getInputTensor (int inputIndex)
Pobiera Tensor skojarzony z podanym indeksem wejściowym.
Parametry
inputIndex |
---|
public int getInputTensorCount ()
Pobiera liczbę tensorów wejściowych.
public Tensor getInputTensorFromSignature ( String inputName, String signatureKey)
Pobiera Tensor skojarzony z podaną nazwą wejściową i nazwą metody podpisu.
OSTRZEŻENIE: To jest eksperymentalny interfejs API i może ulec zmianie.
Parametry
nazwa_wejściowa | Wpisz nazwę w podpisie. |
---|---|
klucz podpisu | Klucz podpisu identyfikujący SignatureDef może mieć wartość null, jeśli model ma jeden podpis. |
Rzuty
Niedozwolony wyjątek Argument | jeśli inputName lub signatureKey ma wartość null lub jest pusta albo podano nieprawidłową nazwę. |
---|
public int getOutputIndex ( String opName)
Pobiera indeks danych wyjściowych na podstawie nazwy operacji danych wyjściowych.
Parametry
Nazwa op |
---|
public 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 |
---|
public int getOutputTensorCount ()
Pobiera liczbę tensorów wyjściowych.
public Tensor getOutputTensorFromSignature ( String outputName, String signatureKey)
Pobiera Tensor skojarzony z podaną nazwą danych wyjściowych w określonej metodzie podpisu.
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.
OSTRZEŻENIE: To jest eksperymentalny interfejs API i może ulec zmianie.
Parametry
nazwa wyjściowa | Nazwa wyjściowa w podpisie. |
---|---|
klucz podpisu | Klucz podpisu identyfikujący SignatureDef może mieć wartość null, jeśli model ma jeden podpis. |
Rzuty
Niedozwolony wyjątek Argument | jeśli outputName lub signatureKey ma wartość null lub jest pusta albo podano nieprawidłową nazwę. |
---|
public String[] getSignatureInputs ( String signatureKey)
Pobiera listę danych wejściowych SignatureDefs dla metody signatureKey
.
OSTRZEŻENIE: To jest eksperymentalny interfejs API i może ulec zmianie.
Parametry
klucz podpisu |
---|
publiczny Ciąg [] getSignatureKeys ()
Pobiera listę wyeksportowanych nazw metod SignatureDef dostępnych w modelu.
OSTRZEŻENIE: To jest eksperymentalny interfejs API i może ulec zmianie.
public String[] getSignatureOutputs ( String signatureKey)
Pobiera listę danych wyjściowych SignatureDefs dla metody signatureKey
.
OSTRZEŻENIE: To jest eksperymentalny interfejs API i może ulec zmianie.
Parametry
klucz podpisu |
---|
public void resetowanie ZmienneTensory ()
Zaawansowane: Resetuje wszystkie tensory zmiennych do wartości domyślnych.
Jeśli tensor zmiennej nie ma powiązanego bufora, zostanie zresetowany do zera.
OSTRZEŻENIE: To jest eksperymentalny interfejs API i może ulec zmianie.
public 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 |
public void resizeInput (int idx, int [] dims)
Zmienia rozmiar wejścia idx-tego modelu natywnego na podane dim.
Parametry
idx | |
---|---|
przyciemnia |
public 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: 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.
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() |
public 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.
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() ). |
public void runSignature ( Map < String , Object > inputs, Map < String , Object > outputs)
To samo co runSignature(Map, Map, String)
ale nie wymaga przekazywania klucza signatureKey, przy założeniu, że model ma jeden SignatureDef. Jeśli model ma więcej niż jeden SignatureDef, zgłosi wyjątek.
OSTRZEŻENIE: To jest eksperymentalny interfejs API i może ulec zmianie.
Parametry
wejścia | |
---|---|
wyjścia |
public void runSignature ( Map < String , Object > inputs, Map < String , Object > outputs, String signatureKey)
Uruchamia wnioskowanie o modelu na podstawie SignatureDef dostarczonego przez signatureKey
.
Zobacz run(Object, Object)
aby uzyskać więcej informacji na temat dozwolonych typów danych wejściowych i wyjściowych.
OSTRZEŻENIE: To jest eksperymentalny interfejs API i może ulec zmianie.
Parametry
wejścia | Mapa z nazwy wejściowej w SignatureDef do obiektu wejściowego. |
---|---|
wyjścia | Mapa od nazwy wyjściowej w SignatureDef do danych wyjściowych. To może być puste, jeśli wywołujący chce zapytać o dane Tensor bezpośrednio po wnioskowaniu (np. jeśli kształt wyjściowy jest dynamiczny lub używane są uchwyty bufora wyjściowego). |
klucz podpisu | Klucz podpisu identyfikujący SignatureDef. |
Rzuty
Niedozwolony wyjątek Argument | jeśli inputs mają wartość null lub są puste, jeśli outputs lub signatureKey mają wartość null lub jeśli podczas uruchamiania wnioskowania wystąpi błąd. |
---|
public void setCancelled (anulowano wartość logiczną)
Zaawansowane: Przerywa wnioskowanie w trakcie wywołania run(Object, Object)
.
Flaga anulowania zostanie ustawiona na true, gdy ta funkcja zostanie wywołana. Interpreter będzie sprawdzał flagę między wywołaniami Op, a jeśli to true
, interpreter zatrzyma wykonywanie. Interpreter pozostanie anulowanym stanem, dopóki nie zostanie wyraźnie „uncancelled” przez setCancelled(false)
.
OSTRZEŻENIE: To jest eksperymentalny interfejs API i może ulec zmianie.
Parametry
odwołany | true Aby anulować wnioskowanie w najlepszy możliwy sposób; false aby wznowić. |
---|
Rzuty
Niedozwolony wyjątek stanu | jeśli interpreter nie jest zainicjowany z opcją anulowania, która jest domyślnie wyłączona. |
---|