Sottoclassi indirette conosciute |
Interfaccia all'interprete del modello TensorFlow Lite, esclusi i metodi sperimentali.
Un'istanza di 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 solo un input e restituisce un solo output:
try (InterpreterApi interpreter =
new InterpreterApi.create(file_of_a_tensorflowlite_model)) {
interpreter.run(input, output);
}
Se un modello accetta 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 accetta 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);
}
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 tensori di input corrispondenti verranno ridimensionati in modo implicito in base alla forma dell'array. Quando gli input vengono forniti come tipi di Buffer
, non viene eseguito alcun ridimensionamento implicito; il chiamante deve assicurarsi che la dimensione del 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)
.
AVVISO: le istanze di InterpreterApi
non sono thread-safe.
ATTENZIONE: un'istanza di InterpreterApi
possiede risorse che devono essere liberate esplicitamente invocando close()
La libreria TFLite è basata sull'API NDK 19. Potrebbe funzionare per livelli API Android inferiori a 19, ma non è garantita.
Classi nidificate
classe | InterpreteApi.Options | Una classe di opzioni per controllare il comportamento dell'interprete di runtime. |
Metodi pubblici
vuoto astratto | allocateTensors () Aggiorna esplicitamente le allocazioni per tutti i tensori, se necessario. |
vuoto astratto | chiudi () Rilascia le risorse associate all'istanza di InterpreterApi . |
interprete staticoApi | creare ( file modelloFile, opzioni InterpreterApi.Options ) Costruisce un'istanza di InterpreterApi , usando il modello e le opzioni specificati. |
interprete staticoApi | create ( ByteBuffer byteBuffer, opzioni InterpreterApi.Options ) Costruisce un'istanza di InterpreterApi , usando il modello e le opzioni specificati. |
astratto int | |
Tensore astratto | getInputTensor (int inputIndex) Ottiene il Tensor associato all'indice di input fornito. |
astratto int | getInputTensorCount () Ottiene il numero di tensori di input. |
astratto Lungo | getLastNativeInferenceDurationNanoseconds () Restituisce la temporizzazione dell'inferenza nativa. |
astratto int | |
Tensore astratto | getOutputTensor (int outputIndex) Ottiene il Tensor associato all'indice di output fornito. |
astratto int | getOutputTensorCount () Ottiene il numero di tensori di output. |
vuoto astratto | resizeInput (int idx, int[] dims, boolean strict) Ridimensiona l'input idx-esimo del modello nativo alle dim date. |
vuoto astratto | resizeInput (int idx, int[] dim) Ridimensiona l'input idx-esimo del modello nativo alle dim date. |
vuoto astratto | |
vuoto astratto | runForMultipleInputsOutputs ( Object[] input, Map < Integer , Object > output) 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 indicato.
Nota: questa chiamata è *puramente facoltativa*. L'allocazione del tensore avverrà automaticamente durante l'esecuzione se i 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 di forma dinamica, nel qual caso la forma di output potrebbe non propagarsi completamente finché non viene eseguita l'inferenza.
Tiri
IllegalStateException | se non è stato possibile allocare correttamente i tensori del grafico. |
---|
public abstract vuoto chiudi ()
Rilascia le risorse associate all'istanza di InterpreterApi
.
public static InterpreterApi create ( file modelFile, InterpreterApi.Options options)
Costruisce un'istanza di InterpreterApi
, usando il modello e le opzioni specificati. Il modello verrà caricato da un file.
Parametri
modelloFile | Un file contenente un modello TF Lite pre-addestrato. |
---|---|
opzioni | Un insieme di opzioni per personalizzare il comportamento dell'interprete. |
Tiri
IllegalArgumentException | se modelFile non codifica un modello TensorFlow Lite valido. |
---|
public static InterpreterApi create ( ByteBuffer byteBuffer, InterpreterApi.Options options)
Costruisce un'istanza di InterpreterApi
, usando il modello e le opzioni specificati. Il modello verrà letto da un ByteBuffer
.
Parametri
byteBuffer | Un modello TF Lite pre-addestrato, in forma binaria serializzata. Il ByteBuffer non deve essere modificato dopo la costruzione di un'istanza di 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 di byte di un modello. |
---|---|
opzioni | Un insieme di opzioni per personalizzare il comportamento dell'interprete. |
Tiri
IllegalArgumentException | se byteBuffer non è un MappedByteBuffer né un ByteBuffer diretto di nativeOrder. |
---|
public abstract int getInputIndex ( String opName)
Ottiene l'indice di un input dato il nome operativo dell'input.
Parametri
opName |
---|
Tiri
IllegalArgumentException | se opName non corrisponde ad alcun input nel modello utilizzato per inizializzare l'interprete. |
---|
public abstract Tensor getInputTensor (int inputIndex)
Ottiene il Tensor associato all'indice di input fornito.
Parametri
inputIndex |
---|
Tiri
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 la temporizzazione dell'inferenza nativa.
Tiri
IllegalArgumentException | se il modello non è inizializzato dall'interprete. |
---|
public abstract int getOutputIndex ( String opName)
Ottiene l'indice di un output dato il nome operativo dell'output.
Parametri
opName |
---|
Tiri
IllegalArgumentException | se opName non corrisponde ad alcun output nel modello utilizzato per inizializzare l'interprete. |
---|
public abstract Tensor getOutputTensor (int outputIndex)
Ottiene il Tensor associato all'indice di output fornito.
Nota: i dettagli del tensore di output (ad esempio, la forma) potrebbero non essere completamente popolati fino a dopo l'esecuzione dell'inferenza. Se hai bisogno di 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), usa 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
outputIndex |
---|
Tiri
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'input idx-esimo del modello nativo alle dim date.
Quando `strict` è True, solo le dimensioni sconosciute possono essere ridimensionate. Le dimensioni sconosciute sono indicate come `-1` nell'array restituito da `Tensor.shapeSignature()`.
Parametri
idx | |
---|---|
si attenua | |
rigoroso |
Tiri
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'input idx-esimo del modello nativo alle dim date.
Parametri
idx | |
---|---|
si attenua |
Tiri
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 solo un input e fornisce un solo output.
Avviso: l'API è più efficiente se viene utilizzato un Buffer
(preferibilmente diretto, ma non necessario) come tipo di dati di input/output. Si prega di considerare l'utilizzo del Buffer
per alimentare e recuperare dati primitivi per prestazioni migliori. Sono supportati i seguenti tipi di Buffer
concreti:
-
ByteBuffer
- compatibile con qualsiasi tipo di Tensor primitivo sottostante. -
FloatBuffer
- compatibile con i 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 o un Buffer di tipi primitivi inclusi 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 fino a quando 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 | una matrice multidimensionale di dati di output o un Buffer di tipi primitivi inclusi 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à dell'handle del buffer e tale buffer è stato associato all'output Tensor (vedere anche Interpreter.Options#setAllowBufferHandleOutput(boolean) ), o se il grafico ha output di forma dinamica e il chiamante deve interrogare la forma del Tensor di output dopo che è stata richiamata l'inferenza, recuperando i dati direttamente dal tensore di output (tramite Tensor.asReadOnlyBuffer() ). |
Tiri
IllegalArgumentException | se input è nullo o vuoto o se si verifica un errore durante l'esecuzione dell'inferenza. |
---|---|
IllegalArgumentException | (SPERIMENTALE, soggetto a modifiche) se l'inferenza è interrotta da setCancelled(true) . |
public abstract void runForMultipleInputsOutputs (Ingressi 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. Si prega di considerare l'utilizzo del Buffer
per alimentare e recuperare dati primitivi per prestazioni migliori. Sono supportati i seguenti tipi di Buffer
concreti:
-
ByteBuffer
- compatibile con qualsiasi tipo di Tensor primitivo sottostante. -
FloatBuffer
- compatibile con i tensori float. -
IntBuffer
- compatibile con i tensori int32. -
LongBuffer
- compatibile con i tensori int64.
Buffer
o come input scalari. Nota: i 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 al Tensor
(i) di input o output corrispondente.
Parametri
ingressi | una matrice di dati di input. Gli input devono essere nello stesso ordine degli input del modello. Ogni input può essere una matrice o una matrice multidimensionale o un Buffer di tipi primitivi inclusi 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 il Buffer , il suo contenuto deve rimanere invariato fino al completamento dell'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 inclusi int, float, long e byte. Ha solo bisogno di conservare le voci per gli 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 per i 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 del Tensor di output dopo che è stata invocata l'inferenza, recuperando i dati direttamente dal tensore di output ( tramite Tensor.asReadOnlyBuffer() ). |
Tiri
IllegalArgumentException | se inputs è nullo o vuoto, se outputs è nullo o se si verifica un errore durante l'esecuzione dell'inferenza. |
---|