InterpreterApi

interfaz pública InterpreterApi
Subclases indirectas conocidas

Interfaz para el intérprete de modelos de TensorFlow Lite, sin incluir métodos experimentales.

Una instancia InterpreterApi encapsula un modelo de TensorFlow Lite entrenado previamente, en el que se ejecutan operaciones para la inferencia del modelo.

Por ejemplo, si un modelo toma solo una entrada y devuelve solo una salida:

try (InterpreterApi interpreter =
     new InterpreterApi.create(file_of_a_tensorflowlite_model)) {
   interpreter.run(input, output);
 }
 

Si un modelo toma múltiples entradas o salidas:

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);
 }
 

Si un modelo toma o produce tensores de cuerda:

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);
 }
 

Tenga en cuenta que hay una distinción entre forma [] y forma [1]. Para salidas de tensor de cadena escalar:

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);
 

Los órdenes de entradas y salidas se determinan al convertir el modelo TensorFlow al modelo TensorFlowLite con Toco, al igual que las formas predeterminadas de las entradas.

Cuando las entradas se proporcionan como matrices (multidimensionales), los tensores de entrada correspondientes se redimensionarán implícitamente de acuerdo con la forma de esa matriz. Cuando las entradas se proporcionan como tipos Buffer , no se realiza ningún cambio de tamaño implícito; la persona que llama debe asegurarse de que el tamaño del byte Buffer coincida con el del tensor correspondiente o que primero cambie el tamaño del tensor a través de resizeInput(int, int[]) . La información sobre la forma y el tipo del tensor se puede obtener a través de la clase Tensor , disponible a través de getInputTensor(int) y getOutputTensor(int) .

ADVERTENCIA: Las instancias InterpreterApi no son seguras para subprocesos.

ADVERTENCIA: una instancia InterpreterApi posee recursos que deben liberarse explícitamente invocando close()

La biblioteca TFLite está construida contra NDK API 19. Puede funcionar para niveles de API de Android por debajo de 19, pero no está garantizado.

Clases anidadas

clase InterpreterApi.Opciones Una clase de opciones para controlar el comportamiento del intérprete en tiempo de ejecución.

Métodos públicos

vacío abstracto
asignar tensores ()
Actualiza explícitamente las asignaciones para todos los tensores, si es necesario.
vacío abstracto
cerrar ()
Libere los recursos asociados con la instancia InterpreterApi .
InterpreterApi estático
crear (opciones Archivo modelFile, InterpreterApi.Options )
Construye una instancia InterpreterApi con el modelo y las opciones especificados.
InterpreterApi estático
crear (opciones ByteBuffer byteBuffer, InterpreterApi.Options )
Construye una instancia InterpreterApi con el modelo y las opciones especificados.
abstracto int
getInputIndex ( String opName)
Obtiene el índice de una entrada dado el nombre de operación de la entrada.
tensor abstracto
getInputTensor (índice de entrada int)
Obtiene el tensor asociado con el índice de entrada proporcionado.
abstracto int
getInputTensorCount ()
Obtiene el número de tensores de entrada.
abstracto largo
getLastNativeInferenceDurationNanosegundos ()
Devuelve el tiempo de inferencia nativo.
abstracto int
getOutputIndex ( Cadena opName)
Obtiene el índice de una salida dado el nombre de operación de la salida.
tensor abstracto
getOutputTensor (índice de salida int)
Obtiene el tensor asociado con el índice de salida proporcionado.
abstracto int
getOutputTensorCount ()
Obtiene el número de tensores de salida.
vacío abstracto
resizeInput (int idx, int[] dims, booleano estricto)
Cambia el tamaño de la entrada idx-ésima del modelo nativo a las dimensiones dadas.
vacío abstracto
resizeInput (int idx, int[] dims)
Cambia el tamaño de la entrada idx-ésima del modelo nativo a las dimensiones dadas.
vacío abstracto
ejecutar (entrada de objeto , salida de objeto )
Ejecuta la inferencia del modelo si el modelo solo toma una entrada y proporciona solo una salida.
vacío abstracto
runForMultipleInputsOutputs ( Objeto [] entradas, Mapa < Entero , Objeto > salidas)
Ejecuta la inferencia del modelo si el modelo toma varias entradas o devuelve varias salidas.

Métodos Heredados

Métodos públicos

public abstract void allocateTensors ()

Actualiza explícitamente las asignaciones para todos los tensores, si es necesario.

Esto propagará las formas y las asignaciones de memoria para los tensores dependientes usando las formas del tensor de entrada como se indica.

Nota: Esta llamada es *puramente opcional*. La asignación de tensores ocurrirá automáticamente durante la ejecución si se ha cambiado el tamaño de los tensores de entrada. Esta llamada es más útil para determinar las formas de cualquier tensor de salida antes de ejecutar el gráfico, por ejemplo,

 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: algunos gráficos tienen resultados con forma dinámica, en cuyo caso es posible que la forma de salida no se propague por completo hasta que se ejecute la inferencia.

