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
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 | |
void |
runForMultipleInputsOutputs(entradas Object[], Map<Integer, Object> salidas)
Ejecuta la inferencia de modelo si el modelo toma varias entradas o muestra varias salidas.
|
void |
runSignature(Map<String, Object> entradas, Map<String, Object> salidas)
Es igual que
runSignature(Map, Map, String) , pero no requiere pasar una signatureKey.
suponiendo que el modelo tiene una SignatureDef. |
void | |
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.
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 entero, Salidas> 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.
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<String, Object> entradas, Map<String, Object> 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. |
---|