InterpreterApi

interfaccia pubblica InterpreterApi
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
getInputIndex(Stringa opName)
Recupera l'indice di un input in base al nome operazione dell'input.
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
run(input dell'oggetto, output dell'oggetto)
Esegue l'inferenza del modello se il modello accetta un solo input e fornisce un solo output.
astratto void
runForMultipleInputsOutputs(Input di Object[], output Map<IntegerObject>)
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.
Tieni presente che i tipi booleani sono supportati solo come array, non come 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 interooutput 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.
Tieni presente che i tipi booleani sono supportati solo come array, non come 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.