InterpreterApi

Public Interface InterpreterApi
Bekannte indirekte Unterklassen

Schnittstelle zum TensorFlow Lite-Modellinterpreter, ausgenommen experimentelle Methoden.

Eine InterpreterApi-Instanz kapselt ein vortrainiertes TensorFlow Lite-Modell ein, in dem Vorgänge zur Modellinferenz ausgeführt werden.

Wenn ein Modell beispielsweise nur eine Eingabe annimmt und nur eine Ausgabe zurückgibt:

try (InterpreterApi interpreter =
     new InterpreterApi.create(file_of_a_tensorflowlite_model)) {
   interpreter.run(input, output);
 }
 

Wenn ein Modell mehrere Ein- oder Ausgaben annimmt:

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 (InterpreterApi interpreter =
     new InterpreterApi.create(file_of_a_tensorflowlite_model)) {
   interpreter.runForMultipleInputsOutputs(inputs, map_of_indices_to_outputs);
 }
 

Wenn ein Modell Stringtensoren annimmt oder erzeugt:

String[] input = {"foo", "bar"};  // Input tensor shape is [2].
 String[][] output = new String[3][2];  // Output tensor shape is [3, 2].
 try (InterpreterApi interpreter =
     new InterpreterApi.create(file_of_a_tensorflowlite_model)) {
   interpreter.runForMultipleInputsOutputs(input, output);
 }
 

Beachten Sie, dass es einen Unterschied zwischen Form [] und Form [1] gibt. Für skalare String-Tensor-Ausgaben:

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);
 

Die Reihenfolge der Eingaben und Ausgaben wird bestimmt, wenn das TensorFlow-Modell mit Toco in ein TensorFlowLite-Modell konvertiert wird, ebenso wie die Standardformen der Eingaben.

Wenn Eingaben als (mehrdimensionale) Arrays bereitgestellt werden, wird die Größe der entsprechenden Eingabetensor(en) implizit entsprechend der Form dieses Arrays angepasst. Wenn Eingaben als Buffer-Typen bereitgestellt werden, erfolgt keine implizite Größenanpassung. Der Aufrufer muss dafür sorgen, dass die Bytegröße Buffer entweder mit der Größe des entsprechenden Tensors übereinstimmt oder dass die Größe des Tensors zuerst über resizeInput(int, int[]) skaliert wird. Informationen zu Tensorform und -typ können über die Klasse Tensor abgerufen werden, die über getInputTensor(int) und getOutputTensor(int) verfügbar ist.

WARNUNG:InterpreterApi-Instanzen sind nicht Thread-sicher.

WARNUNG: Eine InterpreterApi-Instanz besitzt Ressourcen, die durch Aufrufen von close() explizit freigegeben werden müssen.

Die TFLite-Bibliothek basiert auf NDK API 19. Sie kann auch bei Android-API-Levels unter 19 funktionieren, ist jedoch nicht garantiert.

Verschachtelte Klassen

Klasse InterpreterApi.Options Eine Optionsklasse zur Steuerung des Verhaltens des Laufzeitinterpreters. 

Public Methods

Abstrakt void
allocateTensors() zu
Aktualisiert bei Bedarf explizit Zuweisungen für alle Tensoren.
Abstrakt void
close()
Geben Sie Ressourcen frei, die mit der Instanz InterpreterApi verknüpft sind.
static InterpreterApi
create(File modelFile, InterpreterApi.Options-Optionen)
Erstellt eine InterpreterApi-Instanz mit dem angegebenen Modell und den Optionen.
static InterpreterApi
create(ByteBuffer byteBuffer, InterpreterApi.Options-Optionen)
Erstellt eine InterpreterApi-Instanz mit dem angegebenen Modell und den Optionen.
Abstrakt Int
getInputIndex(String opName)
Ruft den Index einer Eingabe anhand des Vorgangsnamens der Eingabe ab.
Abstrakt Tensor
getInputTensor(int inputIndex)
Ruft den Tensor ab, der dem bereitgestellten Eingabeindex zugeordnet ist.
Abstrakt Int
getInputTensorCount()
Ruft die Anzahl der Eingabetensoren ab.
Abstrakt Lang
getLastNativeInferenceDurationNanoseconds()
Gibt das Timing der nativen Inferenz zurück.
Abstrakt Int
getOutputIndex(String opName)
Ruft den Index einer Ausgabe anhand des Vorgangsnamens der Ausgabe ab.
Abstrakt Tensor
getOutputTensor(int outputIndex)
Ruft den Tensor ab, der dem bereitgestellten Ausgabeindex zugeordnet ist.
Abstrakt Int
getOutputTensorCount()
Ruft die Anzahl der Ausgabe-Tensoren ab.
Abstrakt void
resizeInput(int idx, int[] dims, boolean strict)
Passt die Größe der idx-ten Eingabe des nativen Modells an die angegebenen Dimmungen an.
Abstrakt void
resizeInput(int idx, int[] dimm)
Passt die Größe der idx-ten Eingabe des nativen Modells an die angegebenen Dimmungen an.
Abstrakt void
run(Objekt-Eingabe, Objekt-Ausgabe)
Führt eine Modellinferenz aus, wenn das Modell nur eine Eingabe annimmt und nur eine Ausgabe liefert.
Abstrakt void
runForMultipleInputsOutputs(Object[]-Eingaben, Map<IntegerObject>-Ausgaben)
Führt eine Modellinferenz aus, wenn das Modell mehrere Eingaben annimmt oder mehrere Ausgaben zurückgibt.

