Sottoclassi indirette note |
Interfaccia all'interprete del modello TensorFlow Lite, esclusi i metodi sperimentali.
Un'istanza InterpreterApi
incapsula un modello TensorFlow Lite preaddestrato, in cui
vengono eseguite le operazioni 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 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 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 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 degli input e degli output vengono determinati quando si converte il modello TensorFlow in 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 dell'array. Quando gli input vengono forniti come tipi Buffer
, non viene eseguito il ridimensionamento implicito. Il chiamante deve assicurarsi che la dimensione in byte Buffer
corrisponda a quella del tensore corrispondente o che prima ridimensiona il tensore tramite resizeInput(int, int[])
. Le informazioni sulla forma e sul tipo di tensore possono essere
ottenute tramite la classe Tensor
, disponibile tramite getInputTensor(int)
e getOutputTensor(int)
.
AVVISO: le istanze InterpreterApi
non sono sicure per i thread.
AVVISO: un'istanza InterpreterApi
possiede risorse che devono essere liberate esplicitamente richiamando close()
La libreria TFLite è basata sull'API NDK 19. Potrebbe funzionare per livelli API Android inferiori a 19, ma non è garantito.
Corsi nidificati
classe | InterpreterApi.Options | Una classe di opzioni per controllare il comportamento dell'interprete di runtime. |
Metodi pubblici
astratto void |
allocateTensors()
Aggiorna in modo esplicito le allocazioni per tutti i tensori, se necessario.
|
astratto void |
close()
Rilascia le risorse associate all'istanza
InterpreterApi . |
statico InterpreterApi |
create(opzioni File modelFile, InterpreterApi.Options)
Crea un'istanza
InterpreterApi utilizzando le opzioni e il modello specificati. |
statico InterpreterApi |
create(opzioni ByteBuffer byteBuffer, InterpreterApi.Options)
Crea un'istanza
InterpreterApi utilizzando le opzioni e il modello specificati. |
astratto int | |
astratto Tensor |
getInputTensor(int inputIndex)
Restituisce il Tensor associato all'indice di input fornito.
|
astratto int |
getInputTensorCount()
Restituisce il numero di tensori di input.
|
astratto Lungo |
getLastNativeInferenceDurationNanoseconds()
Restituisce il tempo di inferenza nativa.
|
astratto int |
getOutputIndex(Stringa opName)
Restituisce l'indice di un output in base al nome operativo dell'output.
|
astratto Tensor |
getOutputTensor(int outputIndex)
Restituisce il valore Tensor associato all'indice di output fornito.
|
astratto int |
getOutputTensorCount()
Restituisce il numero di Tensor di output.
|
astratto void |
resizeInput(int idx, int[] dims, boolean strict)
Ridimensiona l'input idx-esima del modello nativo nei valori specificati.
|
astratto void |
resizeInput(int idx, int[] attenuato)
Ridimensiona l'input idx-esima del modello nativo nei valori specificati.
|
astratto void | |
astratto void |
runForMultipleInputsOutputs(Input di 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 astratto void allocateTensors ()
Aggiorna in modo esplicito le allocazioni per tutti i tensori, se necessario.
Questo propaga forme e allocazioni della memoria per i tensori dipendenti utilizzando le forme del tensore di input come specificato.
Nota: questa chiamata è *puramente facoltativa*. L'allocazione dei tensori avverrà automaticamente durante l'esecuzione se sono stati ridimensionati eventuali tensori di input. Questa chiamata è utile soprattutto per determinare le forme di eventuali tensori 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 di output potrebbe non propagarsi completamente fino all'esecuzione dell'inferenza.
Lanci
IllegalStateException | se non è stato possibile allocare i tensori del grafico. |
---|
pubblici astratto void chiudi ()
Rilascia le risorse associate all'istanza InterpreterApi
.
pubblico static InterpreterApi create (File modelFile, InterpreterApi.Options opzioni)
Crea un'istanza InterpreterApi
utilizzando le opzioni e il modello specificati. Il modello verrà caricato da un file.
Parametri
modelFile | Un file contenente un modello TF Lite preaddestrato. |
---|---|
opzioni del modello. | Una serie di opzioni per personalizzare il comportamento dell'interprete. |
Lanci
IllegalArgumentException | se modelFile non codifica un modello TensorFlow Lite
valido.
|
---|
pubblico static InterpreterApi create (ByteBuffer byteBuffer, InterpreterApi.Options)
Crea un'istanza InterpreterApi
utilizzando le opzioni e il modello specificati. Il modello verrà letto da un elemento ByteBuffer
.
Parametri
byteBuffer | Un modello TF Lite preaddestrato, in formato binario serializzato. Il ByteBuffer non deve essere modificato dopo la creazione di un'istanza InterpreterApi . ByteBuffer può essere un MappedByteBuffer che mappa in memoria un file del modello o un ByteBuffer diretto di nativeOrder() che include i contenuti dei byte di un modello. |
---|---|
opzioni del modello. | Una serie di opzioni per personalizzare il comportamento dell'interprete. |
Lanci
IllegalArgumentException | se byteBuffer non è un MappedByteBuffer né un
ByteBuffer diretto di nativeOrder.
|
---|
pubblici astratto int getInputIndex (String opName)
Recupera l'indice di un input in base al nome operazione dell'input.
Parametri
opName |
---|
Lanci
IllegalArgumentException | se opName non corrisponde ad alcun input nel modello utilizzato
per inizializzare l'interprete.
|
---|
pubblico astratto Tensor getInputTensor (int inputIndex)
Restituisce il Tensor associato all'indice di input fornito.
Parametri
inputIndex |
---|
Lanci
IllegalArgumentException | se inputIndex è negativo o non è inferiore al
numero di input del modello.
|
---|
pubblico astratto int getInputTensorCount ()
Restituisce il numero di tensori di input.
Public astratto Long getLastNativeInferenceDurationNanoseconds ()
Restituisce il tempo di inferenza nativa.
Lanci
IllegalArgumentException | se il modello non è inizializzato dall'interprete. |
---|
pubblici astratto int getOutputIndex (String opName)
Restituisce l'indice di un output in base al nome operativo dell'output.
Parametri
opName |
---|
Lanci
IllegalArgumentException | se opName non corrisponde ad alcun output nel modello utilizzato
per inizializzare l'interprete.
|
---|
pubblico astratto Tensor getOutputTensor (int outputIndex)
Restituisce il valore Tensor associato all'indice di output fornito.
Nota: i dettagli del tensore di output (ad esempio la forma) potrebbero non essere compilati completamente finché non viene eseguita l'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), utilizza allocateTensors()
per attivare esplicitamente l'allocazione e la propagazione della forma. Tieni presente che, per i grafici con forme di output che dipendono da *valori* di input, la forma di output potrebbe non essere completamente determinata finché non viene eseguita l'inferenza.
Parametri
outputIndex |
---|
Lanci
IllegalArgumentException | se outputIndex è negativo o non è inferiore al numero di output del modello.
|
---|
pubblico astratto int getOutputTensorCount ()
Restituisce il numero di Tensor di output.
Public astratto void resizeInput (int idx, int[] dims, boolean strict)
Ridimensiona l'input idx-esima del modello nativo nei valori specificati.
Se "strict" è true, solo le dimensioni sconosciute possono essere ridimensionate. Le dimensioni sconosciute sono indicate come "-1" nell'array restituito da "Tensor.shapeSignature()".
Parametri
idx | |
---|---|
dims | |
livello massimo |
Lanci
IllegalArgumentException | se idx è negativo o non è inferiore al numero di input del modello oppure se si verifica un errore durante il ridimensionamento dell'input idx-th. Inoltre, l'errore si verifica quando si cerca di ridimensionare un tensore con dimensioni fisse quando "strict" è True.
|
---|
pubblici astratto void resizeInput (int idx, int[] dims)
Ridimensiona l'input idx-esima del modello nativo nei valori specificati.
Parametri
idx | |
---|---|
dims |
Lanci
IllegalArgumentException | se idx è negativo o non è inferiore al numero di input del modello oppure se si verifica un errore durante il ridimensionamento dell'input idx-th.
|
---|
pubblici astratto void run (Input dell'oggetto, Output dell'oggetto)
Esegue l'inferenza del modello se il modello accetta un solo input e fornisce un solo output.
Avviso: l'API è più efficiente se viene utilizzato un Buffer
(preferibilmente diretto, ma non obbligatorio) come tipo di dati di input/output. Prendi in considerazione l'utilizzo di Buffer
per fornire e recuperare i dati primitivi per migliorare le prestazioni. Sono supportati i seguenti tipi di Buffer
concreti:
ByteBuffer
: compatibile con qualsiasi tipo di Tensor primitivo sottostante.FloatBuffer
: compatibile con i float Tensor.IntBuffer
- compatibile con int32 Tensors.LongBuffer
- compatibile con Tensors int64.
Buffer
o come input scalari.Parametri
input | un array o un array multidimensionale oppure 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 elemento Buffer , i relativi contenuti devono rimanere invariati fino al completamento dell'inferenza del modello e il chiamante deve assicurarsi che Buffer si trovi nella posizione di lettura appropriata. Un valore null è consentito solo se il chiamante utilizza un Delegate che consente l'interoperabilità dell'handle del buffer ed è stato associato all'input Tensor . |
---|---|
output | un array multidimensionale di dati di output o 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 null ed è utile in alcuni casi, ad esempio se il chiamante utilizza un elemento Delegate che consente l'interoperabilità dell'handle del buffer e tale buffer è stato associato all'output Tensor (vedi anche Interpreter.Options#setAllowBufferHandleOutput(boolean)) oppure se il grafico ha output dal formato dinamico e il chiamante deve eseguire una query sulla forma Tensor di output dopo il recupero dei dati Tensor.asReadOnlyBuffer() o dopo il richiamo dei dati.Tensor.asReadOnlyBuffer() |
Lanci
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) .
|
pubblici astratto void runForMultipleInputsOutputs (Input di Object[], Map <Numero intero, output dell'oggetto>)
Esegue l'inferenza del modello se il modello accetta più input o restituisce più output.
Avviso: l'API è più efficiente se vengono utilizzati Buffer
(preferibilmente diretti, ma non obbligatori)
come tipi di dati di input/output. Prendi in considerazione l'utilizzo di Buffer
per fornire e recuperare i dati primitivi per migliorare le prestazioni. Sono supportati i seguenti tipi di Buffer
concreti:
ByteBuffer
: compatibile con qualsiasi tipo di Tensor primitivo sottostante.FloatBuffer
: compatibile con i float Tensor.IntBuffer
- compatibile con int32 Tensors.LongBuffer
- compatibile con Tensors int64.
Buffer
o come input scalari.
Nota: i valori null
per gli elementi individuali di inputs
e outputs
sono consentiti solo se il chiamante utilizza un Delegate
che consente l'interoperabilità dell'handle del buffer e questo buffer è stato associato ai Tensor
di input o di output corrispondenti.
Parametri
nascosti | un array di dati di input. Gli input devono 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 trasferire 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 , i relativi contenuti devono rimanere invariati fino al termine dell'inferenza del modello e il chiamante deve assicurarsi che Buffer si trovi nella posizione di lettura appropriata. |
---|---|
output | una mappa che mappa gli indici di output a array multidimensionali di dati di output o a Buffer di tipi primitivi tra cui int, float, long e byte. Deve solo conservare le voci per poter utilizzare gli output. 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 gli handle del buffer vengono utilizzati per i dati del tensore di output o i casi in cui gli output hanno una forma dinamica e il chiamante deve eseguire una query sulla forma Tensor di output dopo che è stata richiamata l'inferenza, recuperando i dati direttamente dal tensore di output (tramite Tensor.asReadOnlyBuffer() ). |
Lanci
IllegalArgumentException | se inputs è nullo o vuoto, se outputs è
nullo o se si verifica un errore durante l'esecuzione dell'inferenza.
|
---|