InterpreterApi

interfaz pública InterpreterApi
Subcategorías indirectas conocidas

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

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

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

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

Si un modelo acepta varias 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 cadena:

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

Ten en cuenta que hay una distinción entre forma [] y forma[1]. Para resultados de tensores de string 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 pedidos de entrada y salida se determinan cuando se convierte un modelo de TensorFlow en un modelo de TensorFlowLite con Toco, al igual que las formas predeterminadas de las entradas.

Cuando las entradas se proporcionan como arrays (multidimensionales), se cambiará el tamaño de los tensores de entrada correspondientes de manera implícita según la forma del array. Cuando las entradas se proporcionan como tipos Buffer, no se realiza ningún cambio de tamaño implícito; el llamador debe asegurarse de que el tamaño en bytes Buffer coincida con el del tensor correspondiente o primero cambie el tamaño del tensor mediante resizeInput(int, int[]). La información de la forma y el tipo del tensor se puede obtener a través de la clase Tensor, que está disponible a través de getInputTensor(int) y getOutputTensor(int).

ADVERTENCIA: Las instancias InterpreterApi no son seguras para los subprocesos.

ADVERTENCIA: Una instancia InterpreterApi posee recursos que deben liberarse explícitamente mediante la invocación de close()

La biblioteca de TFLite se compila en función de la API 19 del NDK. Es posible que funcione para niveles de API inferiores a 19, pero no está garantizado.

Categorías anidadas

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

Métodos públicos

abstract void
allocateTensors()
Actualiza de manera explícita las asignaciones de todos los tensores, si es necesario.
abstract void
close()
Libera los recursos asociados con la instancia InterpreterApi.
InterpreterApi estática
create(opciones File modelFile, InterpreterApi.Options)
Construye una instancia InterpreterApi con el modelo y las opciones especificados.
InterpreterApi estática
Opciones create(ByteBuffer byteBuffer, InterpreterApi.Options).
Construye una instancia InterpreterApi con el modelo y las opciones especificados.
resumen int
getInputIndex(nombre de operación String)
Obtiene el índice de una entrada según el nombre de la operación de la entrada.
Tensor
getInputTensor(int inputIndex)
Obtiene el tensor asociado con el índice de entrada proporcionado.
resumen int
getInputTensorCount().
Obtiene la cantidad de tensores de entrada.
abstracto Long
getLastNativeInferenceDurationNanoseconds()
Muestra el tiempo de inferencia nativo.
resumen int
getOutputIndex(nombre de operación String)
Obtiene el índice de una salida según el nombre de la operación de la salida.
Tensor
getOutputTensor(int outputIndex)
Obtiene el tensor asociado con el índice de salida proporcionado.
resumen int
getOutputTensorCount()
Obtiene la cantidad de tensores de salida.
abstract void
resizeInput(int idx, int[] dims, boolean strict)
Cambia el tamaño de la entrada idx-th del modelo nativo a las atenuaciones determinadas.
abstract void
resizeInput(int idx, int[] atenuación)
Cambia el tamaño de la entrada idx-th del modelo nativo a las atenuaciones específicas.
abstract void
run(entrada de objeto, salida de objeto)
Ejecuta la inferencia de modelo si el modelo admite solo una entrada y proporciona una sola salida.
abstract void
runForMultipleInputsOutputs(Object[], salidas Map<IntegerObject>)
Ejecuta la inferencia del modelo si este toma varias entradas o muestra varias salidas.

Métodos heredados

Métodos públicos

público abstracto void allocateTensors ()

Actualiza de manera explícita las asignaciones de todos los tensores, si es necesario.

Esto propagará las formas y las asignaciones de memoria para tensores dependientes usando las formas de tensor de entrada correspondientes.

Nota: Esta llamada es *completamente opcional*. La asignación de tensores se producirá automáticamente durante la ejecución si se cambió el tamaño de los tensores de entrada. Esta llamada es más útil para determinar las formas de los tensores de salida antes de ejecutar el grafo, p.ej.,

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

Arroja
IllegalStateException si los tensores del grafo no se pudieron asignar correctamente.

