Interpreter

publiczna klasa końcowego Interpreter

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 modelFile)
Inicjuje obiekt Interpreter.
Interpreter(plik modelu Plik, opcje Interpreter.Options)
Inicjuje obiekt Interpreter i określa opcje dostosowywania działania tłumaczenia rozmowy.
Interpreter(ByteBuffer byteBuffer)
Inicjuje obiekt Interpreter z ByteBuffer pliku modelu.
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
getInputIndex(String opName)
Pobiera indeks danych wejściowych, podając nazwę operacji.
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
getOutputIndex(ciąg znaków opName)
Pobiera indeks danych wyjściowych na podstawie nazwy operacji.
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
run(dane wejściowe obiektu, dane wyjściowe obiektu)
Uruchamia wnioskowanie na podstawie modelu, jeśli model przyjmuje tylko 1 dane wejściowe i udostępnia tylko 1 wynik.
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ówObject> dane wejściowe, Mapa<StringObject> 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
runSignature(Map<ciągObject> dane wejściowe, Mapa<StringObject> dane wyjściowe, StringSignatureKey)
Uruchamia wnioskowanie na podstawie modelu na podstawie komponentu SignatureDef dostarczonego przez signatureKey.
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ć MappedByteBuffermapą 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 Long getLastNativeInferenceDurationNanoseconds ()

Zwraca natywny czas wnioskowania.

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.
Pamiętaj, że typy wartości logicznych są obsługiwane tylko jako tablice, nie 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łkowitaObject> 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.
Pamiętaj, że typy wartości logicznych są obsługiwane tylko jako tablice, nie 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ągobiekt> dane wejściowe, Mapa<CiągObiekt>)

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ągObject> dane wejściowe, Mapa<StringObject> 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.