Interpreter

publiczne zajęcia końcowe Tłumaczenie rozmowy

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 języka(Plik modelu)
Inicjuje interfejs Interpreter.
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
run(Dane wejściowe Object, 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.
nieważne
runForMultipleInputsOutputs(dane wejściowe Object[], dane wyjściowe Map <Liczba całkowitaObiekt>)
Uruchamia wnioskowanie przez model, jeśli model przyjmuje wiele danych wejściowych, lub zwraca wiele danych wyjściowych.
nieważne
runSignature(Map<CiągObject> dane wejściowe, Mapa <CiągObiekt>)
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
runSignature(Map<CiągObject> dane wejściowe, Mapa<CiągObiekt>, String signatureKey)
Uruchamia wnioskowanie modelu na podstawie protokołu SignatureDef dostarczonego w usłudze signatureKey.
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 Długi getLastNativeInferenceDurationNanoseconds ()

Zwraca czas wnioskowania natywnego.

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.
. Pamiętaj, że wartości logiczne są obsługiwane tylko jako tablice, a nie jako wartości 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łkowitejobiekt>)

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.
. Pamiętaj, że wartości logiczne są obsługiwane tylko jako tablice, a nie jako wartości 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<StringObject> (dane wejściowe), Map<StringObject> (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ągObiekt>, dane wejściowe Map<CiągObiekt>, 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.