Lanza
IllegalStateExceptionIlegalStateException si los tensores del gráfico no se pueden asignar con éxito.

public abstract void cerrar ()

Libere los recursos asociados con la instancia InterpreterApi .

Public Static InterpreterApi create ( Archivo modelFile, InterpreterApi.Opciones opciones)

Construye una instancia InterpreterApi con el modelo y las opciones especificados. El modelo se cargará desde un archivo.

Parámetros
modeloArchivo Un archivo que contiene un modelo TF Lite preentrenado.
opciones Un conjunto de opciones para personalizar el comportamiento del intérprete.
Lanza
Argumento de excepción ilegal si modelFile no codifica un modelo TensorFlow Lite válido.

InterpreterApi estático público crear ( ByteBuffer byteBuffer, opciones de InterpreterApi.Options )

Construye una instancia InterpreterApi con el modelo y las opciones especificados. El modelo se leerá desde un ByteBuffer .

Parámetros
byteBuffer Un modelo TF Lite preentrenado, en formato serializado binario. El ByteBuffer no debe modificarse después de la construcción de una instancia InterpreterApi . El ByteBuffer puede ser un MappedByteBuffer que mapea en memoria un archivo de modelo, o un ByteBuffer directo de nativeOrder() que contiene el contenido de bytes de un modelo.
opciones Un conjunto de opciones para personalizar el comportamiento del intérprete.
Lanza
Argumento de excepción ilegal si byteBuffer no es un MappedByteBuffer ni un ByteBuffer directo de nativeOrder.

public abstract int getInputIndex ( String opName)

Obtiene el índice de una entrada dado el nombre de operación de la entrada.

Parámetros
opName
Lanza
Argumento de excepción ilegal si opName no coincide con ninguna entrada en el modelo utilizado para inicializar el intérprete.

Tensor abstracto público getInputTensor (int inputIndex)

Obtiene el tensor asociado con el índice de entrada proporcionado.

Parámetros
índice de entrada
Lanza
Argumento de excepción ilegal si inputIndex es negativo o no es menor que el número de entradas del modelo.

resumen público int getInputTensorCount ()

Obtiene el número de tensores de entrada.

public abstract Long getLastNativeInferenceDurationNanosegundos ()

Devuelve el tiempo de inferencia nativo.

Lanza
Argumento de excepción ilegal si el intérprete no inicializa el modelo.

public abstract int getOutputIndex ( String opName)

Obtiene el índice de una salida dado el nombre de operación de la salida.

Parámetros
opName
Lanza
Argumento de excepción ilegal si opName no coincide con ningún resultado en el modelo utilizado para inicializar el intérprete.

Tensor abstracto público getOutputTensor (int outputIndex)

Obtiene el tensor asociado con el índice de salida proporcionado.

Nota: Es posible que los detalles del tensor de salida (por ejemplo, la forma) no se llenen por completo hasta que se ejecute la inferencia. Si necesita detalles actualizados *antes* de ejecutar la inferencia (p. ej., después de cambiar el tamaño de un tensor de entrada, lo que puede invalidar las formas del tensor de salida), use allocateTensors() para activar explícitamente la asignación y la propagación de formas. Tenga en cuenta que, para los gráficos con formas de salida que dependen de *valores* de entrada, es posible que la forma de salida no se determine por completo hasta que se ejecute la inferencia.

Parámetros
índice de salida
Lanza
Argumento de excepción ilegal si outputIndex es negativo o no es menor que el número de resultados del modelo.

resumen público int getOutputTensorCount ()

Obtiene el número de tensores de salida.

public abstract void resizeInput (int idx, int[] dims, booleano estricto)

Cambia el tamaño de la entrada idx-ésima del modelo nativo a las dimensiones dadas.

Cuando "estricto" es verdadero, solo se puede cambiar el tamaño de las dimensiones desconocidas. Las dimensiones desconocidas se indican como `-1` en la matriz devuelta por `Tensor.shapeSignature()`.

Parámetros
idx
atenúa
estricto
Lanza
Argumento de excepción ilegal si idx es negativo o no es menor que el número de entradas del modelo; o si se produce un error al cambiar el tamaño de la entrada idx-th. Además, el error ocurre cuando se intenta cambiar el tamaño de un tensor con dimensiones fijas cuando `strict` es True.

public abstract void resizeInput (int idx, int[] dims)

Cambia el tamaño de la entrada idx-ésima del modelo nativo a las dimensiones dadas.

Parámetros
idx
atenúa
Lanza
Argumento de excepción ilegal si idx es negativo o no es menor que el número de entradas del modelo; o si se produce un error al cambiar el tamaño de la entrada idx-th.

ejecución de vacío abstracto público (entrada de objeto , salida de objeto )

Ejecuta la inferencia del modelo si el modelo solo toma una entrada y proporciona solo una salida.

