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 | |
abstracto anular |
runForMultipleInputsOutputs(entradas Object[], Map<Integer, Object> 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.
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 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() ). |
Arroja
IllegalArgumentException. | si inputs es nulo o está vacío, si outputs es
null, o si se produce un error al ejecutar la inferencia.
|
---|