Sottoclassi indirette conosciute |
Interfaccia con l'interprete del modello TensorFlow Lite, esclusi i metodi sperimentali.
Un'istanza InterpreterApi
incapsula un modello TensorFlow Lite pre-addestrato, in cui le operazioni vengono eseguite per l'inferenza del modello.
Ad esempio, se un modello accetta un solo input e restituisce un solo output:
try (InterpreterApi interpreter =
new InterpreterApi.create(file_of_a_tensorflowlite_model)) {
interpreter.run(input, output);
}
Se un modello richiede più input o output:
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);
}
Se un modello prende o produce tensori di stringa:
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);
}
Tieni presente che esiste una distinzione tra forma [] e forma[1]. Per gli output del tensore di stringa scalare:
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);
Gli ordini di input e output vengono determinati durante la conversione del modello TensorFlow nel modello TensorFlowLite con Toco, così come le forme predefinite degli input.
Quando gli input vengono forniti come array (multidimensionali), i corrispondenti tensori di input verranno implicitamente ridimensionati in base alla forma di tale array. Quando gli input vengono forniti come tipi Buffer
, non viene eseguito alcun ridimensionamento implicito; il chiamante deve assicurarsi che la dimensione dei byte Buffer
corrisponda a quella del tensore corrispondente o che prima ridimensioni il tensore tramite resizeInput(int, int[])
. Le informazioni sulla forma e sul tipo del tensore possono essere ottenute tramite la classe Tensor
, disponibile tramite getInputTensor(int)
e getOutputTensor(int)
.
ATTENZIONE: le istanze InterpreterApi
non sono thread-safe.
ATTENZIONE: un'istanza InterpreterApi
possiede risorse che devono essere liberate esplicitamente invocando close()
La libreria TFLite è basata sull'API NDK 19. Potrebbe funzionare per i livelli API Android inferiori a 19, ma non è garantito.
Classi nidificate
classe | InterpreterApi.Options | Una classe di opzioni per controllare il comportamento dell'interprete runtime. |
Metodi pubblici
vuoto astratto | allocateTensors () Aggiorna esplicitamente le allocazioni per tutti i tensori, se necessario. |
vuoto astratto | vicino () Rilascia le risorse associate all'istanza InterpreterApi . |
InterpreterApi statica | crea (Opzioni file modelFile, InterpreterApi.Options ) Costruisce un'istanza InterpreterApi , utilizzando il modello e le opzioni specificati. |
InterpreterApi statica | crea (opzioni ByteBuffer byteBuffer, InterpreterApi.Options ) Costruisce un'istanza InterpreterApi , utilizzando il modello e le opzioni specificati. |
astratto int | |
Tensore astratto | getInputTensor (int inputIndex) Ottiene il tensore associato all'indice di input fornito. |
astratto int | getInputTensorCount () Ottiene il numero di tensori di input. |
astratto lungo | getLastNativeInferenceDurationNanoseconds () Restituisce i tempi di inferenza nativi. |
astratto int | getOutputIndex ( String opName) Ottiene l'indice di un output in base al nome operativo dell'output. |
Tensore astratto | getOutputTensor (int outputIndex) Ottiene il tensore associato all'indice di output fornito. |
astratto int | getOutputTensorCount () Ottiene il numero di tensori di output. |
vuoto astratto | resizeInput (int idx, int[] dims, booleano rigoroso) Ridimensiona l'idx-esimo input del modello nativo alle dimensioni specificate. |
vuoto astratto | resizeInput (int idx, int[] dims) Ridimensiona l'idx-esimo input del modello nativo alle dimensioni specificate. |
vuoto astratto | |
vuoto astratto | runForMultipleInputsOutputs (ingressi Object[] , output Map < Integer , Object >) Esegue l'inferenza del modello se il modello accetta più input o restituisce più output. |
Metodi ereditati
Metodi pubblici
public abstract void allocateTensors ()
Aggiorna esplicitamente le allocazioni per tutti i tensori, se necessario.
Ciò propagherà le forme e le allocazioni di memoria per i tensori dipendenti utilizzando le forme del tensore di input come fornite.
Nota: questa chiamata è *puramente facoltativa*. L'allocazione del tensore avverrà automaticamente durante l'esecuzione se eventuali tensori di input sono stati ridimensionati. Questa chiamata è molto utile per determinare le forme di qualsiasi tensore di output prima di eseguire il grafico, ad esempio
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...
Nota: alcuni grafici hanno output con forma dinamica, nel qual caso la forma dell'output potrebbe non propagarsi completamente finché non viene eseguita l'inferenza.
Lancia
IllegalStateException | se i tensori del grafico non possono essere allocati con successo. |
---|
pubblico astratto vuoto chiudi ()
Rilascia le risorse associate all'istanza InterpreterApi
.
creazione InterpreterApi statica pubblica ( file modelFile, opzioni InterpreterApi.Options )
Costruisce un'istanza InterpreterApi
, utilizzando il modello e le opzioni specificati. Il modello verrà caricato da un file.
Parametri
modelFile | Un file contenente un modello TF Lite pre-addestrato. |
---|---|
opzioni | Una serie di opzioni per personalizzare il comportamento dell'interprete. |
Lancia
IllegalArgumentException | se modelFile non codifica un modello TensorFlow Lite valido. |
---|
creazione InterpreterApi statica pubblica (opzioni ByteBuffer byteBuffer, InterpreterApi.Options )
Costruisce un'istanza InterpreterApi
, utilizzando il modello e le opzioni specificati. Il modello verrà letto da un ByteBuffer
.
Parametri
byteBuffer | Un modello TF Lite pre-addestrato, in formato serializzato binario. Il ByteBuffer non deve essere modificato dopo la costruzione di un'istanza InterpreterApi . Il ByteBuffer può essere un MappedByteBuffer che mappa in memoria un file di modello o un ByteBuffer diretto di nativeOrder() che contiene il contenuto in byte di un modello. |
---|---|
opzioni | Una serie di opzioni per personalizzare il comportamento dell'interprete. |
Lancia
IllegalArgumentException | se byteBuffer non è un MappedByteBuffer né un ByteBuffer diretto di nativeOrder. |
---|
public abstract int getInputIndex ( String opName)
Ottiene l'indice di un input in base al nome operativo dell'input.
Parametri
opNome |
---|
Lancia
IllegalArgumentException | se opName non corrisponde ad alcun input nel modello utilizzato per inizializzare l'interprete. |
---|
Tensore astratto pubblico getInputTensor (int inputIndex)
Ottiene il tensore associato all'indice di input fornito.
Parametri
inputIndex |
---|
Lancia
IllegalArgumentException | se inputIndex è negativo o non è inferiore al numero di input del modello. |
---|
public abstract int getInputTensorCount ()
Ottiene il numero di tensori di input.
public abstract Long getLastNativeInferenceDurationNanoseconds ()
Restituisce i tempi di inferenza nativi.
Lancia
IllegalArgumentException | se il modello non è inizializzato dall'interprete. |
---|
public abstract int getOutputIndex ( String opName)
Ottiene l'indice di un output in base al nome operativo dell'output.
Parametri
opNome |
---|
Lancia
IllegalArgumentException | se opName non corrisponde ad alcun output nel modello utilizzato per inizializzare l'interprete. |
---|
Tensore astratto pubblico getOutputTensor (int outputIndex)
Ottiene il tensore associato all'indice di output fornito.
Nota: i dettagli del tensore di output (ad esempio, la forma) potrebbero non essere completamente popolati finché non viene eseguita l'inferenza. Se sono necessari dettagli aggiornati *prima* di eseguire l'inferenza (ad esempio, dopo aver ridimensionato un tensore di input, che potrebbe invalidare le forme del tensore di output), utilizzare allocateTensors()
per attivare esplicitamente l'allocazione e la propagazione della forma. Si noti che, per i grafici con forme di output che dipendono dai *valori* di input, la forma di output potrebbe non essere completamente determinata fino all'esecuzione dell'inferenza.
Parametri
outputIndice |
---|
Lancia
IllegalArgumentException | se outputIndex è negativo o non è inferiore al numero di output del modello. |
---|
public abstract int getOutputTensorCount ()
Ottiene il numero di tensori di output.
public abstract void resizeInput (int idx, int[] dims, boolean strict)
Ridimensiona l'idx-esimo input del modello nativo alle dimensioni specificate.
Quando "strict" è True, è possibile ridimensionare solo le dimensioni sconosciute. Le dimensioni sconosciute sono indicate come "-1" nell'array restituito da "Tensor.shapeSignature()".
Parametri
idx | |
---|---|
si attenua | |
rigoroso |
Lancia
IllegalArgumentException | se idx è negativo o non è inferiore al numero di input del modello; o se si verifica un errore durante il ridimensionamento dell'input idx-esimo. Inoltre, l'errore si verifica quando si tenta di ridimensionare un tensore con dimensioni fisse quando `strict` è True. |
---|
public abstract void resizeInput (int idx, int[] dims)
Ridimensiona l'idx-esimo input del modello nativo alle dimensioni specificate.
Parametri
idx | |
---|---|
si attenua |
Lancia
IllegalArgumentException | se idx è negativo o non è inferiore al numero di input del modello; o se si verifica un errore durante il ridimensionamento dell'input idx-esimo. |
---|
public abstract void run (input oggetto , output oggetto )
Esegue l'inferenza del modello se il modello accetta un solo input e fornisce un solo output.
Avvertenza: l'API è più efficiente se viene utilizzato un Buffer
(preferibilmente diretto, ma non obbligatorio) come tipo di dati di input/output. Considera l'utilizzo Buffer
per alimentare e recuperare dati primitivi per prestazioni migliori. Sono supportati i seguenti tipi Buffer
concreti:
-
ByteBuffer
: compatibile con qualsiasi tipo di tensore primitivo sottostante. -
FloatBuffer
: compatibile con tensori float. -
IntBuffer
: compatibile con i tensori int32. -
LongBuffer
: compatibile con i tensori int64.
Buffer
o come input scalari. Parametri
ingresso | un array o un array multidimensionale oppure un Buffer di tipi primitivi tra cui int, float, long e byte. Buffer è il modo preferito per passare dati di input di grandi dimensioni per i tipi primitivi, mentre i tipi di stringa richiedono l'utilizzo del percorso di input dell'array (multidimensionale). Quando viene utilizzato un Buffer , il suo contenuto dovrebbe rimanere invariato finché non viene eseguita l'inferenza del modello e il chiamante deve assicurarsi che il Buffer si trovi nella posizione di lettura appropriata. Un valore null è consentito solo se il chiamante utilizza un Delegate che consente l'interoperabilità della gestione del buffer e tale buffer è stato associato all'input Tensor . |
---|---|
produzione | un array multidimensionale di dati di output o un Buffer di tipi primitivi tra cui int, float, long e byte. Quando viene utilizzato un Buffer , il chiamante deve assicurarsi che sia impostata la posizione di scrittura appropriata. È consentito un valore nullo, utile in alcuni casi, ad esempio se il chiamante utilizza un Delegate che consente l'interoperabilità della gestione del buffer e tale buffer è stato associato al Tensor di output (vedere anche Interpreter.Options#setAllowBufferHandleOutput(boolean) ), o se il grafico ha output con forma dinamica e il chiamante deve interrogare la forma Tensor output dopo che è stata invocata l'inferenza, recuperando i dati direttamente dal tensore di output (tramite Tensor.asReadOnlyBuffer() ). |
Lancia
IllegalArgumentException | se input è nullo o vuoto oppure se si verifica un errore durante l'esecuzione dell'inferenza. |
---|---|
IllegalArgumentException | (SPERIMENTALE, soggetto a modifiche) se l'inferenza viene interrotta da setCancelled(true) . |
public abstract void runForMultipleInputsOutputs ( input Object[] , Map < Integer , Object > output)
Esegue l'inferenza del modello se il modello accetta più input o restituisce più output.
Avvertenza: l'API è più efficiente se i Buffer
(preferibilmente diretti, ma non obbligatori) vengono utilizzati come tipi di dati di input/output. Considera l'utilizzo Buffer
per alimentare e recuperare dati primitivi per prestazioni migliori. Sono supportati i seguenti tipi Buffer
concreti:
-
ByteBuffer
: compatibile con qualsiasi tipo di tensore primitivo sottostante. -
FloatBuffer
: compatibile con tensori float. -
IntBuffer
: compatibile con i tensori int32. -
LongBuffer
: compatibile con i tensori int64.
Buffer
o come input scalari. Nota: valori null
per singoli elementi di inputs
e outputs
sono consentiti solo se il chiamante utilizza un Delegate
che consente l'interoperabilità della gestione del buffer e tale buffer è stato associato ai corrispondenti Tensor
di input o output.
Parametri
input | una matrice di dati di input. Gli input dovrebbero essere nello stesso ordine degli input del modello. Ogni input può essere un array o un array multidimensionale oppure un Buffer di tipi primitivi tra cui int, float, long e byte. Buffer è il modo preferito per passare dati di input di grandi dimensioni, mentre i tipi di stringa richiedono l'utilizzo del percorso di input dell'array (multidimensionale). Quando viene utilizzato Buffer , il suo contenuto dovrebbe rimanere invariato finché non viene eseguita l'inferenza del modello e il chiamante deve assicurarsi che il Buffer si trovi nella posizione di lettura appropriata. |
---|---|
uscite | una mappa che mappa gli indici di output su array multidimensionali di dati di output o Buffer di tipi primitivi tra cui int, float, long e byte. È sufficiente conservare le voci relative agli output da utilizzare. Quando viene utilizzato un Buffer , il chiamante deve assicurarsi che sia impostata la posizione di scrittura appropriata. La mappa può essere vuota nei casi in cui vengono utilizzati gli handle del buffer per i dati del tensore di output o nei casi in cui gli output hanno una forma dinamica e il chiamante deve interrogare la forma Tensor di output dopo che è stata invocata l'inferenza, recuperando i dati direttamente dal tensore di output ( tramite Tensor.asReadOnlyBuffer() ). |
Lancia
IllegalArgumentException | se inputs è nullo o vuoto, se outputs è nullo o se si verifica un errore durante l'esecuzione dell'inferenza. |
---|