Advertencia: la API es más eficaz si se utiliza un Buffer (preferiblemente directo, pero no obligatorio) como tipo de datos de entrada/salida. Considere usar Buffer para alimentar y obtener datos primitivos para un mejor rendimiento. Se admiten los siguientes tipos Buffer concretas:

  • ByteBuffer : compatible con cualquier tipo de tensor primitivo subyacente.
  • FloatBuffer : compatible con tensores flotantes.
  • IntBuffer : compatible con tensores int32.
  • LongBuffer : compatible con tensores int64.
Tenga en cuenta que los tipos booleanos solo se admiten como matrices, no como Buffer o como entradas escalares.

Parámetros
aporte una matriz o matriz multidimensional, o un Buffer de tipos primitivos, incluidos int, float, long y byte. Buffer es la forma preferida de pasar datos de entrada grandes para tipos primitivos, mientras que los tipos de cadena requieren el uso de la ruta de entrada de matriz (multidimensional). Cuando se usa un Buffer , su contenido debe permanecer sin cambios hasta que se realice la inferencia del modelo, y la persona que llama debe asegurarse de que el Buffer esté en la posición de lectura adecuada. Se permite un valor null solo si la persona que llama está usando un Delegate que permite la interoperabilidad de manejo de búfer, y dicho búfer se ha vinculado al Tensor de entrada.
producción una matriz multidimensional de datos de salida o un Buffer de tipos primitivos, incluidos int, float, long y byte. Cuando se utiliza un Buffer , la persona que llama debe asegurarse de que esté configurado en la posición de escritura adecuada. Se permite un valor nulo y es útil para ciertos casos, por ejemplo, si la persona que llama está usando un Delegate que permite la interoperabilidad del manejo del búfer, y dicho búfer se ha vinculado al Tensor de salida (ver también Interpreter.Options#setAllowBufferHandleOutput(boolean) ), o si el gráfico tiene salidas con forma dinámica y la persona que llama debe consultar la forma Tensor salida después de invocar la inferencia, obteniendo los datos directamente del tensor de salida (a través de Tensor.asReadOnlyBuffer() ).
Lanza
Argumento de excepción ilegal si input es nula o está vacía, o si se produce un error al ejecutar la inferencia.
Argumento de excepción ilegal (EXPERIMENTAL, sujeto a cambios) si setCancelled(true) interrumpe la inferencia.

public abstract void runForMultipleInputsOutputs ( Objeto [] entradas, Mapa < Entero , Objeto > salidas)

Ejecuta la inferencia del modelo si el modelo toma varias entradas o devuelve varias salidas.

Advertencia: la API es más eficaz si se utilizan Buffer s (preferiblemente directos, pero no obligatorios) como tipos de datos de entrada/salida. Considere usar Buffer para alimentar y obtener datos primitivos para un mejor rendimiento. Se admiten los siguientes tipos Buffer concretas:

  • ByteBuffer : compatible con cualquier tipo de tensor primitivo subyacente.
  • FloatBuffer : compatible con tensores flotantes.
  • IntBuffer : compatible con tensores int32.
  • LongBuffer : compatible con tensores int64.
Tenga en cuenta que los tipos booleanos solo se admiten como matrices, no como Buffer o como entradas escalares.

Nota: los valores null para elementos individuales de inputs y outputs solo se permiten si la persona que llama está utilizando un Delegate que permite la interoperabilidad de manejo de búfer, y dicho búfer se ha vinculado a los Tensor de entrada o salida correspondientes.

Parámetros
entradas una matriz de datos de entrada. Las entradas deben estar en el mismo orden que las entradas del modelo. Cada entrada puede ser una matriz o una matriz multidimensional, o un Buffer de tipos primitivos, incluidos int, float, long y byte. Buffer es la forma preferida de pasar datos de entrada de gran tamaño, mientras que los tipos de cadena requieren el uso de la ruta de entrada de matriz (multidimensional). Cuando se usa Buffer , su contenido debe permanecer sin cambios hasta que se realice la inferencia del modelo, y la persona que llama debe asegurarse de que Buffer esté en la posición de lectura adecuada.
salidas un mapa que asigna índices de salida a matrices multidimensionales de datos de salida o Buffer de tipos primitivos, incluidos int, float, long y byte. Solo necesita mantener entradas para las salidas que se utilizarán. Cuando se utiliza un Buffer , la persona que llama debe asegurarse de que esté configurado en la posición de escritura adecuada. El mapa puede estar vacío para los casos en los que se utilizan controladores de búfer para los datos del tensor de salida, o en los casos en que las salidas tienen una forma dinámica y la persona que llama debe consultar la forma Tensor de salida después de invocar la inferencia, obteniendo los datos directamente del tensor de salida ( a través de Tensor.asReadOnlyBuffer() ).
Lanza
Argumento de excepción ilegal si inputs son nulas o están vacías, si outputs son nulas o si se produce un error al ejecutar la inferencia.