public abstract void close ()

Libera los recursos asociados con la instancia InterpreterApi.

estática pública InterpreterApi create (File modelFile, opciones de InterpreterApi.Options)

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

Parámetros
modelFile Un archivo que contiene un modelo de TF Lite previamente entrenado.
Opciones Un conjunto de opciones para personalizar el comportamiento del intérprete.
Arroja
IllegalArgumentException si modelFile no codifica un modelo de TensorFlow Lite válido.

público estático InterpreterApi create (ByteBuffer byteBuffer, opciones 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 de TF Lite previamente entrenado, en formato binario serializado. El ByteBuffer no se debe modificar después de la construcción de una instancia de InterpreterApi. El ByteBuffer puede ser un MappedByteBuffer que asigna memorias a un archivo de modelo o un ByteBuffer directo de nativeOrder() que incluye el contenido de bytes de un modelo.
Opciones Un conjunto de opciones para personalizar el comportamiento del intérprete.
Arroja
IllegalArgumentException si byteBuffer no es MappedByteBuffer ni un ByteBuffer directo de nativeOrder.

public resumen int getInputIndex (String opName)

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

Parámetros
opName
Arroja
IllegalArgumentException Si opName no coincide con ninguna entrada del modelo que se usó para inicializar el intérprete

resumen público Tensor getInputTensor (int inputIndex)

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

Parámetros
inputIndex
Arroja
IllegalArgumentException si inputIndex es negativo o no es menor que la cantidad de entradas del modelo.

resumen público int getInputTensorCount ()

Obtiene la cantidad de tensores de entrada.

public abstract Long getLastNativeInferenceDurationNanoseconds ()

Muestra el tiempo de inferencia nativo.

Arroja
IllegalArgumentException si el intérprete no inicializa el modelo.

public abstract int getOutputIndex (String opName)

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

Parámetros
opName
Arroja
IllegalArgumentException si opName no coincide con ningún resultado del modelo que se usó para inicializar el intérprete.

resumen público Tensor getOutputTensor (int outputIndex)

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

Nota: Es posible que los detalles del tensor de salida (p.ej., la forma) no se propaguen por completo hasta que se ejecute la inferencia. Si necesitas 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), usa allocateTensors() para activar explícitamente la asignación y la propagación de la forma. Ten 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
outputIndex
Arroja
IllegalArgumentException si outputIndex es negativo o no es menor que la cantidad de salidas del modelo.

resumen público int getOutputTensorCount ()

Obtiene la cantidad de tensores de salida.

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

Cambia el tamaño de la entrada idx-th del modelo nativo a las atenuaciones determinadas.

Cuando `strict` se establece en True, solo se puede cambiar el tamaño de las dimensiones desconocidas. Las dimensiones desconocidas se indican como `-1` en el array que muestra `Tensor.shapeSignature()`.

Parámetros
idx
dims
Estricta
Arroja
IllegalArgumentException si idx es negativo o no es menor que la cantidad de entradas del modelo, o si se produce un error cuando se cambia el tamaño de la entrada idx-th. Además, el error se produce 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-th del modelo nativo a las atenuaciones específicas.

Parámetros
idx
dims
Arroja
IllegalArgumentException si idx es negativo o no es menor que la cantidad de entradas del modelo, o si se produce un error cuando se cambia el tamaño de la entrada idx-th.

public abstract void run (Object input, Object output)

Ejecuta la inferencia de modelo si el modelo admite solo una entrada y proporciona una sola salida.

Advertencia: La API es más eficiente si se usa un Buffer (preferentemente directo, pero no obligatorio) como tipo de datos de entrada/salida. Considera usar Buffer para enviar y recuperar datos básicos y, así, lograr un mejor rendimiento. Se admiten los siguientes tipos concretos de Buffer:

  • ByteBuffer: Es compatible con cualquier tipo de tensor primitivo subyacente.
  • FloatBuffer: compatible con tensores de número de punto flotante.
  • IntBuffer: Es compatible con tensores int32.
  • LongBuffer: Es compatible con tensores int64.