Übernommene Methoden

Public Methods

public abstrakt void allocateTensors ()

Aktualisiert bei Bedarf explizit Zuweisungen für alle Tensoren.

Dadurch werden Formen und Speicherzuweisungen für abhängige Tensoren mithilfe der angegebenen Eingabetensor-Formen weitergegeben.

Hinweis: Dieser Aufruf ist *rein optional*. Die Tensorzuordnung erfolgt automatisch während der Ausführung, wenn die Größe von Eingabetensoren geändert wurde. Dieser Aufruf ist am nützlichsten, um die Formen für alle Ausgabetensoren zu bestimmen, bevor der Graph ausgeführt wird. Beispiel:

 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...

Hinweis: Einige Diagramme haben dynamisch geformte Ausgaben. In diesem Fall wird die Ausgabeform erst vollständig übernommen, wenn die Inferenz ausgeführt wurde.

Löst aus
IllegalStateException wenn die Tensoren des Graphen nicht erfolgreich zugeordnet werden konnten.

public abstrakt void close ()

Geben Sie Ressourcen frei, die mit der Instanz InterpreterApi verknüpft sind.

public static InterpreterApi create (Datei modelFile, InterpreterApi.Options-Optionen)

Erstellt eine InterpreterApi-Instanz mit dem angegebenen Modell und den Optionen. Das Modell wird aus einer Datei geladen.

Parameter
modelFile Eine Datei mit einem vortrainierten TF Lite-Modell.
Optionen Eine Reihe von Optionen zum Anpassen des Verhaltens des Interpreters.
Löst aus
IllegalArgumentException modelFile codiert kein gültiges TensorFlow Lite-Modell.

public static InterpreterApi create (ByteBuffer byteBuffer, InterpreterApi.Options-Optionen)

Erstellt eine InterpreterApi-Instanz mit dem angegebenen Modell und den Optionen. Das Modell wird aus einem ByteBuffer gelesen.

Parameter
byteBuffer Ein vortrainiertes TF Lite-Modell in binärer serieller Form. ByteBuffer sollte nach dem Erstellen einer InterpreterApi-Instanz nicht mehr geändert werden. Die ByteBuffer kann entweder eine MappedByteBuffer sein, die eine Modelldatei zuordnet, oder ein direkter ByteBuffer von nativeOrder(), der den Byteinhalt eines Modells enthält.
Optionen Eine Reihe von Optionen zum Anpassen des Verhaltens des Interpreters.
Löst aus
IllegalArgumentException wenn byteBuffer weder ein MappedByteBuffer noch ein direktes ByteBuffer von nativeOrder ist.

public abstrakt int getInputIndex (String opName)

Ruft den Index einer Eingabe anhand des Vorgangsnamens der Eingabe ab.

Parameter
opName
Löst aus
IllegalArgumentException opName stimmt mit keiner Eingabe im Modell überein, das zum Initialisieren des Interpreters verwendet wurde.

public abstrakt Tensor getInputTensor (int inputIndex)

Ruft den Tensor ab, der dem bereitgestellten Eingabeindex zugeordnet ist.

Parameter
inputIndex
Löst aus
IllegalArgumentException wenn inputIndex negativ oder nicht kleiner als die Anzahl der Modelleingaben ist.

public abstrakt int getInputTensorCount ()

Ruft die Anzahl der Eingabetensoren ab.

public abstrakt Lang getLastNativeInferenceDurationNanoseconds ()

Gibt das Timing der nativen Inferenz zurück.

Löst aus
IllegalArgumentException Das Modell wurde nicht vom Interpreter initialisiert.

