InterpreterApi

公共接口 InterpreterApi
已知的间接子类

TensorFlow Lite 模型解释器的接口,不包括实验性方法。

InterpreterApi 实例封装了一个预训练的 TensorFlow Lite 模型,其中 以执行模型推断。

例如,如果模型仅接受一个输入并仅返回一个输出:

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

如果模型接受多个输入或输出:

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

如果模型采用或生成字符串张量:

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

请注意,形状 [] 和形状 [1] 是有区别的。对于标量字符串张量 输出:

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

将 TensorFlow 模型转换为 TensorFlowLite 时确定输入和输出的顺序 以及输入的默认形状。

当输入作为(多维)数组提供时,对应的输入张量将 根据该数组的形状隐式调整大小。当输入作为 Buffer 类型提供时,系统不会隐式调整大小;调用方必须确保 Buffer 字节大小与相应张量的大小一致,或者先确保 通过 resizeInput(int, int[]) 调整张量的大小。张量形状和类型信息 通过 Tensor 类获取,可通过 getInputTensor(int)getOutputTensor(int) 获取。

警告InterpreterApi 实例不是线程安全的。

警告InterpreterApi 实例拥有的资源必须 通过调用 close() 明确释放

TFLite 库是针对 NDK API 19 构建的。它可能适用于低于 Android API 级别 19、 但不保证一定如此

嵌套类

类别 InterpreterApi.Options 用于控制运行时解释器行为的选项类。

公共方法

抽象 无效
allocateTensors()
如有必要,显式更新所有张量的分配。
抽象 无效
close()
释放与 InterpreterApi 实例关联的资源。
静态 InterpreterApi
create(File modelFile, InterpreterApi.Options 选项)
使用指定的模型和选项构造 InterpreterApi 实例。
静态 InterpreterApi
create(ByteBuffer byteBuffer, InterpreterApi.Options 选项)
使用指定的模型和选项构造 InterpreterApi 实例。
抽象 整数
getInputIndex(String opName)
根据输入的操作名称获取该输入的索引。
抽象 Tensor
getInputTensor(int inputIndex)
获取与提供的输入索引关联的张量。
抽象 整数
getInputTensorCount()
获取输入张量的数量。
抽象
getLastNativeInferenceDurationNanoseconds()
返回原生推理时间。
抽象 整数
getOutputIndex(String opName)
根据输出的操作名称,获取该输出的索引。
抽象 Tensor
getOutputTensor(int outputIndex)
获取与提供的输出索引关联的张量。
抽象 整数
getOutputTensorCount()
获取输出张量的数量。
抽象 无效
resizeInput(int idx, int[] dims, boolean strict)
将原生模型第 idx 个输入的大小调整为指定的维度。
抽象 无效
resizeInput(int idx, int[] dims)resizeInput
将原生模型第 idx 个输入的大小调整为指定的维度。
抽象 无效
run对象输入,Object 输出)
如果模型仅采用一项输入且仅提供一个输出,则运行模型推断。
抽象 无效
runForMultipleInputsOutputs(Object[] 输入, Map<IntegerObject> 输出)
如果模型采用多项输入或返回多个输出,则运行模型推断。

继承的方法

公共方法

<ph type="x-smartling-placeholder"></ph> 公开 抽象 无效 allocateTensors ()

如有必要,显式更新所有张量的分配。

这将使用输入传递依赖张量的形状和内存分配 张量形状。

注意:此调用 *纯属可选*。张量分配会在运行过程中 调整任何输入张量的大小。这种调用最有助于确定 输出张量的形状,例如

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

注意:有些图表具有动态形状的输出,在这种情况下,输出形状可能 直到执行推理为止。

抛出
IllegalStateException 如果无法成功分配图的张量,则会发生该错误。

<ph type="x-smartling-placeholder"></ph> 公开 抽象 无效 关闭 ()

释放与 InterpreterApi 实例关联的资源。

<ph type="x-smartling-placeholder"></ph> 公开 静态 InterpreterApi 创建 文件 modelFile,InterpreterApi.Options 选项)

使用指定的模型和选项构造 InterpreterApi 实例。模型 会从文件中加载

