Classe driver per guidare l'inferenza del modello con TensorFlow Lite.
Nota. Se non hai bisogno di accedere a nessun elemento "sperimentale" le funzionalità API riportate di seguito, preferiamo utilizzare InterpreterApi e Interpreterfabbrica anziché utilizzare direttamente lo strumento Interpreter.
Un Interpreter
incapsula un modello TensorFlow Lite preaddestrato, in cui le operazioni
vengono eseguite per l'inferenza del modello.
Ad esempio, se un modello accetta un solo input e restituisce solo un output:
try (Interpreter interpreter = new Interpreter(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 (Interpreter interpreter = new Interpreter(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 (Interpreter interpreter = new Interpreter(file_of_a_tensorflowlite_model)) {
interpreter.runForMultipleInputsOutputs(input, output);
}
Tieni presente che esiste una distinzione tra forma [] e forma[1]. Per tensori di stringa scalare genera:
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 in TensorFlowLite modello con Toco, così come le forme predefinite degli input.
Quando gli input vengono forniti come array (multidimensionali), i tensori di input corrispondenti
ridimensionato implicitamente in base alla forma dell'array. Quando gli input vengono forniti come Buffer
tra i due tipi, il ridimensionamento
implicito non avviene; il chiamante deve assicurarsi che la dimensione in byte di Buffer
corrisponde a quello del tensore corrispondente oppure ridimensiona il tensore tramite resizeInput(int, int[])
. È possibile ottenere informazioni su forma e tipo di Tensor tramite la classe Tensor
, disponibile tramite getInputTensor(int)
e getOutputTensor(int)
.
ATTENZIONE:Interpreter
istanze non sono sicure per i thread. Interpreter
possiede risorse che devono essere liberate esplicitamente richiamando close()
La libreria TFLite è basata sull'API NDK 19. Può funzionare con livelli API Android inferiori a 19, ma non è garantito.
Classi nidificate
classe | Interpreter.Options | Una classe di opzioni per controllare il comportamento dell'interprete di runtime. |
Costruttori pubblici
Interpreter(opzioni File modelFile, Interpreter.Options)
Inizializza un
Interpreter e specifica le opzioni per personalizzare il comportamento dell'interprete. |
|
Interpreter(ByteBuffer byteBuffer)
Inizializza un
Interpreter con un ByteBuffer di un file del modello. |
|
Interpreter(opzioni ByteBuffer byteBuffer, Interpreter.Options)
Inizializza un
Interpreter con un ByteBuffer di un file di modello e un set di
Interpreter.Options personalizzato. |
Metodi pubblici
null |
allocateTensors()
Aggiorna in modo esplicito le allocazioni per tutti i tensori, se necessario.
|
null |
close()
Rilascia le risorse associate all'istanza
InterpreterApi . |
int | |
Tensor |
getInputTensor(int inputIndex)
Recupera il Tensor associato all'indice di input fornito.
|
int |
getInputTensorCount()
Restituisce il numero di tensori di input.
|
Tensor |
getInputTensorFromSignature(String inputName, String signatureKey)
Recupera il Tensor associato al nome di input fornito e al nome del metodo di firma.
|
Lunga |
getLastNativeInferenceDurationNanoseconds()
Restituisce i tempi di inferenza nativa.
|
int |
getOutputIndex(Stringa opName)
Ottiene l'indice di un output dato il nome dell'operazione dell'output.
|
Tensor |
getOutputTensor(int outputIndex)
Recupera il Tensor associato all'indice di output fornito.
|
int |
getOutputTensorCount()
Ottiene il numero di tensori di output.
|
Tensor |
getOutputTensorFromSignature(String outputName, String signatureKey)
Consente di acquisire il Tensor associato al nome di output fornito nel metodo di firma specifico.
|
String[] |
getSignatureInputs(String signatureKey)
Restituisce l'elenco di input SignatureDefs per il metodo
signatureKey . |
String[] |
getSignatureKeys()
Restituisce l'elenco dei nomi dei metodi esportati da SignatureDef disponibili nel modello.
|
String[] |
getSignatureOutputs(String signatureKey)
Ottiene l'elenco di output SignatureDefs per il metodo
signatureKey . |
null |
resetVariableTensors()
Avanzato: reimposta tutti i tensori variabili sul valore predefinito.
|
null |
resizeInput(int idx, int[] dims, boolean strict)
Ridimensiona l'input idx-th del modello nativo alle dimensioni specificate.
|
null |
resizeInput(int idx, int[] dims)
Ridimensiona l'input idx-th del modello nativo alle dimensioni specificate.
|
null | |
null |
runForMultipleInputsOutputs(input Object[], output Map<Integer, Object> output)
Esegue l'inferenza del modello se il modello accetta più input o restituisce più output.
|
null |
runSignature(input Map<String, Object>, Map<String, Object> output)
Uguale a
runSignature(Map, Map, String) , ma non richiede il passaggio di una chiave di firma,
supponendo che il modello abbia un valore SignatureDef. |
null | |
null |
setCancelled(booleano annullato)
Avanzato: interrompe l'inferenza durante una chiamata a
run(Object, Object) . |
Metodi ereditati
Costruttori pubblici
pubblica . Interprete (File modelFile)
Inizializza un Interpreter
.
Parametri
modelFile | un file di un modello TF Lite preaddestrato. |
---|
Lanci
IllegalArgumentException | se modelFile non codifica un TensorFlow Lite valido
un modello di machine learning.
|
---|
pubblica . Interprete (opzioni File modelFile, Interpreter.Options)
Inizializza un Interpreter
e specifica le opzioni per personalizzare il comportamento dell'interprete.
Parametri
modelFile | un file di un modello TF Lite preaddestrato |
---|---|
opzioni | un insieme di opzioni per personalizzare il comportamento dell'interprete |
Lanci
IllegalArgumentException | se modelFile non codifica un TensorFlow Lite valido
un modello di machine learning.
|
---|
pubblica . Interprete (ByteBuffer byteBuffer)
Inizializza un Interpreter
con un ByteBuffer
di un file del modello.
ByteBuffer non deve essere modificato dopo la costruzione di un Interpreter
. La
ByteBuffer
può essere un MappedByteBuffer
che mappa in memoria il file di un modello o un
ByteBuffer
diretto di nativeOrder() che include i contenuti in byte di un modello.
Parametri
byteBuffer |
---|
Lanci
IllegalArgumentException | se byteBuffer non è MappedByteBuffer né un
diretto ByteBuffer di nativeOrder.
|
---|
pubblica . Interprete (opzioni ByteBuffer byteBuffer, Interpreter.Options)
Inizializza un Interpreter
con un ByteBuffer
di un file di modello e un set di
Interpreter.Options
personalizzato.
ByteBuffer
non deve essere modificato dopo la costruzione di un Interpreter
. Il ByteBuffer
può essere un MappedByteBuffer
che utilizza le mappe di memoria
un file del modello o un valore ByteBuffer
diretto di nativeOrder() che include i contenuti dei byte
di un modello.
Parametri
byteBuffer | |
---|---|
opzioni |
Lanci
IllegalArgumentException | se byteBuffer non è MappedByteBuffer né un
diretto ByteBuffer di nativeOrder.
|
---|
Metodi pubblici
pubblica null . allocateTensors ()
Aggiorna in modo esplicito le allocazioni per tutti i tensori, se necessario.
Questo propaga le forme e le allocazioni di memoria per i tensori dipendenti utilizzando l'input le forme dei tensori date.
Nota: questa chiamata è *solo facoltativa*. L'allocazione del tensore avviene automaticamente se qualche tensore di input è stato ridimensionato. Questa chiamata è particolarmente utile per determinare forme per 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 si propagano completamente fino all'esecuzione dell'inferenza.
pubblica null . chiudi ()
Rilascia le risorse associate all'istanza InterpreterApi
.
pubblica int . getInputIndex (Stringa opName)
Ottiene l'indice di un input dato il nome dell'operazione dell'input.
Parametri
opName |
---|
pubblica Tensor getInputTensor (int inputIndex)
Recupera il Tensor associato all'indice di input fornito.
Parametri
inputIndex |
---|
pubblica int . getInputTensorCount ()
Restituisce il numero di tensori di input.
pubblica Tensor getInputTensorFromSignature (Stringa inputName, String firma)
Recupera il Tensor associato al nome di input fornito e al nome del metodo di firma.
ATTENZIONE: questa è un'API sperimentale ed è soggetta a modifiche.
Parametri
inputName | Inserisci il nome nella firma. |
---|---|
signatureKey | Chiave di firma che identifica il parametro SignatureDef, può essere nulla se il modello ha una firma. |
Lanci
IllegalArgumentException | se inputName o signatureKey è nullo o vuoto,
o un nome fornito non valido.
|
---|
pubblica Lungo getLastNativeInferenceDurationNanoseconds ()
Restituisce i tempi di inferenza nativa.
pubblica int . getOutputIndex (Stringa opName)
Ottiene l'indice di un output dato il nome dell'operazione dell'output.
Parametri
opName |
---|
pubblica Tensor getOutputTensor (int outputIndex)
Recupera il Tensor associato all'indice di output fornito.
Nota: i dettagli del tensore di output (ad es. forma) potrebbero non essere compilati completamente fino a dopo l'inferenza
viene eseguito. Se hai bisogno di aggiornare i dettagli *prima* di eseguire l'inferenza (ad es. dopo aver ridimensionato
tensore di input, che può invalidare le forme del tensore di output), usa allocateTensors()
per
attivare esplicitamente l'allocazione e la propagazione della forma. Ricorda che, per i grafici con forme di output
che dipendono da *valori* di input, la forma di output potrebbe non essere determinata completamente
l'inferenza in esecuzione.
Parametri
outputIndex |
---|
pubblica int . getOutputTensorCount ()
Ottiene il numero di tensori di output.
pubblica Tensor getOutputTensorFromSignature (Stringa outputName, String signatureKey)
Consente di acquisire il Tensor associato al nome di output fornito nel metodo di firma specifico.
Nota: i dettagli del tensore di output (ad es. forma) potrebbero non essere compilati completamente fino a dopo l'inferenza
viene eseguito. Se hai bisogno di aggiornare i dettagli *prima* di eseguire l'inferenza (ad es. dopo aver ridimensionato
tensore di input, che può invalidare le forme del tensore di output), usa allocateTensors()
per
attivare esplicitamente l'allocazione e la propagazione della forma. Ricorda che, per i grafici con forme di output
che dipendono da *valori* di input, la forma di output potrebbe non essere determinata completamente
l'inferenza in esecuzione.
ATTENZIONE: questa è un'API sperimentale ed è soggetta a modifiche.
Parametri
outputName | Nome di output nella firma. |
---|---|
signatureKey | Chiave di firma che identifica il parametro SignatureDef, può essere nulla se il modello ha una firma. |
Lanci
IllegalArgumentException | se outputName o signatureKey è nullo o
è vuoto o il nome fornito non è valido.
|
---|
pubblica String[] getSignatureInputs (Stringa firma)
Restituisce l'elenco di input SignatureDefs per il metodo signatureKey
.
ATTENZIONE: questa è un'API sperimentale ed è soggetta a modifiche.
Parametri
signatureKey |
---|
pubblica String[] getSignatureKeys ()
Restituisce l'elenco dei nomi dei metodi esportati da SignatureDef disponibili nel modello.
ATTENZIONE: questa è un'API sperimentale ed è soggetta a modifiche.
pubblica String[] getSignatureOutputs (Stringa firma)
Ottiene l'elenco di output SignatureDefs per il metodo signatureKey
.
ATTENZIONE: questa è un'API sperimentale ed è soggetta a modifiche.
Parametri
signatureKey |
---|
pubblica null . resetVariableTensors ()
Avanzato: reimposta tutti i tensori variabili sul valore predefinito.
Se a un tensore variabile non è associato un buffer, questo verrà reimpostato su zero.
ATTENZIONE: questa è un'API sperimentale ed è soggetta a modifiche.
pubblica null . resizeInput (int idx, int[] dims, booleano rigido)
Ridimensiona l'input idx-th del modello nativo alle dimensioni specificate.
Quando "strict" è impostato su True, possono essere ridimensionate solo le dimensioni sconosciute. Le dimensioni sconosciute sono indicato come "-1" nell'array restituito da "Tensor.shapeSignature()".
Parametri
IDX | |
---|---|
attenua | |
livello massimo |
pubblica null . resizeInput (int idx, int[] dims)
Ridimensiona l'input idx-th del modello nativo alle dimensioni specificate.
Parametri
IDX | |
---|---|
attenua |
pubblica null . corri (input oggetto, output oggetto)
Esegue l'inferenza del modello se il modello accetta un solo input e fornisce un solo output.
Avviso: l'API è più efficiente se Buffer
(preferibilmente diretta, ma non obbligatoria)
viene utilizzato come tipo di dati di input/output. Valuta la possibilità di utilizzare Buffer
per il feed e il recupero
per migliorare le prestazioni. I seguenti tipi di Buffer
concreti sono
supportati:
ByteBuffer
: compatibile con qualsiasi tipo di Tensor primitivo sottostante.FloatBuffer
: compatibile con i tensori mobili.IntBuffer
- compatibile con i Tensors Int32.LongBuffer
- compatibile con i Tensors Int64.
Buffer
o come input scalari.Parametri
input | un array o un array multidimensionale, o un Buffer di tipi primitivi
inclusi int, float, long e byte. Buffer è il metodo preferito per trasmettere contenuti
per i tipi primitivi, mentre i tipi di stringa richiedono l'uso della funzione
di input dell'array. Quando viene utilizzato un Buffer , i relativi contenuti devono rimanere invariati finché
l'inferenza del modello viene completata e il chiamante deve assicurarsi che Buffer sia
posizione di lettura appropriata. Un valore null è consentito solo se il chiamante utilizza un
Delegate che consente l'interoperabilità dell'handle del buffer, che è stato associato alla
inserisci Tensor . |
---|---|
output | un array multidimensionale dei dati di output, o Buffer dei tipi primitivi
inclusi int, float, long e byte. Quando si usa un Buffer , il chiamante deve assicurarsi
impostando la posizione di scrittura appropriata. È consentito un valore nullo, utile per
In alcuni casi, ad esempio se il chiamante usa un Delegate che consente l'handle del buffer
interopazione; tale buffer è stato associato all'output Tensor (vedi anche Interpreter.Options#setAllowBufferHandleOutput(boolean)),
oppure se il grafico ha output di forma dinamica e il chiamante deve eseguire una query sulla forma Tensor di output dopo aver richiamato l'inferenza, recuperando i dati direttamente dall'output
tensor (tramite Tensor.asReadOnlyBuffer() ). |
pubblica null . runForMultipleInputsOutputs (Input Object[], Mappa<Integer, Object> output)
Esegue l'inferenza del modello se il modello accetta più input o restituisce più output.
Avviso: l'API è più efficiente se Buffer
(preferibilmente diretta, ma non obbligatoria)
vengono utilizzati come tipi di dati di input/output. Valuta la possibilità di utilizzare Buffer
per il feed e il recupero
per migliorare le prestazioni. I seguenti tipi di Buffer
concreti sono
supportati:
ByteBuffer
: compatibile con qualsiasi tipo di Tensor primitivo sottostante.FloatBuffer
: compatibile con i tensori mobili.IntBuffer
- compatibile con i Tensors Int32.LongBuffer
- compatibile con i Tensors Int64.
Buffer
o come input scalari.
Nota: i valori null
per gli elementi individuali di inputs
e outputs
sono
consentito solo se il chiamante utilizza un Delegate
che consente l'interoperabilità dell'handle del buffer e
tale buffer è stato associato allo Tensor
(i) input o output corrispondente.
Parametri
nascosti | un array di dati di input. Gli input devono essere nello stesso ordine degli input del metodo
un modello di machine learning. Ogni input può essere un array, un array multidimensionale o un Buffer di
tipi primitivi tra cui int, float, long e byte. Buffer è il metodo preferito
per passare grandi dati di input, mentre i tipi di stringa richiedono l'uso dell'array (multidimensionale)
del percorso di input. Quando viene utilizzato Buffer , i relativi contenuti devono rimanere invariati fino al modello
viene eseguita l'inferenza e il chiamante deve assicurarsi che Buffer sia nel giusto
posizione di lettura. |
---|---|
output | una mappa che mappa gli indici di output ad array multidimensionali di dati di output o Buffer di tipi primitivi, inclusi int, float, long e byte. Deve solo mantenere
per gli output da utilizzare. Quando si usa un Buffer , il chiamante deve assicurarsi
impostando la posizione di scrittura appropriata. La mappa potrebbe essere vuota nei casi in cui
Gli handle del buffer vengono utilizzati per i dati dei tensori di output o nei casi in cui gli output vengono
e il chiamante deve eseguire una query sulla forma di output Tensor dopo che è stata
richiamato, recuperando i dati direttamente dal tensore di output (tramite Tensor.asReadOnlyBuffer() ). |
pubblica null . runSignature (Mappa<String, Object> input, Map<String, Object> output)
Uguale a runSignature(Map, Map, String)
, ma non richiede il passaggio di una chiave di firma,
supponendo che il modello abbia un valore SignatureDef. Se il modello ha più di un elemento SignatureDef
genera un'eccezione.
ATTENZIONE: questa è un'API sperimentale ed è soggetta a modifiche.
Parametri
nascosti | |
---|---|
output |
pubblica null . runSignature (Mappa<String, Object> input, Map<String, Object> output, String signatureKey)
Esegue l'inferenza del modello basata su SignatureDef fornito tramite signatureKey
.
Consulta run(Object, Object)
per ulteriori dettagli sull'input e l'output consentiti
tipi di dati.
ATTENZIONE: questa è un'API sperimentale ed è soggetta a modifiche.
Parametri
nascosti | Mappa dal nome di input in SignatureDef a un oggetto di input. |
---|---|
output | Una mappa dal nome di output in SignatureDef ai dati di output. Questo campo può essere vuoto se
Il chiamante vuole eseguire una query sui dati Tensor direttamente dopo l'inferenza (ad es. se il
la forma di output è dinamica oppure vengono utilizzati punti di manipolazione del buffer di output). |
signatureKey | Chiave di firma che identifica il valore SignatureDef. |
Lanci
IllegalArgumentException | se inputs è nullo o vuoto, se outputs o
signatureKey è nullo o se si verifica un errore durante l'esecuzione dell'inferenza.
|
---|
pubblica null . setCancelled (booleano annullato)
Avanzato: interrompe l'inferenza durante una chiamata a run(Object, Object)
.
Un flag di annullamento verrà impostato su true quando viene chiamata questa funzione. L'interprete
seleziona il flag tra le chiamate dell'operazione e, se è true
, l'interprete interromperà il controllo
dell'esecuzione. L'interprete rimarrà in stato di annullamento finché non verrà esplicitamente "annullato" di
setCancelled(false)
.
ATTENZIONE: questa è un'API sperimentale ed è soggetta a modifiche.
Parametri
annullato | true per annullare l'inferenza secondo il criterio del "best effort". false per
riprendi. |
---|
Lanci
IllegalStateException | se l'interprete non viene inizializzato con la che è disattivata per impostazione predefinita. |
---|