驱动程序类,通过 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 | 用于控制运行时解释器行为的选项类。 |
公共构造函数
公共方法
无效 |
allocateTensors()
如有必要,显式更新所有张量的分配。
|
无效 |
close()
释放与
InterpreterApi 实例关联的资源。 |
整数 | |
Tensor |
getInputTensor(int inputIndex)
获取与提供的输入索引关联的张量。
|
整数 |
getInputTensorCount()
获取输入张量的数量。
|
Tensor | |
长 |
getLastNativeInferenceDurationNanoseconds()
返回原生推理时间。
|
整数 | |
Tensor |
getOutputTensor(int outputIndex)
获取与提供的输出索引关联的张量。
|
整数 |
getOutputTensorCount()
获取输出张量的数量。
|
Tensor | |
String[] | |
String[] |
getSignatureKeys()
获取模型中可用的 SignatureDef 导出方法名称列表。
|
String[] | |
无效 |
resetVariableTensors()
高级:将所有变量张量重置为默认值。
|
无效 |
resizeInput(int idx, int[] dims, boolean strict)
将原生模型第 idx 个输入的大小调整为指定的维度。
|
无效 | |
无效 | |
无效 | |
无效 |
runSignature(Map<String, Object> 输入, Map<String, Object> 输出)
与
runSignature(Map, Map, String) 相同,但不需要传递 signedKey。
假设模型有一个 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
后,不应再修改 ByteBuffer
。ByteBuffer
可以是内存映射的 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 | 如果 inputName 或 signatureKey 为 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 | 如果 outputName 或 signatureKey 为 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> 输出)
如果模型采用多项输入或返回多个输出,则运行模型推断。
警告:如果存在 Buffer
s(最好是直接连接,但不是必需的),该 API 会更加高效
用作输入/输出数据类型。请考虑使用 Buffer
进行 Feed 和提取
原始数据,以获得更好的性能。以下具体的 Buffer
类型
支持:
ByteBuffer
- 与任何底层原始张量类型兼容。FloatBuffer
- 与浮点张量兼容。IntBuffer
- 与 int32 张量兼容。LongBuffer
- 与 int64 张量兼容。
Buffer
或标量输入。
注意:inputs
和 outputs
具体元素的 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<String、Object> 输入、Map<String、Object> 输出
与 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 或为空、outputs 或
signatureKey 为 null,或者如果在运行推理时发生错误。
|
---|
<ph type="x-smartling-placeholder"></ph> 公开 无效 setCancelled (已取消布尔值)
高级:在调用 run(Object, Object)
的过程中中断推理。
调用此函数时,取消标志将设置为 true。翻译工具将
检查两次 Op 调用之间的标志,如果为 true
,解释器将停止
执行。在明确“已取消”之前,解释器将保持已取消状态作者:
setCancelled(false)
。
警告:这是一个实验性 API,可能会发生更改。
参数
已取消 | true ,用于尽可能取消推理;false 至
继续播放。 |
---|
抛出
IllegalStateException | 如果解释器未通过可取消的 该选项默认为关闭 |
---|