public abstrakt int getOutputIndex (String opName)

Ruft den Index einer Ausgabe anhand des Vorgangsnamens der Ausgabe ab.

Parameter
opName
Löst aus
IllegalArgumentException opName stimmt mit keiner Ausgabe im Modell überein, das zum Initialisieren des Interpreters verwendet wurde.

public abstrakt Tensor getOutputTensor (intoutputIndex)

Ruft den Tensor ab, der dem bereitgestellten Ausgabeindex zugeordnet ist.

Hinweis: Die Ausgabetensordetails (z.B. die Form) werden möglicherweise erst nach der Ausführung der Inferenz vollständig ausgefüllt. Wenn Sie die Details aktualisieren müssen, *bevor* Sie die Inferenz ausführen (z.B. nach der Größenänderung eines Eingabetensors, der die Form des Ausgabetensors ungültig machen kann), verwenden Sie allocateTensors(), um die Zuweisung und Formweitergabe explizit auszulösen. Bei Grafiken mit Ausgabeformen, die von *Eingabewerten* abhängig sind, kann die Ausgabeform erst nach der Ausführung der Inferenz vollständig bestimmt werden.

Parameter
outputIndex
Löst aus
IllegalArgumentException Wenn outputIndex negativ oder nicht kleiner als die Anzahl der Modellausgaben ist.

public abstrakt int getOutputTensorCount ()

Ruft die Anzahl der Ausgabe-Tensoren ab.

public abstract void resizeInput (int idx, int[] dims, boolean strict)

Passt die Größe der idx-ten Eingabe des nativen Modells an die angegebenen Dimmungen an.

Wenn „strict“ auf „True“ gesetzt ist, kann die Größe nur unbekannter Abmessungen geändert werden. Unbekannte Dimensionen werden im von „Tensor.shapeSignature()“ zurückgegebenen Array mit „-1“ angegeben.

Parameter
idx
dims
Strikt
Löst aus
IllegalArgumentException idx ist negativ oder nicht kleiner als die Anzahl der Modelleingaben; oder wenn beim Ändern der Größe der idx-ten Eingabe ein Fehler auftritt. Außerdem tritt der Fehler auf, wenn versucht wird, die Größe eines Tensors mit festen Abmessungen anzupassen, wenn „strict“ auf „True“ gesetzt ist.

public abstrakt void resizeInput (int idx, int[] dims)

Passt die Größe der idx-ten Eingabe des nativen Modells an die angegebenen Dimmungen an.

Parameter
idx
dims
Löst aus
IllegalArgumentException idx ist negativ oder nicht kleiner als die Anzahl der Modelleingaben; oder wenn beim Ändern der Größe der idx-ten Eingabe ein Fehler auftritt.

public abstrakt void run (Objekt-Eingabe, Objekt--Ausgabe)

Führt eine Modellinferenz aus, wenn das Modell nur eine Eingabe annimmt und nur eine Ausgabe liefert.

Warnung: Die API ist effizienter, wenn als Eingabe-/Ausgabedatentyp Buffer verwendet wird (am besten direkt, aber nicht erforderlich). Sie sollten Buffer verwenden, um primitive Daten zu erfassen und abzurufen und so eine bessere Leistung zu erzielen. Die folgenden konkreten Buffer-Typen werden unterstützt:

  • ByteBuffer – kompatibel mit allen zugrunde liegenden primitiven Tensortypen
  • FloatBuffer – kompatibel mit Float-Tensoren.
  • IntBuffer – kompatibel mit int32-Tensoren
  • LongBuffer – kompatibel mit int64-Tensoren.
Boolesche Typen werden nur als Arrays, nicht als Buffers oder als skalare Eingaben unterstützt.

