Subclasses indiretas conhecidas |
Interface para o interpretador de modelos do TensorFlow Lite, exceto métodos experimentais.
Uma instância InterpreterApi
encapsula um modelo pré-treinado do TensorFlow Lite, em que
operações são executadas para inferência de modelos.
Por exemplo, se um modelo usa apenas uma entrada e retorna apenas uma saída:
try (InterpreterApi interpreter =
new InterpreterApi.create(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 (InterpreterApi interpreter =
new InterpreterApi.create(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 (InterpreterApi interpreter =
new InterpreterApi.create(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 tipos Buffer
, nenhum redimensionamento implícito é feito. o autor da chamada precisa garantir que o tamanho de byte Buffer
corresponda ao do tensor correspondente ou que primeiro
redimensione o tensor com resizeInput(int, int[])
. As informações de tipo e formato do tensor podem ser
extraído pela classe Tensor
, disponível via getInputTensor(int)
e getOutputTensor(int)
.
AVISO:as instâncias de InterpreterApi
não são seguras para linhas de execução.
AVISO:uma instância do InterpreterApi
tem recursos que precisam ser
explicitamente liberado ao invocar 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 | InterpreterApi.Options | Uma classe de opções para controlar o comportamento do interpretador em tempo de execução. |
Métodos públicos
abstrato anular |
allocateTensors()
Atualiza explicitamente as alocações de todos os tensores, se necessário.
|
abstrato anular |
close()
Liberar recursos associados à instância
InterpreterApi . |
estática InterpreterApi |
create(opções de Arquivo modelFile, InterpreterApi.Options)
Cria uma instância de
InterpreterApi usando o modelo e as opções especificados. |
estática InterpreterApi |
create(byteBuffer do ByteBuffer, opções InterpreterApi.Options)
Cria uma instância de
InterpreterApi usando o modelo e as opções especificados. |
abstrato int. | |
abstrato Tensor |
getInputTensor(int inputIndex)
Recebe o tensor associado ao índice de entrada fornecido.
|
abstrato int. |
getInputTensorCount()
Recebe o número de tensores de entrada.
|
abstrato Longo |
getLastNativeInferenceDurationNanoseconds()
Retorna o tempo de inferência nativa.
|
abstrato int. | |
abstrato Tensor |
getOutputTensor(int outputIndex)
Recebe o tensor associado ao índice de saída fornecido.
|
abstrato int. |
getOutputTensorCount()
Recebe o número de tensores de saída.
|
abstrato anular |
resizeInput(int idx, int[] dims, boolean strict)
Redimensiona a entrada idx-th do modelo nativo para as cores determinadas.
|
abstrato anular |
resizeInput(int idx, int[] esmaecido)
Redimensiona a entrada idx-th do modelo nativo para as cores determinadas.
|
abstrato anular | |
abstrato anular |
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.
|
Métodos herdados
Métodos públicos
públicas abstrato 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.
Gera
IllegalStateException | caso os tensores do gráfico não possam ser alocados com sucesso. |
---|
públicas abstrato anular fechar ()
Liberar recursos associados à instância InterpreterApi
.
públicas estática InterpreterApi criar (Arquivo modelFile, InterpreterApi.Options)
Cria uma instância de InterpreterApi
usando o modelo e as opções especificados. O modelo
será carregado de um arquivo.
Parâmetros
modelFile | Um arquivo que contém 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 estática InterpreterApi criar (ByteBuffer byteBuffer, InterpreterApi.Options opções)
Cria uma instância de InterpreterApi
usando o modelo e as opções especificados. O modelo
será lido de um ByteBuffer
.
Parâmetros
byteBuffer | Um modelo do TF Lite pré-treinado, em formato serializado binário. O ByteBuffer precisa
ser modificada após a construção de uma instância de InterpreterApi . O 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. |
---|---|
opções | Um conjunto de opções para personalizar o comportamento do intérprete. |
Gera
IllegalArgumentException | se byteBuffer não for um MappedByteBuffer nem um
direto ByteBuffer de nativeOrder.
|
---|
públicas abstrato int. getInputIndex (String opName)
Recebe o índice de uma entrada conforme o nome da operação.
Parâmetros
opName |
---|
Gera
IllegalArgumentException | se opName não corresponder a nenhuma entrada no modelo usado
para inicializar o intérprete.
|
---|
públicas abstrato Tensor getInputTensor (int inputIndex)
Recebe o tensor associado ao índice de entrada fornecido.
Parâmetros
inputIndex |
---|
Gera
IllegalArgumentException | se inputIndex for negativo ou não for menor que o
o número de entradas do modelo.
|
---|
públicas abstrato int. getInputTensorCount ()
Recebe o número de tensores de entrada.
públicas abstrato Longo getLastNativeInferenceDurationNanoseconds ()
Retorna o tempo de inferência nativa.
Gera
IllegalArgumentException | se o modelo não for inicializado pelo intérprete. |
---|
públicas abstrato int. getOutputIndex (String opName)
Recebe o índice de uma saída, de acordo com o nome da operação.
Parâmetros
opName |
---|
Gera
IllegalArgumentException | se opName não corresponder a nenhuma saída no modelo usado
para inicializar o intérprete.
|
---|
públicas abstrato 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 |
---|
Gera
IllegalArgumentException | se outputIndex for negativo ou não for menor que o
o número de saídas do modelo.
|
---|
públicas abstrato int. getOutputTensorCount ()
Recebe o número de tensores de saída.
públicas abstrato 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 |
Gera
IllegalArgumentException | se idx for negativo ou não for menor que o número
de entradas de modelo, ou se ocorrer um erro ao redimensionar a entrada idx-th. Além disso, o erro
ocorre ao tentar redimensionar um tensor com dimensões fixas quando "strict" é verdadeiro.
|
---|
públicas abstrato anular resizeInput (int idx, int[] esmaecidos)
Redimensiona a entrada idx-th do modelo nativo para as cores determinadas.
Parâmetros
IDX | |
---|---|
escurece |
Gera
IllegalArgumentException | se idx for negativo ou não for menor que o número
de entradas de modelo, ou se ocorrer um erro ao redimensionar a entrada idx-th.
|
---|
públicas abstrato 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() ). |
Gera
IllegalArgumentException | se input for nulo ou vazio, ou se ocorrer um erro ao
inferência em execução. |
---|---|
IllegalArgumentException | (EXPERIMENTAL, sujeito a alterações) se a inferência for
interrompido por setCancelled(true) .
|
públicas abstrato 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() ). |
Gera
IllegalArgumentException | se inputs for nulo ou vazio, se outputs for
nulo ou se um erro ocorrer ao executar a inferência.
|
---|