Interpreter

公共最终类 口译

驱动程序类,通过 TensorFlow Lite 推动模型推断。

注意:如果您不需要访问任何“实验性”以下 API 功能,建议使用 InterpreterApi 和 InterpreterFactory,而不是直接使用 Interpreter。

Interpreter 封装了预训练的 TensorFlow Lite 模型,其中操作 以进行模型推断。

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

try (Interpreter interpreter = new Interpreter(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 (Interpreter interpreter = new Interpreter(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 (Interpreter interpreter = new Interpreter(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) 获取。

警告Interpreter 实例不是线程安全的。Interpreter 拥有所有必须通过调用 close() 明确释放的资源。

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

嵌套类

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

公共构造函数

Interpreter(文件 modelFile)
初始化 Interpreter
InterpreterFile modelFile、Interpreter.Options 选项)
初始化 Interpreter 并指定用于自定义解释器行为的选项。
Interpreter(ByteBuffer byteBuffer)
使用模型文件的 ByteBuffer 初始化 Interpreter
InterpreterByteBuffer byteBuffer、Interpreter.Options 选项)
使用模型文件的 ByteBuffer 和一组Interpreter 自定义 Interpreter.Options

公共方法

无效
allocateTensors()
如有必要,显式更新所有张量的分配。
无效
close()
释放与 InterpreterApi 实例关联的资源。
整数
getInputIndex(String opName)
根据输入的操作名称获取该输入的索引。
Tensor
getInputTensor(int inputIndex)
获取与提供的输入索引关联的张量。
整数
getInputTensorCount()
获取输入张量的数量。
Tensor
getInputTensorFromSignature(String inputName, String特定签名 Key)
获取与提供的输入名称和签名方法名称相关联的张量。
getLastNativeInferenceDurationNanoseconds()
返回原生推理时间。
整数
getOutputIndex(String opName)
根据输出的操作名称,获取该输出的索引。
Tensor
getOutputTensor(int outputIndex)
获取与提供的输出索引关联的张量。
整数
getOutputTensorCount()
获取输出张量的数量。
Tensor
getOutputTensorFromSignature(String outputName, String signatureKey)
获取与特定签名方法中提供的输出名称相关联的张量。
String[]
getSignatureInputs(String signedKey)
获取方法 signatureKey 的 SignatureDefs 输入列表。
String[]
getSignatureKeys()
获取模型中可用的 SignatureDef 导出方法名称列表。
String[]
getSignatureOutputs(String signatureKey)
获取方法 signatureKey 的 SignatureDefs 输出列表。
无效
resetVariableTensors()
高级:将所有变量张量重置为默认值。
无效
resizeInput(int idx, int[] dims, boolean strict)
将原生模型第 idx 个输入的大小调整为指定的维度。
无效
resizeInput(int idx, int[] dims)resizeInput
将原生模型第 idx 个输入的大小调整为指定的维度。
无效
run对象输入,Object 输出)
如果模型仅采用一项输入且仅提供一个输出,则运行模型推断。
无效
runForMultipleInputsOutputs(Object[] 输入, Map<IntegerObject> 输出)
如果模型采用多项输入或返回多个输出,则运行模型推断。
无效
runSignature(Map<StringObject> 输入, Map<StringObject> 输出)
runSignature(Map, Map, String) 相同,但不需要传递 signedKey。 假设模型有一个 SignatureDef。
无效
runSignature(Map<StringObject>输入, Map<StringObject> 输出, StringsignatureKey)
根据通过 signatureKey 提供的 SignatureDef 运行模型推断。
无效
setCancelled(已取消布尔值)
高级:在调用 run(Object, Object) 的过程中中断推理。

继承的方法

公共构造函数

<ph type="x-smartling-placeholder"></ph> 公开 口译 文件 modelFile)

初始化 Interpreter

参数
modelFile 预训练 TF Lite 模型的文件。
抛出
IllegalArgumentException 如果 modelFile 未对有效的 TensorFlow Lite 进行编码,则会发生此错误 模型。

<ph type="x-smartling-placeholder"></ph> 公开 口译 文件 modelFile、Interpreter.Options 选项)

初始化 Interpreter 并指定用于自定义解释器行为的选项。

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

<ph type="x-smartling-placeholder"></ph> 公开 口译 (ByteBuffer byteBuffer)

使用模型文件的 ByteBuffer 初始化 Interpreter

构建 Interpreter 后,不应再修改 ByteBuffer。通过 ByteBuffer 可以是对模型文件进行内存映射的 MappedByteBuffer,也可以是 包含模型的字节内容的 nativeOrder() 的直接 ByteBuffer

参数
byteBuffer
抛出
IllegalArgumentException 如果 byteBuffer 既不是 MappedByteBuffer,也不是 nativeOrder 的直接 ByteBuffer