Parameter
Eingabe Ein Array oder ein mehrdimensionales Array oder ein Buffer mit primitiven Typen wie „int“, „Gleitkommazahl“, „long“ und „byte“. Buffer ist die bevorzugte Methode zum Übergeben großer Eingabedaten für primitive Typen, während für Stringtypen der (mehrdimensionale) Array-Eingabepfad verwendet werden muss. Wenn ein Buffer verwendet wird, sollte sein Inhalt unverändert bleiben, bis die Modellinferenz abgeschlossen ist. Der Aufrufer muss dann dafür sorgen, dass sich Buffer an der entsprechenden Leseposition befindet. Ein null-Wert ist nur zulässig, wenn der Aufrufer eine Delegate verwendet, die Interoperabilität mit Zwischenspeichern zulässt und ein solcher Zwischenspeicher an die Eingabe-Tensor gebunden wurde.
output Ein mehrdimensionales Array von Ausgabedaten oder eine Buffer mit primitiven Typen wie „int“, „Gleitkommazahl“, „long“ und „byte“. Wenn ein Buffer verwendet wird, muss der Aufrufer dafür sorgen, dass die entsprechende Schreibposition festgelegt ist. Ein Nullwert ist zulässig und ist in bestimmten Fällen nützlich, z. B. wenn der Aufrufer einen Delegate verwendet, der die Zwischenspeicher-Handle-Interop zulässt, und ein solcher Zwischenspeicher an die Ausgabe-Tensor gebunden wurde (siehe auch Interpreter.Options#setAllowBufferHandleOutput(boolean)). Oder wenn der Graph über die dynamisch geformten Ausgaben dynamisch geformt ist und der Aufrufer die Ausgabe-Tensor-Form nach der Ausgabe-Inferenz aufgerufen hat und der Aufrufer die Ausgabe-Tensor-Form direkt nach der Ausgabe-Inferenz abfragen muss.Tensor.asReadOnlyBuffer()
Löst aus
IllegalArgumentException Wenn input null oder leer ist oder wenn beim Ausführen einer Inferenz ein Fehler auftritt.
IllegalArgumentException (EXPERIMENTELL, kann sich ändern), wenn die Inferenz durch setCancelled(true) unterbrochen wird.

public abstrakt void runForMultipleInputsOutputs (Object[]-Eingaben, Map<IntegerObjekt>-Ausgaben)

Führt eine Modellinferenz aus, wenn das Modell mehrere Eingaben annimmt oder mehrere Ausgaben zurückgibt.

Warnung: Die API ist effizienter, wenn als Eingabe-/Ausgabedatentypen Buffers verwendet werden (am besten direkt, aber nicht erforderlich). Sie sollten Buffer verwenden, um primitive Daten zu erfassen und abzurufen und so eine bessere Leistung zu erzielen. Die folgenden konkreten Buffer-Typen werden unterstützt:

  • ByteBuffer – kompatibel mit allen zugrunde liegenden primitiven Tensortypen
  • FloatBuffer – kompatibel mit Float-Tensoren.
  • IntBuffer – kompatibel mit int32-Tensoren
  • LongBuffer – kompatibel mit int64-Tensoren.
Boolesche Typen werden nur als Arrays, nicht als Buffers oder als skalare Eingaben unterstützt.

Hinweis: null-Werte für einzelne Elemente von inputs und outputs sind nur zulässig, wenn der Aufrufer einen Delegate verwendet, der Interoperabilität mit Zwischenspeichern zulässt, und ein solcher Zwischenspeicher an die entsprechenden Eingabe- oder Ausgabe-Tensors gebunden wurde.

Parameter
Eingaben ein Array von Eingabedaten. Die Eingaben sollten in derselben Reihenfolge wie die Eingaben des Modells sein. Jede Eingabe kann ein Array oder ein mehrdimensionales Array oder ein Buffer mit primitiven Typen wie „int“, „Gleitkommazahl“, „long“ und „byte“ sein. Buffer ist die bevorzugte Methode zum Übergeben großer Eingabedaten, während für Stringtypen der (mehrdimensionale) Array-Eingabepfad verwendet werden muss. Wenn Buffer verwendet wird, sollte sein Inhalt unverändert bleiben, bis die Modellinferenz abgeschlossen ist. Der Aufrufer muss dann dafür sorgen, dass sich Buffer an der entsprechenden Leseposition befindet.
Ausgaben Eine Karte, die Ausgabeindexe mehrdimensionalen Arrays von Ausgabedaten oder Buffers primitiver Typen wie „int“, „Gleitkommazahl“, „long“ und „byte“ zuordnet. Es müssen nur Einträge gespeichert werden, damit die Ausgaben verwendet werden können. Wenn ein Buffer verwendet wird, muss der Aufrufer dafür sorgen, dass die entsprechende Schreibposition festgelegt ist. Die Karte kann leer sein, wenn entweder Puffer-Handles für Ausgabetensordaten verwendet werden oder in denen die Ausgaben dynamisch geformt werden und der Aufrufer die Ausgabeform Tensor nach dem Aufrufen der Inferenz abfragen muss, um die Daten direkt vom Ausgabetensor (über Tensor.asReadOnlyBuffer()) abzurufen.
Löst aus
IllegalArgumentException Wenn inputs null oder leer ist, wenn outputs null ist oder wenn beim Ausführen einer Inferenz ein Fehler auftritt.