Klasa sterownika do wnioskowania modelu za pomocą TensorFlow Lite.
Uwaga: jeśli nie potrzebujesz dostępu do żadnej z „eksperymentalnych” funkcji interfejsu API wymienionych poniżej, wolij używać interfejsów InterpreterApi i InterpreterFactory, a nie bezpośrednio korzystać z interfejsu Interpreter.
Interpreter
zawiera wytrenowany model TensorFlow Lite, w którym są wykonywane operacje, aby wnioskować na podstawie modelu.
Jeśli na przykład model przyjmuje tylko 1 dane wejściowe i zwraca tylko 1 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 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 (Interpreter interpreter = new Interpreter(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 rozmiar tensora za pomocą metody 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 Interpreter
nie są bezpieczne w wątkach. Obiekt Interpreter
jest właścicielem zasobów, które muszą zostać wyraźnie uwolnione 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 | Interpreter.Options | Klasa opcji do kontrolowania działania interpretatora w czasie działania. |
Konstruktorzy publiczni
Interpreter(plik modelu Plik, opcje Interpreter.Options)
Inicjuje obiekt
Interpreter i określa opcje dostosowywania działania tłumaczenia rozmowy. |
|
Interpreter(opcje byteBuffer ByteBuffer i Interpreter.Options)
Inicjuje obiekt
Interpreter z ByteBuffer pliku modelu i zestawem niestandardowych elementów Interpreter.Options . |
Metody publiczne
void |
allocateTensors()
W razie potrzeby jawnie aktualizuje przydziały wszystkich tensorów.
|
void |
close()
Zwolnij zasoby powiązane z instancją
InterpreterApi . |
int | |
Tensor |
getInputTensor(int inputIndex)
Pobiera Tensor powiązany z podanym indeksem danych wejściowych.
|
int |
getInputTensorCount(),
Pobiera liczbę tensorów wejściowych.
|
Tensor |
getInputTensorFromSignature(String inputName, String signatureKey)
Pobiera Tensor powiązany z podaną nazwą wprowadzania i nazwą metody podpisu.
|
Długi |
getLastNativeInferenceDurationNanoseconds()
Zwraca natywny czas wnioskowania.
|
int | |
Tensor |
getOutputTensor(intoutputIndex)
Pobiera Tensor powiązany z podanym indeksem wyjściowym.
|
int |
getOutputTensorCount()
Pobiera liczbę wyjściowych Tensor.
|
Tensor |
getOutputTensorFromSignature(StringoutputName, String signatureKey)
Pobiera Tensor powiązany z podaną nazwą wyjściową w określonej metodzie podpisu.
|
Ciąg[] |
getSignatureInputs(String signatureKey)
Pobiera listę danych wejściowych SignatureDefs dla metody
signatureKey . |
Ciąg[] |
getSignatureKeys().
Pobiera listę nazw wyeksportowanych metod SignatureDef dostępnych w modelu.
|
Ciąg[] |
getSignatureOutputs(String signatureKey)
Pobiera listę danych wyjściowych SignatureDefs dla metody
signatureKey . |
void |
resetVariableTensors()
Zaawansowane: resetuje wszystkie tensory zmiennych do wartości domyślnej.
|
void |
resizeInput(int idx, int[] dims, boolean strict)
Zmienia rozmiar danych wejściowych idx modelu natywnego na dane przyciemnienia.
|
void |
resizeInput(int idx, int[] przyciemniony)
Zmienia rozmiar danych wejściowych idx modelu natywnego na dane przyciemnienia.
|
void | |
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.
|
void |
runSignature(Map<ciąg znaków, Object> dane wejściowe, Mapa<String, Object> dane wyjściowe)
Funkcja taka sama jak w przypadku
runSignature(Map, Map, String) , ale nie wymaga przekazywania klucza signatureKey, przy założeniu, że model ma jeden element SignatureDef. |
void | |
void |
setCancelled(anulowano wartość logiczna)
Zaawansowane: zakłóca wnioskowanie w trakcie połączenia z
run(Object, Object) . |
Metody dziedziczone
Konstruktorzy publiczni
public Interpreter (Plik modelFile)
Inicjuje obiekt Interpreter
.
Parametry
modelFile | Plik z już wytrenowanym modelem TF Lite. |
---|
Rzuty
IllegalArgumentException | jeśli modelFile nie koduje prawidłowego modelu TensorFlow Lite.
|
---|
public Interpreter (plik modelu Plik, opcje Interpreter.Options)
Inicjuje obiekt Interpreter
i określa opcje dostosowywania działania tłumaczenia rozmowy.
Parametry
modelFile | plik z już wytrenowanym modelem 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 Interpreter (ByteBuffer byteBuffer)
Inicjuje obiekt Interpreter
z ByteBuffer
pliku modelu.
Po utworzeniu obiektu Interpreter
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.
Parametry
byteBuffer |
---|
Rzuty
IllegalArgumentException | , jeśli byteBuffer nie jest MappedByteBuffer ani bezpośrednim ByteBuffer elementem natywnym.
|
---|
public Interpreter (opcje ByteBuffer byteBuffer, Interpreter.Options)
Inicjuje obiekt Interpreter
z ByteBuffer
pliku modelu i zestawem niestandardowych elementów Interpreter.Options
.
ByteBuffer
nie należy modyfikować po utworzeniu Interpreter
. Element ByteBuffer
może być MappedByteBuffer
mapą pamięci na plik modelu lub bezpośrednim obiektem ByteBuffer
{8/}Order() zawierającym zawartość bajtów modelu.
Parametry
byteBuffer | |
---|---|
Opcje |
Rzuty
IllegalArgumentException | , jeśli byteBuffer nie jest MappedByteBuffer ani bezpośrednim ByteBuffer elementem natywnym.
|
---|
Metody publiczne
public 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.
public void close ()
Zwolnij zasoby powiązane z instancją InterpreterApi
.
public int getInputIndex (String opName)
Pobiera indeks danych wejściowych, podając nazwę operacji.
Parametry
opName |
---|
public Tensor getInputTensor (int inputIndex)
Pobiera Tensor powiązany z podanym indeksem danych wejściowych.
Parametry
inputIndex |
---|
public int getInputTensorCount ()
Pobiera liczbę tensorów wejściowych.
public Tensor getInputTensorFromSignature (String inputName, String signatureKey)
Pobiera Tensor powiązany z podaną nazwą wprowadzania 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 1 podpis. |
Rzuty
IllegalArgumentException | jeśli inputName lub signatureKey ma wartość null lub jest pusta albo podana nazwa jest nieprawidłowa.
|
---|
public int getOutputIndex (String opName)
Pobiera indeks danych wyjściowych na podstawie nazwy operacji.
Parametry
opName |
---|
public 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 |
---|
public int getOutputTensorCount ()
Pobiera liczbę wyjściowych Tensor.
public Tensor getOutputTensorFromSignature (StringoutputName, String signatureKey)
Pobiera Tensor powiązany z podaną nazwą wyjściową w określonej metodzie podpisu.
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.
OSTRZEŻENIE: to jest eksperymentalny interfejs API, który może ulec zmianie.
Parametry
outputName | Nazwa danych wyjściowych w podpisie. |
---|---|
signatureKey | Klucz podpisu identyfikujący obiekt SignatureDef może mieć wartość null, jeśli model ma 1 podpis. |
Rzuty
IllegalArgumentException | jeśli outputName lub signatureKey ma wartość null lub jest pusta albo podana nazwa jest nieprawidłowa.
|
---|
public String[] getSignatureInputs (String signatureKey)
Pobiera listę danych wejściowych SignatureDefs dla metody signatureKey
.
OSTRZEŻENIE: to jest eksperymentalny interfejs API, który może ulec zmianie.
Parametry
signatureKey |
---|
public String[] getSignatureKeys ()
Pobiera listę nazw wyeksportowanych metod SignatureDef dostępnych w modelu.
OSTRZEŻENIE: to jest eksperymentalny interfejs API, który 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, który może ulec zmianie.
Parametry
signatureKey |
---|
public void resetVariableTensors ()
Zaawansowane: resetuje wszystkie tensory zmiennych do wartości domyślnej.
Jeśli tensor zmiennej nie ma powiązanego bufora, zostanie zresetowany.
OSTRZEŻENIE: to jest eksperymentalny interfejs API, który może ulec zmianie.
public 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 |
public void resizeInput (int idx, int[] dims)
Zmienia rozmiar danych wejściowych idx modelu natywnego na dane przyciemnienia.
Parametry
idx | |
---|---|
dims |
public void run (Obiekt wejściowy, 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() |
public void runForMultipleInputsOutputs (Object[] wejściowe, Mapa<Liczba całkowita, Object> dane wyjściowe)
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() ). |
public void runSignature (Mapa<ciąg, obiekt> dane wejściowe, Mapa<Ciąg, Obiekt>)
Funkcja taka sama jak w przypadku runSignature(Map, Map, String)
, ale nie wymaga przekazywania klucza signatureKey, przy założeniu, że model ma jeden element SignatureDef. Jeśli model ma więcej niż 1 element SignatureDef, zgłosi wyjątek.
OSTRZEŻENIE: to jest eksperymentalny interfejs API, który może ulec zmianie.
Parametry
dane wejściowe | |
---|---|
dane wyjściowe |
public void runSignature (Mapa<ciąg, Object> dane wejściowe, Mapa<String, Object> dane wyjściowe, String signatureKey)
Uruchamia wnioskowanie na podstawie modelu na podstawie komponentu SignatureDef dostarczonego przez signatureKey
.
Więcej informacji o dozwolonych typach danych wejściowych i wyjściowych znajdziesz w sekcji run(Object, Object)
.
OSTRZEŻENIE: to jest eksperymentalny interfejs API, który może ulec zmianie.
Parametry
dane wejściowe | Mapuje nazwę danych wejściowych w SignatureDef na obiekt wejściowy. |
---|---|
dane wyjściowe | Mapa danych wyjściowych z nazwy wyjściowej w SignatureDef na dane wyjściowe. Pole może być puste, jeśli element wywołujący chce wysłać zapytanie do danych Tensor bezpośrednio po wnioskowaniu (np. jeśli kształt wyjściowy 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 pusta, jeśli outputs lub signatureKey ma wartość null albo jeśli podczas uruchamiania wnioskowania wystąpi błąd.
|
---|
public void setCancelled (boolean cancelled)
Zaawansowane: zakłóca wnioskowanie w trakcie połączenia z run(Object, Object)
.
W chwili wywołania tej funkcji flaga anulowania będzie miała wartość prawda. Interpreter sprawdza flagę między wywołaniami operacji. Jeśli jest to true
, interpreter zatrzyma wykonanie. Tłumacz pozostanie w stanie anulowania, dopóki setCancelled(false)
nie anuluje anulowania.
OSTRZEŻENIE: to jest eksperymentalny interfejs API, który może ulec zmianie.
Parametry
anulowano | true – anulowanie wnioskowania w miarę możliwości; false , aby wznowić. |
---|
Rzuty
IllegalStateException | jeśli interpreter nie został zainicjowany z opcją anulowania, która jest domyślnie wyłączona. |
---|