已知的间接子类 |
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 | |
静态 InterpreterApi | |
抽象 整数 | |
抽象 Tensor |
getInputTensor(int inputIndex)
获取与提供的输入索引关联的张量。
|
抽象 整数 |
getInputTensorCount()
获取输入张量的数量。
|
抽象 长 |
getLastNativeInferenceDurationNanoseconds()
返回原生推理时间。
|
抽象 整数 | |
抽象 Tensor |
getOutputTensor(int outputIndex)
获取与提供的输出索引关联的张量。
|
抽象 整数 |
getOutputTensorCount()
获取输出张量的数量。
|
抽象 无效 |
resizeInput(int idx, int[] dims, boolean strict)
将原生模型第 idx 个输入的大小调整为指定的维度。
|
抽象 无效 | |
抽象 无效 | |
抽象 无效 |
继承的方法
公共方法
<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)
<ph type="x-smartling-placeholder"></ph> 公开 抽象 Tensor getInputTensor (int 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)
<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> 输出)
如果模型采用多项输入或返回多个输出,则运行模型推断。
警告:如果存在 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() )。 |
抛出
IllegalArgumentException | 如果 inputs 为 null 或为空,如果 outputs 为
null,或者如果在运行推理时发生错误。
|
---|