InterpreterApi

interfaz pública InterpreterApi
Subcategorías indirectas conocidas

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

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

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 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 cadenas, sucede lo siguiente:

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 tensor de string escalar resultados:

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 entradas y salidas se determinan cuando se convierte el modelo de TensorFlow a TensorFlowLite con Toco, al igual que las formas predeterminadas de las entradas.

Cuando las entradas se proporcionan como arrays (multidimensionales), los tensores de entrada correspondientes de forma 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 de los bytes Buffer coincida con el del tensor correspondiente o de que primero cambiar el tamaño del tensor con resizeInput(int, int[]) La forma y la información de los tensores se pueden que se obtienen 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 los subprocesos.

ADVERTENCIA: Una instancia InterpreterApi posee recursos que deben ser se libera de forma explícita invocando close()

La biblioteca de TFLite se compiló en función de la API de NDK 19. Es posible que funcione con niveles de API inferiores a 19, pero no está garantizada.

Categorías anidadas

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

Métodos públicos

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

Métodos heredados

Métodos públicos

público abstracto anular allocateTensors ()

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

Esto propagará formas y asignaciones de memoria para tensores dependientes usando la entrada formas de tensores tal y como se presentan.

Nota: Esta llamada es *completamente opcional*. La asignación de tensor ocurrirá automáticamente durante la ejecución si se cambió el tamaño de algún tensor de entrada. Este llamado es muy útil para determinar la formas para cualquier tensor 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 con forma dinámica, en cuyo caso, es posible que la forma de salida no propagarse por completo hasta que se ejecute la inferencia.

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

público abstracto anular cerrar ()

Libera los recursos asociados con la instancia InterpreterApi.

público estático InterpreterApi . crear (File modelFile, InterpreterApi.Options opciones)

Construye una instancia de 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 de los intérpretes.
Arroja
IllegalArgumentException. si modelFile no codifica un TensorFlow Lite válido un modelo de responsabilidad compartida.

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

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

Parámetros
byteBuffer Un modelo de TF Lite previamente entrenado, en formato binario serializado. ByteBuffer debe no se modificará después de la construcción de una instancia de InterpreterApi. El ByteBuffer puede ser un MappedByteBuffer que mapea a la memoria un archivo de modelo o un ByteBuffer directo de nativeOrder() que contenga el contenido de bytes de un modelo
opciones Un conjunto de opciones para personalizar el comportamiento de los intérpretes.
Arroja
IllegalArgumentException. si byteBuffer no es MappedByteBuffer ni ByteBuffer directo de nativeOrder.

público abstracto número entero getInputIndex (Nombre de la operación de cadena)

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

Parámetros
opName
Arroja
IllegalArgumentException. si opName no coincide con ninguna entrada en el modelo que se usa para inicializar el intérprete.

público abstracto 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 el cantidad de entradas del modelo.

público abstracto número entero getInputTensorCount ()

Obtiene la cantidad de tensores de entrada.

público abstracto Largo . getLastNativeInferenceDurationNanoseconds ()

Muestra el tiempo de inferencia nativo.

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

público abstracto número entero getOutputIndex (Nombre de la operación de cadena)

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

Parámetros
opName
Arroja
IllegalArgumentException. si opName no coincide con ninguna salida en el modelo que se usó. para inicializar el intérprete.

público abstracto 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 completen por completo hasta después de la inferencia ejecutado. Si necesitas detalles actualizados *antes* de ejecutar la inferencia (p.ej., después de cambiar el tamaño de un tensor de entrada, que puede invalidar formas de tensor de salida), usa allocateTensors() para activar de forma explícita la asignación y la propagación de formas. Ten en cuenta que, para los gráficos con formas de salida que dependen de *valores* de entrada, es posible que la forma de la salida no se determine por completo hasta ejecutar la inferencia.

Parámetros
outputIndex
Arroja
IllegalArgumentException. si outputIndex es negativo o no es menor que el cantidad de salidas del modelo.

público abstracto número entero getOutputTensorCount ()

Obtiene la cantidad de tensores de salida.

público abstracto anular resizeInput (int idx, int[] atenuación, booleano estricto)

Cambia el tamaño de la entrada idx-th del modelo nativo a los difuminados determinados.

