Interpreter

aula final pública Intérprete

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

Intérprete(arquivo modelFile)
Inicializa um Interpreter.
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
getInputIndex(String opName)
Recebe o índice de uma entrada conforme o nome da operação.
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
getOutputIndex(String opName)
Recebe o índice de uma saída, de acordo com o nome da operação.
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
run(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.
void
runForMultipleInputsOutputs(entradas de Object[], saídas de Map<IntegerObject>)
Executa a inferência de modelo se o modelo recebe várias entradas ou retorna várias saídas.
void
runSignature(entradas de Map<StringObject>, Map<StringObject> 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
runSignature(entradas de Map<StringObject>, Map<StringObject>, String signatureKey)
Executa a inferência de modelo com base na SignatureDef fornecida por signatureKey.
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 Longo getLastNativeInferenceDurationNanoseconds ()

Retorna o tempo de inferência nativa.

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.
. Os tipos booleanos são aceitos apenas como matrizes, e não como Buffers 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 inteiroobjeto>)

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 Buffers (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.
. Os tipos booleanos são aceitos apenas como matrizes, e não como Buffers 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 Buffers 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<StringObject> entradas, Map<StringObject> 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<StringObject> entradas, Map<StringObject> 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.