<ph type="x-smartling-placeholder"></ph> 公开 口译 ByteBuffer byteBuffer、Interpreter.Options 选项)

使用模型文件的 ByteBuffer 和一组Interpreter 自定义 Interpreter.Options

在构建 Interpreter 后,不应再修改 ByteBufferByteBuffer 可以是内存映射的 MappedByteBuffer 模型文件,或者包含字节内容的 nativeOrder() 的直接 ByteBuffer 模型。

参数
byteBuffer
选项
抛出
IllegalArgumentException 如果 byteBuffer 既不是 MappedByteBuffer,也不是 nativeOrder 的直接 ByteBuffer

公共方法

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

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

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

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

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

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

参数
opName

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

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

参数
inputIndex

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

获取输入张量的数量。

<ph type="x-smartling-placeholder"></ph> 公开 Tensor getInputTensorFromSignature (String inputName, String signatureKey)

获取与提供的输入名称和签名方法名称相关联的张量。

警告:这是一个实验性 API,可能会发生更改。

参数
inputName 在签名中输入姓名。
signatureKey 标识 SignatureDef 的签名密钥,如果模型具有 一个签名。
抛出
IllegalArgumentException 如果 inputNamesignatureKey 为 null 或为空, 或提供的名称无效。

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

返回原生推理时间。

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

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

参数
opName

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

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

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

参数
outputIndex

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

获取输出张量的数量。

<ph type="x-smartling-placeholder"></ph> 公开 Tensor getOutputTensorFromSignature (String outputName, String signatureKey)

获取与特定签名方法中提供的输出名称相关联的张量。

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

警告:这是一个实验性 API,可能会发生更改。

参数
outputName 签名中的输出名称。
signatureKey 标识 SignatureDef 的签名密钥,如果模型具有 一个签名。
抛出
IllegalArgumentException 如果 outputNamesignatureKey 为 null 或 空白或提供的名称无效。

<ph type="x-smartling-placeholder"></ph> 公开 String[] getSignatureInputs (String signatureKey)

获取方法 signatureKey 的 SignatureDefs 输入列表。

警告:这是一个实验性 API,可能会发生更改。

参数
signatureKey

<ph type="x-smartling-placeholder"></ph> 公开 String[] getSignatureKeys ()

获取模型中可用的 SignatureDef 导出方法名称列表。

警告:这是一个实验性 API,可能会发生更改。

<ph type="x-smartling-placeholder"></ph> 公开 String[] getSignatureOutputs (String signatureKey)

获取方法 signatureKey 的 SignatureDefs 输出列表。

警告:这是一个实验性 API,可能会发生更改。

参数
signatureKey

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

高级:将所有变量张量重置为默认值。

如果变量张量没有关联的缓冲区,则会重置为零。

警告:这是一个实验性 API,可能会发生更改。

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

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

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

参数
IDX
调暗
严格

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

将原生模型第 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())。

<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())。

<ph type="x-smartling-placeholder"></ph> 公开 无效 runSignature (Map<StringObject> 输入、Map<StringObject> 输出

runSignature(Map, Map, String) 相同,但不需要传递 signedKey。 假设模型有一个 SignatureDef。如果模型有多个 SignatureDef, 抛出异常。

警告:这是一个实验性 API,可能会发生更改。

参数
输入
输出

<ph type="x-smartling-placeholder"></ph> 公开 无效 runSignature (Map<String, Object> 输入, Map<String, Object> 输出,StringsignatureKey)

根据通过 signatureKey 提供的 SignatureDef 运行模型推断。

如需详细了解允许的输入和输出,请参阅 run(Object, Object) 数据类型。

警告:这是一个实验性 API,可能会发生更改。

参数
输入 从 SignatureDef 中的输入名称到输入对象的映射。
输出 从 SignatureDef 中的输出名称到输出数据的映射。如果 调用方希望在推理之后直接查询 Tensor 数据(例如,如果 输出形状是动态的,或使用了输出缓冲区句柄)。
signatureKey 标识 SignatureDef 的签名密钥。
抛出
IllegalArgumentException 如果 inputs 为 null 或为空、outputssignatureKey 为 null,或者如果在运行推理时发生错误。

<ph type="x-smartling-placeholder"></ph> 公开 无效 setCancelled (已取消布尔值)

高级:在调用 run(Object, Object) 的过程中中断推理。

调用此函数时,取消标志将设置为 true。翻译工具将 检查两次 Op 调用之间的标志,如果为 true,解释器将停止 执行。在明确“已取消”之前,解释器将保持已取消状态作者: setCancelled(false)

警告:这是一个实验性 API,可能会发生更改。

参数
已取消 true,用于尽可能取消推理;false至 继续播放。
抛出
IllegalStateException 如果解释器未通过可取消的 该选项默认为关闭