Cuando el valor "strict" es "True", solo se puede cambiar el tamaño de las dimensiones desconocidas. Las dimensiones desconocidas son se indica como `-1` en el array que devuelve `Tensor.shapeSignature()`.

Parámetros
idx
atenúa
Estricta
Arroja
IllegalArgumentException. si idx es negativo o no es menor que el número de las 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.

público abstracto anular resizeInput (int idx, int[] atenuar)

Cambia el tamaño de la entrada idx-th del modelo nativo a los difuminados determinados.

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

público abstracto anular correr (Entrada de objetos, Objetos de salida)

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

Advertencia: La API es más eficiente si se aplica Buffer (de preferencia, directa, pero no obligatoria). se usa como el tipo de datos de entrada/salida. Te recomendamos usar Buffer para el feed y la recuperación. datos básicos para lograr un mejor rendimiento. Los siguientes tipos concretos de Buffer son compatibles:

  • ByteBuffer: Es compatible con cualquier tipo primitivo de tensor subyacente.
  • FloatBuffer: Es compatible con tensores de número de punto flotante.
  • IntBuffer: Es compatible con los tensores int32.
  • LongBuffer: Es compatible con los tensores int64.
Ten en cuenta que los tipos booleanos solo se admiten como arrays, no 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 manera preferida de pasar datos de entrada para tipos primitivos, mientras que los tipos de cadena requieren el uso de la ruta de entrada del array. Cuando se usa un Buffer, su contenido no debe cambiar hasta se completa la inferencia de modelo, y el llamador debe asegurarse de que Buffer esté en el 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 dicho búfer se vinculó al la entrada Tensor.
output 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 que tiene configurada la posición de escritura adecuada. Se permite un valor nulo, y es útil para ciertos casos, p.ej., si el llamador usa un Delegate que permite el controlador del búfer y que dicho búfer se vinculó al Tensor de salida (consulta también Interpreter.Options#setAllowBufferHandleOutput(boolean)), o si el grafo tiene resultados con forma dinámica y el llamador debe consultar la forma Tensor de salida después de que se haya invocado la inferencia y recuperar los datos directamente desde la salida. tensor (a través de Tensor.asReadOnlyBuffer()).
Arroja
IllegalArgumentException. si input es nulo o está vacío, o si se produce un error cuando ejecutar la inferencia.
IllegalArgumentException. (EXPERIMENTAL, sujeto a cambios) si la inferencia es interrumpida por setCancelled(true).

público abstracto anular runForMultipleInputsOutputs (entradas Objeto[], Map<Número enteroSalidas> Objeto)

Ejecuta la inferencia de modelo si el modelo toma varias entradas o muestra varias salidas.

Advertencia: La API es más eficiente si se usan Buffer (de preferencia, directa, pero no obligatoria). se usan como tipos de datos de entrada y salida. Te recomendamos usar Buffer para el feed y la recuperación. datos básicos para lograr un mejor rendimiento. Los siguientes tipos concretos de Buffer son compatibles:

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

Nota: Los valores de null para elementos individuales de inputs y outputs son los siguientes: se permite solo si el llamador usa un Delegate que permite la interoperabilidad del controlador del búfer dicho búfer 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 de la un modelo de responsabilidad compartida. Cada entrada puede ser un array o un array multidimensional, o un Buffer de tipos primitivos, como int, float, long y byte. Buffer es la forma preferida. para pasar datos de entrada grandes, mientras que los tipos de cadena requieren el uso del array (multidimensional) ruta de entrada. Cuando se usa Buffer, su contenido no debe cambiar hasta que se modele se realice la inferencia, y el llamador debe asegurarse de que Buffer esté en el posición de lectura.
resultados Un mapa de 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 mantener las entradas que se usarán. Cuando se usa un Buffer, el llamador debe asegurarse que tiene configurada la posición de escritura adecuada. El mapa puede estar vacío para los casos en los que los controladores del búfer se usan para datos de tensor de salida o casos en los que las salidas y el llamador debe consultar el resultado de la forma Tensor después de que se haya realizado la inferencia se invocan y recuperan los datos directamente desde el tensor de salida (mediante Tensor.asReadOnlyBuffer()).
Arroja
IllegalArgumentException. si inputs es nulo o está vacío, si outputs es null, o si se produce un error al ejecutar la inferencia.