参数
modelFile 包含预训练 TF Lite 模型的文件。
选项 一组用于自定义解释器行为的选项。
抛出
IllegalArgumentException 如果 modelFile 未对有效的 TensorFlow Lite 进行编码,则会发生此错误 模型。

<ph type="x-smartling-placeholder"></ph> 公开 静态 InterpreterApi 创建 ByteBuffer byteBuffer,InterpreterApi.Options 选项)

使用指定的模型和选项构造 InterpreterApi 实例。模型 将从 ByteBuffer 中读取。

参数
byteBuffer 预训练的 TF Lite 模型,采用二进制序列化形式。ByteBuffer 应 在构建 InterpreterApi 实例后不可修改。ByteBuffer 可以是对模型文件进行内存映射的 MappedByteBuffer,也可以是 包含模型的字节内容的 nativeOrder() 的直接 ByteBuffer
选项 一组用于自定义解释器行为的选项。
抛出
IllegalArgumentException 如果 byteBuffer 既不是 MappedByteBuffer,也不是 nativeOrder 的直接 ByteBuffer

<ph type="x-smartling-placeholder"></ph> 公开 抽象 整数 getInputIndex (String opName)

根据输入的操作名称获取该输入的索引。

参数
opName
抛出
IllegalArgumentException 如果 opName 与所用模型中的任何输入都不匹配 来初始化解释器。

<ph type="x-smartling-placeholder"></ph> 公开 抽象 Tensor getInputTensor (int inputIndex)

获取与提供的输入索引关联的张量。

参数
inputIndex
抛出
IllegalArgumentException 如果 inputIndex 为负数或不小于 模型输入的数量。

<ph type="x-smartling-placeholder"></ph> 公开 抽象 整数 getInputTensorCount ()

获取输入张量的数量。

<ph type="x-smartling-placeholder"></ph> 公开 抽象 长版 getLastNativeInferenceDurationNanoseconds ()

返回原生推理时间。

抛出
IllegalArgumentException 如果解释器未初始化模型。

<ph type="x-smartling-placeholder"></ph> 公开 抽象 整数 getOutputIndex (String opName)

根据输出的操作名称,获取该输出的索引。

参数
opName
抛出
IllegalArgumentException 如果 opName 与所用模型中的任何输出都不匹配 来初始化解释器。

<ph type="x-smartling-placeholder"></ph> 公开 抽象 Tensor getOutputTensor (int outputIndex)

获取与提供的输出索引关联的张量。

注意:只有在推理之后,输出张量详细信息(例如形状)才能完全填充。 。如果您需要在运行推理 *之前* 更新详细信息(例如,调整 输入张量,这可能会导致输出张量形状失效),请使用 allocateTensors() 来 以显式方式触发分配和形状传播。请注意,对于具有输出形状的图, 取决于输入 *值*, 运行推理。

参数
outputIndex
抛出
IllegalArgumentException 如果 outputIndex 为负数或不小于 模型输出的数量。

<ph type="x-smartling-placeholder"></ph> 公开 抽象 整数 getOutputTensorCount ()

获取输出张量的数量。

<ph type="x-smartling-placeholder"></ph> 公开 抽象 无效 resizeInput (int idx, int[] dims, 布尔值严格)

将原生模型第 idx 个输入的大小调整为指定的维度。

当 `strict` 为 True 时,只能调整未知尺寸。未知维度 在 `Tensor.shapeSignature()` 返回的数组中以 `-1` 表示。

参数
IDX
调暗
严格
抛出
IllegalArgumentException 如果 idx 为负数或不小于数字 模型输入;或是在调整第 idx 输入大小时出错。此外,此错误 当 `strict` 为 True 时,尝试调整具有固定维度的张量大小时,会发生此错误。

<ph type="x-smartling-placeholder"></ph> 公开 抽象 无效 resizeInput (int idx, int[] dims)

将原生模型第 idx 个输入的大小调整为指定的维度。

参数
IDX
调暗
抛出
IllegalArgumentException 如果 idx 为负数或不小于数字 模型输入;或是在调整第 idx 输入大小时出错。

<ph type="x-smartling-placeholder"></ph> 公开 抽象 无效 运行 对象输入,对象输出)

