Classe de driver para impulsionar a inferência de modelo com o TensorFlow Lite.
Observação: se você não precisa acessar as opções os recursos da API abaixo, prefira usar InterpreterApi e InterpreterFactory em vez de usar o Interpreter diretamente.
Um Interpreter
encapsula um modelo do TensorFlow Lite pré-treinado, em que as operações
são executados para inferência de modelos.
Por exemplo, se um modelo usa apenas uma entrada e retorna apenas uma saída:
try (Interpreter interpreter = new Interpreter(file_of_a_tensorflowlite_model)) {
interpreter.run(input, output);
}
Se um modelo usa várias entradas ou saídas:
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 um modelo usa ou produz tensores de string:
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);
}
Há uma distinção entre formato [] e forma[1]. Para tensor de string escalar saídas:
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);
As ordens de entradas e saídas são determinadas ao converter o modelo do TensorFlow para o TensorFlowLite com o Toco, assim como as formas padrão das entradas.
Quando as entradas são fornecidas como matrizes (multidimensionais), os tensores de entrada correspondentes
ser redimensionadas implicitamente de acordo com a forma dessa matriz. Quando as entradas são fornecidas como Buffer
tipos, nenhum redimensionamento implícito é feito; o autor da chamada precisa garantir que o tamanho de byte Buffer
corresponde ao tensor correspondente ou que primeiro eles redimensionam o tensor usando resizeInput(int, int[])
. As informações de formato e tipo do tensor podem ser recebidas usando a classe Tensor
, disponível em getInputTensor(int)
e getOutputTensor(int)
.
AVISO:as instâncias de Interpreter
não são seguras para linhas de execução. Um Interpreter
tem recursos que precisam ser liberados explicitamente invocando close()
A biblioteca TFLite foi criada com a API NDK 19. Pode funcionar para APIs do Android de níveis anteriores ao 19, mas isso não é garantido.
Classes aninhadas
classe | Interpreter.Options | Uma classe de opções para controlar o comportamento do interpretador em tempo de execução. |
Construtores públicos
Interpreter(opções de Arquivo modelFile, Interpreter.Options)
Inicializa um
Interpreter e especifica opções para personalizar o comportamento do intérprete. |
|
Interpretador(byteBuffer ByteBuffer)
Inicializa um
Interpreter com um ByteBuffer de um arquivo de modelo. |
|
Interpreter(byteBuffer do ByteBuffer, opções Interpreter.Options)
Inicializa um
Interpreter com um ByteBuffer de um arquivo de modelo e um conjunto de
um Interpreter.Options personalizado. |
Métodos públicos
void |
allocateTensors()
Atualiza explicitamente as alocações de todos os tensores, se necessário.
|
void |
close()
Liberar recursos associados à instância
InterpreterApi . |
int | |
Tensor |
getInputTensor(int inputIndex)
Recebe o tensor associado ao índice de entrada fornecido.
|
int |
getInputTensorCount()
Recebe o número de tensores de entrada.
|
Tensor |
getInputTensorFromSignature(String inputName, String signatureKey)
Recebe o tensor associado ao nome de entrada e ao nome do método de assinatura fornecidos.
|
Longo |
getLastNativeInferenceDurationNanoseconds()
Retorna o tempo de inferência nativa.
|
int | |
Tensor |
getOutputTensor(int outputIndex)
Recebe o tensor associado ao índice de saída fornecido.
|
int |
getOutputTensorCount()
Recebe o número de tensores de saída.
|
Tensor |
getOutputTensorFromSignature(String outputName, String signatureKey)
Recebe o tensor associado ao nome de saída fornecido no método de assinatura específico.
|
String[] |
getSignatureInputs(String signatureKey)
Recebe a lista de entradas SignatureDefs para o método
signatureKey . |
String[] |
getSignatureKeys()
Recebe a lista de nomes de métodos exportados do SignatureDef disponíveis no modelo.
|
String[] |
getSignatureOutputs(String signatureKey)
Recebe a lista de saídas de SignatureDefs para o método
signatureKey . |
void |
resetVariableTensors()
Avançado: redefine todos os tensores variáveis para o valor padrão.
|
void |
resizeInput(int idx, int[] dims, boolean strict)
Redimensiona a entrada idx-th do modelo nativo para as cores determinadas.
|
void |
resizeInput(int idx, int[] esmaecido)
Redimensiona a entrada idx-th do modelo nativo para as cores determinadas.
|
void | |
void |
runForMultipleInputsOutputs(entradas de Object[], saídas de Map<Integer, Object>)
Executa a inferência de modelo se o modelo recebe várias entradas ou retorna várias saídas.
|
void |
runSignature(entradas de Map<String, Object>, Map<String, Object> saídas)
Igual a
runSignature(Map, Map, String) , mas não exige a transmissão de uma signatureKey.
supondo que o modelo tenha um SignatureDef. |
void | |
void |
setCancelled(booleano cancelado)
Avançado: interrompe a inferência no meio de uma chamada para
run(Object, Object) . |
Métodos herdados
Construtores públicos
públicas Intérprete (Arquivo modelFile)
Inicializa um Interpreter
.
Parâmetros
modelFile | um arquivo de um modelo pré-treinado do TF Lite. |
---|
Gera
IllegalArgumentException | se modelFile não codificar um TensorFlow Lite válido
um modelo de machine learning.
|
---|
públicas Intérprete (Opções de Arquivo modelFile, Interpreter.Options)
Inicializa um Interpreter
e especifica opções para personalizar o comportamento do intérprete.
Parâmetros
modelFile | um arquivo de um modelo pré-treinado do TF Lite |
---|---|
opções | um conjunto de opções para personalizar o comportamento do intérprete |
Gera
IllegalArgumentException | se modelFile não codificar um TensorFlow Lite válido
um modelo de machine learning.
|
---|
públicas Intérprete (ByteBuffer byteBuffer)
Inicializa um Interpreter
com um ByteBuffer
de um arquivo de modelo.
O ByteBuffer não pode ser modificado após a construção de um Interpreter
. A
ByteBuffer
pode ser um MappedByteBuffer
que mapeia um arquivo de modelo na memória ou um
ByteBuffer
direto de nativeOrder() que contém o conteúdo de bytes de um modelo.
Parâmetros
byteBuffer |
---|
Gera
IllegalArgumentException | se byteBuffer não for um MappedByteBuffer nem um
direto ByteBuffer de nativeOrder.
|
---|
públicas Intérprete (ByteBuffer byteBuffer, opções Interpreter.Options)
Inicializa um Interpreter
com um ByteBuffer
de um arquivo de modelo e um conjunto de
um Interpreter.Options
personalizado.
O ByteBuffer
não pode ser modificado após a construção de um Interpreter
. O ByteBuffer
pode ser um MappedByteBuffer
que mapeia na memória
um arquivo modelo ou um ByteBuffer
direto de nativeOrder() que contém o conteúdo de bytes
de um modelo.
Parâmetros
byteBuffer | |
---|---|
opções |
Gera
IllegalArgumentException | se byteBuffer não for um MappedByteBuffer nem um
direto ByteBuffer de nativeOrder.
|
---|
Métodos públicos
públicas anular allocateTensors ()
Atualiza explicitamente as alocações de todos os tensores, se necessário.
Isso propagará formas e alocações de memória para tensores dependentes usando o formato(s) do tensor.
Observação: essa chamada é *puramente opcional*. A alocação de tensor vai ocorrer automaticamente durante a execução se quaisquer tensores de entrada tiverem sido redimensionados. Essa chamada é mais útil para determinar formas para quaisquer tensores de saída antes de executar o gráfico, por exemplo,
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...
Observação: alguns gráficos têm saídas de formato dinâmico. Nesse caso, a forma final pode não se propagar totalmente até a inferência ser executada.
públicas anular fechar ()
Liberar recursos associados à instância InterpreterApi
.
públicas int. getInputIndex (String opName)
Recebe o índice de uma entrada conforme o nome da operação.
Parâmetros
opName |
---|
públicas Tensor getInputTensor (int inputIndex)
Recebe o tensor associado ao índice de entrada fornecido.
Parâmetros
inputIndex |
---|
públicas int. getInputTensorCount ()
Recebe o número de tensores de entrada.
públicas Tensor getInputTensorFromSignature (String inputName, String signatureKey)
Recebe o tensor associado ao nome de entrada e ao nome do método de assinatura fornecidos.
AVISO: esta é uma API experimental e está sujeita a mudanças.
Parâmetros
inputName | Insira o nome na assinatura. |
---|---|
signatureKey | Chave de assinatura que identifica a SignatureDef, que pode ser nula se o modelo tiver uma assinatura. |
Gera
IllegalArgumentException | se inputName ou signatureKey for nulo ou vazio,
ou nome inválido fornecido.
|
---|
públicas int. getOutputIndex (String opName)
Recebe o índice de uma saída, de acordo com o nome da operação.
Parâmetros
opName |
---|
públicas Tensor getOutputTensor (int outputIndex)
Recebe o tensor associado ao índice de saída fornecido.
Observação: os detalhes do tensor de saída (por exemplo, formato) não podem ser totalmente preenchidos até que a inferência seja concluída.
é executado. Se você precisar de detalhes atualizados *antes* de executar a inferência (por exemplo, depois de redimensionar um
tensor de entrada, o que pode invalidar os formatos do tensor de saída), use allocateTensors()
para
acionar explicitamente a alocação e a propagação de formas. Para gráficos com formas de saída
que dependem dos *valores* de entrada, o formato da saída pode não ser totalmente determinado até que
inferência em execução.
Parâmetros
outputIndex |
---|
públicas int. getOutputTensorCount ()
Recebe o número de tensores de saída.
públicas Tensor getOutputTensorFromSignature (String outputName, String signatureKey)
Recebe o tensor associado ao nome de saída fornecido no método de assinatura específico.
Observação: os detalhes do tensor de saída (por exemplo, formato) não podem ser totalmente preenchidos até que a inferência seja concluída.
é executado. Se você precisar de detalhes atualizados *antes* de executar a inferência (por exemplo, depois de redimensionar um
tensor de entrada, o que pode invalidar os formatos do tensor de saída), use allocateTensors()
para
acionar explicitamente a alocação e a propagação de formas. Para gráficos com formas de saída
que dependem dos *valores* de entrada, o formato da saída pode não ser totalmente determinado até que
inferência em execução.
AVISO: esta é uma API experimental e está sujeita a mudanças.
Parâmetros
outputName | Nome de saída na assinatura. |
---|---|
signatureKey | Chave de assinatura que identifica a SignatureDef, que pode ser nula se o modelo tiver uma assinatura. |
Gera
IllegalArgumentException | se outputName ou signatureKey for nulo ou
vazio, ou nome inválido fornecido.
|
---|
públicas String[] getSignatureInputs (String signatureKey)
Recebe a lista de entradas SignatureDefs para o método signatureKey
.
AVISO: esta é uma API experimental e está sujeita a mudanças.
Parâmetros
signatureKey |
---|
públicas String[] getSignatureKeys ()
Recebe a lista de nomes de métodos exportados do SignatureDef disponíveis no modelo.
AVISO: esta é uma API experimental e está sujeita a mudanças.
públicas String[] getSignatureOutputs (String signatureKey)
Recebe a lista de saídas de SignatureDefs para o método signatureKey
.
AVISO: esta é uma API experimental e está sujeita a mudanças.
Parâmetros
signatureKey |
---|
públicas anular resetVariableTensors ()
Avançado: redefine todos os tensores variáveis para o valor padrão.
Se um tensor variável não tiver um buffer associado, ele será redefinido como zero.
AVISO: esta é uma API experimental e está sujeita a mudanças.
públicas anular resizeInput (int idx, int[] dims, booleano strict)
Redimensiona a entrada idx-th do modelo nativo para as cores determinadas.
Quando "strict" é definido como "True", apenas dimensões desconhecidas podem ser redimensionadas. Dimensões desconhecidas são indicado como `-1` na matriz retornada por `Tensor.shapeSignature()`.
Parâmetros
IDX | |
---|---|
escurece | |
restrito |
públicas anular resizeInput (int idx, int[] esmaecidos)
Redimensiona a entrada idx-th do modelo nativo para as cores determinadas.
Parâmetros
IDX | |
---|---|
escurece |
públicas anular executar (Entrada de objeto, saída de objeto)
Executa a inferência de modelo se o modelo usar apenas uma entrada e fornecer apenas uma saída.
Aviso: a API será mais eficiente se um Buffer
(de preferência direto, mas não obrigatório).
é usado como o tipo de dados de entrada/saída. Use Buffer
para alimentar e buscar
dados primitivos para um melhor desempenho. Os tipos de Buffer
concretos a seguir são
suportado:
ByteBuffer
: compatível com qualquer tipo primitivo de Tensor subjacente.FloatBuffer
: compatível com tensores flutuantes.IntBuffer
: compatível com tensores int32.LongBuffer
: compatível com tensores int64.
Buffer
s ou como entradas escalares.Parâmetros
entrada | uma matriz ou matriz multidimensional, ou um Buffer de tipos primitivos
incluindo int, float, long e byte. Buffer é a maneira preferencial de transmitir
dados de entrada para tipos primitivos, enquanto os tipos de string exigem o uso do método (multidimensional)
caminho de entrada da matriz. Quando um Buffer é usado, o conteúdo dele deve permanecer inalterado até
a inferência do modelo é feita, e o autor da chamada precisa garantir que Buffer esteja no
na posição de leitura apropriada. Um valor null só será permitido se o autor da chamada estiver usando uma
Delegate , que permite a interoperabilidade do gerenciador de buffer, e esse buffer foi vinculado à
entrada Tensor . |
---|---|
output | uma matriz multidimensional de dados de saída ou um Buffer de tipos primitivos
incluindo int, float, long e byte. Quando um Buffer é usado, o autor da chamada precisa garantir
a posição de gravação apropriada. Um valor nulo é permitido e é útil para
em certos casos, por exemplo, se o autor da chamada estiver usando um Delegate que permite o identificador de buffer
interoperabilidade, e esse buffer foi vinculado à saída Tensor (consulte também Interpreter.Options#setAllowBufferHandleOutput(boolean)),
ou se o grafo tiver saídas de formato dinâmico e o autor da chamada precisar consultar a forma Tensor de saída após a invocação da inferência, buscando os dados diretamente da saída
(usando Tensor.asReadOnlyBuffer() ). |
públicas anular runForMultipleInputsOutputs (Entradas de objeto[], saída do mapa <número inteiro, objeto>)
Executa a inferência de modelo se o modelo recebe várias entradas ou retorna várias saídas.
Aviso: a API será mais eficiente se Buffer
s (de preferência direta, mas não obrigatória).
são usados como tipos de dados de entrada/saída. Use Buffer
para alimentar e buscar
dados primitivos para um melhor desempenho. Os tipos de Buffer
concretos a seguir são
suportado:
ByteBuffer
: compatível com qualquer tipo primitivo de Tensor subjacente.FloatBuffer
: compatível com tensores flutuantes.IntBuffer
: compatível com tensores int32.LongBuffer
: compatível com tensores int64.
Buffer
s ou como entradas escalares.
Observação: os valores null
para elementos individuais de inputs
e outputs
são
permitido somente se o autor da chamada estiver usando um Delegate
que permita a interoperabilidade do gerenciador de buffer;
esse buffer foi vinculado às Tensor
de entrada ou saída correspondentes.
Parâmetros
escondidas | uma matriz de dados de entrada. As entradas devem estar na mesma ordem que as entradas do
um modelo de machine learning. Cada entrada pode ser uma matriz ou uma matriz multidimensional, ou um Buffer de
tipos primitivos, incluindo int, float, long e byte. Buffer é a forma recomendada
para transmitir grandes dados de entrada, enquanto os tipos de string exigem o uso de uma matriz (multidimensional)
caminho de entrada. Quando Buffer é usado, o conteúdo dele precisa permanecer inalterado até que o modelo
a inferência seja feita, e o autor da chamada precisa garantir que o Buffer esteja no
ler a posição. |
---|---|
saídas | um mapeamento de índices de saída para matrizes multidimensionais de dados de saída ou Buffer s de tipos primitivos, incluindo int, float, long e byte. Ele só precisa manter
entradas para as saídas a serem usadas. Quando um Buffer é usado, o autor da chamada precisa garantir
a posição de gravação apropriada. O mapa poderá ficar vazio nos casos em que
são usados para dados de tensor de saída, ou casos em que as saídas são dinamicamente
shaped e o autor da chamada precisa consultar a forma Tensor de saída depois que a inferência for
invocado, buscando os dados diretamente do tensor de saída (via Tensor.asReadOnlyBuffer() ). |
públicas anular runSignature (Map<String, Object> entradas, Map<String, Object> saídas)
Igual a runSignature(Map, Map, String)
, mas não exige a transmissão de uma signatureKey.
supondo que o modelo tenha um SignatureDef. Se o modelo tiver mais de uma SignatureDef, ele usará
gerar uma exceção.
AVISO: esta é uma API experimental e está sujeita a mudanças.
Parâmetros
escondidas | |
---|---|
saídas |
públicas anular runSignature (Map<String, Object> entradas, Map<String, Object> output, String signatureKey)
Executa a inferência de modelo com base na SignatureDef fornecida por signatureKey
.
Consulte run(Object, Object)
para mais detalhes sobre as entradas e saídas permitidas
tipos de dados.
AVISO: esta é uma API experimental e está sujeita a mudanças.
Parâmetros
escondidas | Um mapa do nome de entrada na SignatureDef para um objeto de entrada. |
---|---|
saídas | Um mapa do nome da saída em SignatureDef para dados de saída. Pode ficar vazio se o
o autor da chamada quer consultar os dados Tensor diretamente após a inferência (por exemplo, se o
a forma de saída é dinâmica, ou são usados identificadores de buffer de saída). |
signatureKey | Chave de assinatura que identifica o SignatureDef. |
Gera
IllegalArgumentException | se inputs for nulo ou estiver vazio, se outputs ou
signatureKey é nulo ou se ocorre um erro ao executar a inferência.
|
---|
públicas anular setCancelled (booleano cancelado)
Avançado: interrompe a inferência no meio de uma chamada para run(Object, Object)
.
Uma sinalização de cancelamento será definida como verdadeira quando essa função for chamada. O intérprete vai
verifica a flag entre as invocações de operações. Se for true
, o intérprete vai parar
execução. O intérprete vai permanecer no estado cancelado até que seja explicitamente "cancelado" de
setCancelled(false)
:
AVISO: esta é uma API experimental e está sujeita a mudanças.
Parâmetros
cancelou | true para cancelar a inferência da melhor maneira possível; false para
currículo. |
---|
Gera
IllegalStateException | se o intérprete não for inicializado com a função cancelável que fica desativada por padrão. |
---|