Ten en cuenta que los tipos booleanos solo se admiten como arrays, no como Buffer ni como entradas escalares.

Parámetros
entrada un array o un array 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 los tipos primitivos, mientras que los tipos de cadenas requieren el uso de una ruta de entrada de array (multidimensional). Cuando se usa una Buffer, su contenido no debe modificarse hasta que se complete la inferencia de modelo, y el llamador debe asegurarse de que Buffer esté en la posición de lectura adecuada. Solo se permite un valor null si el llamador usa un Delegate que permite la interoperabilidad del controlador de búfer y si ese búfer se vinculó a la Tensor de entrada.
salida un array multidimensional de datos de salida o un Buffer de tipos primitivos, incluidos int, float, long y byte. Cuando se usa un Buffer, el llamador debe asegurarse de que esté configurada en la posición de escritura adecuada. Se permite un valor nulo, que es útil en determinados casos, p.ej., si el llamador usa un Delegate que permite la interoperabilidad del controlador de búfer y ese búfer se vinculó al Tensor de salida (consulta también Interpreter.Options#setAllowBufferHandleOutput(boolean)), o si el gráfico dio forma a salidas de forma dinámica y el llamador debe consultar la forma Tensor de salida después de invocar la inferencia (recuperando los datos directamente desde el tensor de salida).Tensor.asReadOnlyBuffer()
Arroja
IllegalArgumentException si input es nulo o está vacío, o si se produce un error cuando se ejecuta la inferencia.
IllegalArgumentException (EXPERIMENTAL, sujeto a cambios) si setCancelled(true) interrumpe la inferencia.

public resumen void runForMultipleInputsOutputs (Object[] input, Map<IntegerObject> output).

Ejecuta la inferencia del modelo si este toma varias entradas o muestra varias salidas.

Advertencia: La API es más eficiente si se usan Buffers (preferentemente directos, pero no obligatorios) como tipos de datos de entrada/salida. Considera usar Buffer para enviar y recuperar datos básicos y, así, lograr un mejor rendimiento. Se admiten los siguientes tipos concretos de Buffer:

  • ByteBuffer: Es compatible con cualquier tipo de tensor primitivo subyacente.
  • FloatBuffer: compatible con tensores de número de punto flotante.
  • IntBuffer: Es compatible con tensores int32.
  • LongBuffer: Es compatible con tensores int64.
Ten en cuenta que los tipos booleanos solo se admiten como arrays, no como Buffer ni como entradas escalares.

Nota: Solo se permiten valores null para elementos individuales de inputs y outputs si el llamador usa un Delegate que permite la interoperabilidad de control del búfer y este se vinculó a las Tensor de entrada o salida correspondientes.

Parámetros
ocultas un array de datos de entrada. Las entradas deben estar en el mismo orden que las entradas del modelo. Cada entrada puede ser un array o un array multidimensional, o bien una Buffer de tipos primitivos, como int, float, long y byte. Buffer es la forma preferida de pasar datos de entrada grandes, mientras que los tipos de cadenas requieren el uso de la ruta de entrada de array (multidimensional). Cuando se usa Buffer, su contenido debe permanecer sin cambios hasta que se complete la inferencia de modelo, y el llamador debe asegurarse de que Buffer esté en la posición de lectura adecuada.
salidas una asignación de índices de salida a arrays multidimensionales de datos de salida o Buffer de tipos primitivos, como int, float, long y byte. Solo necesita conservar entradas para que las salidas se usen. Cuando se usa un Buffer, el llamador debe asegurarse de que esté configurada en la posición de escritura adecuada. El mapa puede estar vacío para casos en los que los controladores de búfer se usan para datos del tensor de salida o en los que las salidas tienen una forma dinámica y el llamador debe consultar la forma Tensor de salida después de invocar la inferencia y recuperar los datos directamente desde el tensor de salida (a través de Tensor.asReadOnlyBuffer()).
Arroja
IllegalArgumentException si inputs es nulo o vacío, si outputs es nulo, o si se produce un error cuando se ejecuta la inferencia.