Interpreter

clase final pública Intérprete

Clase de controlador para controlar el modelo de inferencia con TensorFlow Lite.

Nota: Si no necesitas acceso a ninguno de los controles de las funciones de API que se mencionan a continuación, es preferible que utilices InterpreterApi e InterpreterFactory en lugar de usar Interpreter directamente.

Un Interpreter encapsula un modelo de TensorFlow Lite previamente entrenado, en el que las operaciones se ejecutan para la inferencia de modelos.

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

try (Interpreter interpreter = new Interpreter(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 (Interpreter interpreter = new Interpreter(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 (Interpreter interpreter = new Interpreter(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 Buffer tipos, no se realiza ningún cambio de tamaño implícito; el llamador debe asegurarse de que el tamaño de Buffer bytes coincida con el del tensor correspondiente o que primero cambien el tamaño del tensor con resizeInput(int, int[]). La información de la forma y el tipo de tensor se puede obtener a través de la clase Tensor, disponible a través de getInputTensor(int) y getOutputTensor(int).

ADVERTENCIA: Las instancias Interpreter no son seguras para los subprocesos. Un Interpreter es propietario de recursos que deben liberarse explícitamente 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 Interpreter.Options Una clase de opciones para controlar el comportamiento del intérprete del entorno de ejecución.

Constructores públicos

Intérprete(File modelFile)
Inicializa un Interpreter.
Interpreter(File modelFile, Interpreter.Options opciones)
Inicializa un Interpreter y especifica las opciones para personalizar el comportamiento del intérprete.
Intérprete(ByteBuffer byteBuffer)
Inicializa un Interpreter con un ByteBuffer de un archivo de modelo.
Interpreter(ByteBuffer, byteBuffer, opciones Interpreter.Options)
Inicializa un Interpreter con un ByteBuffer de un archivo de modelo y un conjunto de Interpreter.Options personalizado.

Métodos públicos

void
allocateTensors()
Actualiza de forma explícita las asignaciones para todos los tensores, si es necesario.
void
close()
Libera los recursos asociados con la instancia InterpreterApi.
int
getInputIndex(opName de String)
Obtiene el índice de una entrada según el nombre de operación de la entrada.
Tensor
getInputTensor(int inputIndex)
Obtiene el tensor asociado con el índice de entrada proporcionado.
int
getInputTensorCount()
Obtiene la cantidad de tensores de entrada.
Tensor
getInputTensorFromSignature(String inputName, String signatureKey)
Obtiene el Tensor asociado con el nombre de entrada y el nombre del método de firma proporcionados.
Versión larga
getLastNativeInferenceDurationNanoseconds()
Muestra el tiempo de inferencia nativo.
int
getOutputIndex(opName de String)
Obtiene el índice de una salida según el nombre de operación de la salida.
Tensor
getOutputTensor(int outputIndex)
Obtiene el tensor asociado con el índice de salida proporcionado.
int
getOutputTensorCount()
Obtiene la cantidad de tensores de salida.
Tensor
getOutputTensorFromSignature(String outputName, String signatureKey)
Obtiene el Tensor asociado con el nombre de salida proporcionado en el método de firma específico.
String[]
getSignatureInputs(String signatureKey)
Obtiene la lista de entradas de SignatureDefs para el método signatureKey.
String[]
getSignatureKeys()
Obtiene la lista de nombres de métodos exportados de SignatureDef disponibles en el modelo.
String[]
getSignatureOutputs(String signatureKey)
Obtiene la lista de resultados de SignatureDefs para el método signatureKey.
void
resetVariableTensors()
Avanzado: restablece todos los tensores de variables al valor predeterminado.
void
resizeInput(int idx, int[] dims, boolean strict)
Cambia el tamaño de la entrada idx-th del modelo nativo a los difuminados determinados.
void
resizeInput(int idx, int[] atenuación)
Cambia el tamaño de la entrada idx-th del modelo nativo a los difuminados determinados.
void
run(entrada de Objeto, salida de objeto)
Ejecuta la inferencia de modelo si el modelo toma solo una entrada y proporciona solo una salida.
void
runForMultipleInputsOutputs(entradas Object[], Map<IntegerObject> salidas)
Ejecuta la inferencia de modelo si el modelo toma varias entradas o muestra varias salidas.
void
runSignature(Map<StringObject> entradas, Map<StringObject> salidas)
Es igual que runSignature(Map, Map, String), pero no requiere pasar una signatureKey. suponiendo que el modelo tiene una SignatureDef.
void
runSignature(Map<StringObject> Para entradas, Map<StringObject> output, String signatureKey)
Ejecuta la inferencia de modelo basada en SignatureDef proporcionado a través de signatureKey.
void
setCancelled(booleano cancelado)
Avanzado: Interrumpe la inferencia en medio de una llamada a run(Object, Object).

Métodos heredados

Constructores públicos

público Intérprete (Archivo modelFile)

Inicializa un Interpreter.

Parámetros
modelFile un archivo de un modelo de TF Lite previamente entrenado.
Arroja
IllegalArgumentException. si modelFile no codifica un TensorFlow Lite válido un modelo de responsabilidad compartida.

público Intérprete (opciones de File modelFile, Interpreter.Options).

Inicializa un Interpreter y especifica las opciones para personalizar el comportamiento del intérprete.

Parámetros
modelFile un archivo de 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 Intérprete (ByteBuffer byteBuffer)

Inicializa un Interpreter con un ByteBuffer de un archivo de modelo.

No se debe modificar ByteBuffer después de la construcción de un Interpreter. 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

Parámetros
byteBuffer
Arroja
IllegalArgumentException. si byteBuffer no es MappedByteBuffer ni ByteBuffer directo de nativeOrder.

público Intérprete (ByteBuffer byteBuffer, opciones de Interpreter.Options)

Inicializa un Interpreter con un ByteBuffer de un archivo de modelo y un conjunto de Interpreter.Options personalizado.

No se debe modificar ByteBuffer después de crear un Interpreter. El ByteBuffer puede ser un MappedByteBuffer que asigna memorias un archivo de modelo o un ByteBuffer directo de nativeOrder() que contenga el contenido en bytes de un modelo.

Parámetros
byteBuffer
opciones
Arroja
IllegalArgumentException. si byteBuffer no es MappedByteBuffer ni ByteBuffer directo de nativeOrder.

Métodos públicos

público 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.

público anular cerrar ()

Libera los recursos asociados con la instancia InterpreterApi.

público 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

público Tensor . getInputTensor (int inputIndex)

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

Parámetros
inputIndex

público número entero getInputTensorCount ()

Obtiene la cantidad de tensores de entrada.

público Tensor . getInputTensorFromSignature (String inputName, String signatureKey)

Obtiene el Tensor asociado con el nombre de entrada y el nombre del método de firma proporcionados.

ADVERTENCIA: Esta es una API experimental y está sujeta a cambios.

Parámetros
inputName Ingresa el nombre en la firma.
signatureKey La clave de firma que identifica SignatureDef puede ser nula si el modelo tiene una firma.
Arroja
IllegalArgumentException. si inputName o signatureKey son nulos o están vacíos, o no válido.

público Largo . getLastNativeInferenceDurationNanoseconds ()

Muestra el tiempo de inferencia nativo.

público 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

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

público número entero getOutputTensorCount ()

Obtiene la cantidad de tensores de salida.

público Tensor . getOutputTensorFromSignature (String outputName, String signatureKey)

Obtiene el Tensor asociado con el nombre de salida proporcionado en el método de firma específico.

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.

ADVERTENCIA: Esta es una API experimental y está sujeta a cambios.

Parámetros
outputName Nombre de salida en la firma.
signatureKey La clave de firma que identifica SignatureDef puede ser nula si el modelo tiene una firma.
Arroja
IllegalArgumentException. si outputName o signatureKey son nulos o se proporcionó un nombre vacío o no válido.

público String[] . getSignatureInputs (Cadena signatureKey)

Obtiene la lista de entradas de SignatureDefs para el método signatureKey.

ADVERTENCIA: Esta es una API experimental y está sujeta a cambios.

Parámetros
signatureKey

público String[] . getSignatureKeys ()

Obtiene la lista de nombres de métodos exportados de SignatureDef disponibles en el modelo.

ADVERTENCIA: Esta es una API experimental y está sujeta a cambios.

público String[] . getSignatureOutputs (Cadena signatureKey)

Obtiene la lista de resultados de SignatureDefs para el método signatureKey.

ADVERTENCIA: Esta es una API experimental y está sujeta a cambios.

Parámetros
signatureKey

público anular resetVariableTensors ()

Avanzado: restablece todos los tensores de variables al valor predeterminado.

Si un tensor de variable no tiene un búfer asociado, se restablecerá a cero.

ADVERTENCIA: Esta es una API experimental y está sujeta a cambios.

público 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

público 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

público 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()).

público 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()).

público anular runSignature (Map<StringObject> entradas, Map<StringObject> output)

Es igual que runSignature(Map, Map, String), pero no requiere pasar una signatureKey. suponiendo que el modelo tiene una SignatureDef. Si el modelo tiene más de una SignatureDef, arroja una excepción.

ADVERTENCIA: Esta es una API experimental y está sujeta a cambios.

Parámetros
ocultas
resultados

público anular runSignature (Map<String, Object> entradas, Map<String, Object>, resultados, String signatureKey)

Ejecuta la inferencia de modelo basada en SignatureDef proporcionado a través de signatureKey.

Consulta run(Object, Object) para obtener más detalles sobre la entrada y la salida permitidas. tipos de datos.

ADVERTENCIA: Esta es una API experimental y está sujeta a cambios.

Parámetros
ocultas Una asignación del nombre de entrada en SignatureDef a un objeto de entrada.
resultados Un mapa del nombre de salida en SignatureDef para generar datos. Puede estar vacío si el elemento el llamador desea consultar los datos de Tensor directamente después de la inferencia (p.ej., si el la forma es dinámica, o se usan controladores de búfer de salida).
signatureKey Clave de firma que identifica SignatureDef.
Arroja
IllegalArgumentException. si inputs es nulo o está vacío, si outputs o signatureKey es nulo, o si se produce un error cuando se ejecuta la inferencia.

público anular setCancelled (booleano cancelado)

Avanzado: Interrumpe la inferencia en medio de una llamada a run(Object, Object).

Se establecerá una marca de cancelación como verdadera cuando se llame a esta función. El intérprete revisa la marca entre invocaciones de Op. Si está en true, el intérprete se detendrá ejecución. El intérprete permanecerá en un estado cancelado hasta que se lo "anule" de forma explícita. de la siguiente manera: setCancelled(false)

ADVERTENCIA: Esta es una API experimental y está sujeta a cambios.

Parámetros
cancelado true para cancelar la inferencia de la mejor manera posible; false a a tu currículum.
Arroja
IllegalStateException si el intérprete no se inicializó con la función que está desactivada de forma predeterminada.