如果模型仅采用一项输入且仅提供一个输出,则运行模型推断。

警告:如果 Buffer(最好是直接调用,但不是必需的),此 API 会更高效 用作输入/输出数据类型。请考虑使用 Buffer 进行 Feed 和提取 原始数据,以获得更好的性能。以下具体的 Buffer 类型 支持:

  • ByteBuffer - 与任何底层原始张量类型兼容。
  • FloatBuffer - 与浮点张量兼容。
  • IntBuffer - 与 int32 张量兼容。
  • LongBuffer - 与 int64 张量兼容。
。 请注意,布尔值类型仅支持数组,不支持 Buffer 或标量输入。

参数
输入 数组或多维数组,或基元类型的 Buffer 包括 int、float、long 和 byteBuffer 是将大型文件 原始类型的输入数据,而字符串类型需要使用 (多维) 数组输入路径。使用 Buffer 时,其内容应保持不变, 模型推断已完成,调用方必须确保 Buffer 位于 适当的读取位置。仅当调用方使用null Delegate,它允许缓冲区句柄互操作,并且此类缓冲区已绑定到 输入 Tensor
output 输出数据的多维数组,或基元类型的 Buffer 包括 int、float、long 和 byte使用 Buffer 时,调用方必须确保 设置适当的写入位置。允许 null 值,这适用于 在某些情况下,例如,如果调用方使用允许缓冲区句柄的 Delegate 互操作性,并且此类缓冲区已绑定到输出 Tensor(另请参阅 Interpreter.Options#setAllowBufferHandleOutput(boolean)), 或者,如果图具有动态形状的输出,并且调用方必须在调用推理后查询输出 Tensor 形状,则直接从输出中提取数据 张量(通过 Tensor.asReadOnlyBuffer())。
抛出
IllegalArgumentException 如果 input 为 null 或为空,或者在以下情况下发生错误 运行推理。
IllegalArgumentException (实验性,可能会发生变化)如果推断 被“setCancelled(true)”中断。

<ph type="x-smartling-placeholder"></ph> 公开 抽象 无效 runForMultipleInputsOutputs (Object[] 输入、映射<整数Object> 输出)

如果模型采用多项输入或返回多个输出,则运行模型推断。

警告:如果存在 Buffers(最好是直接连接,但不是必需的),该 API 会更加高效 用作输入/输出数据类型。请考虑使用 Buffer 进行 Feed 和提取 原始数据,以获得更好的性能。以下具体的 Buffer 类型 支持:

  • ByteBuffer - 与任何底层原始张量类型兼容。
  • FloatBuffer - 与浮点张量兼容。
  • IntBuffer - 与 int32 张量兼容。
  • LongBuffer - 与 int64 张量兼容。
。 请注意,布尔值类型仅支持数组,不支持 Buffer 或标量输入。

注意:inputsoutputs 具体元素的 null 值为 仅当调用方使用允许缓冲区句柄互操作功能的 Delegate 时,才允许 此类缓冲区已绑定到相应的输入或输出Tensor

参数
输入 输入数据的数组。输入的顺序应与 模型。每个输入可以是数组、多维数组,也可以是Buffer 包括 int、float、long 和 byte 在内的基元类型。Buffer是首选方式 来传递大量输入数据,而字符串类型则需要使用(多维)数组 输入路径。使用 Buffer 时,其内容应保持不变,直到模型 推理已完成,调用方必须确保 Buffer 位于适当的位置, 读取位置。
输出 将输出索引映射到多维输出数据数组或基元类型(包括 int、float、long 和 byte)的 Buffer 的映射。它只需要保持 输入的条目。使用 Buffer 时,调用方必须确保 设置适当的写入位置。在出现以下任一情况时,映射可能为空 缓冲区句柄用于输出张量数据,或者输出动态 形状,并且调用方必须在推断完成后查询输出 Tensor 形状 调用,直接从输出张量提取数据(通过 Tensor.asReadOnlyBuffer())。
抛出
IllegalArgumentException 如果 inputs 为 null 或为空,如果 outputs 为 null,或者如果在运行推理时发生错误。