java - 如何分配多维输出缓冲区来提供 Android Tflite 的 interpreter.run()?

标签 java android arrays tensorflow

我尝试在带有 tflite 的 Android 应用程序上运行版本 posenet(这是一个 CNN)。

该应用基于 GPU 委托(delegate)演示:

(1) https://medium.com/tensorflow/tensorflow-lite-now-faster-with-mobile-gpus-developer-preview-e15797e6dee7

(2) https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/java/demo

Posenet 将图像作为输入并计算形状的多个数组作为输出: 1x14x14x17、1x14x14x34、1x14x14x32、1x14x14x32

我知道如何为图像分配字节缓冲区,所以这不是问题。

但是我如何为该输出分配一个缓冲区,以便能够成功地将输入和输出缓冲区提供给解释器,例如:

import org.tensorflow.lite.Interpreter;
Interpreter tflite;

ByteBuffer input = null;
input = ByteBuffer.allocateDirect(...);
output = ?

tflite.run(input,output);

我为 float 版本尝试了这样的事情:

float[][][][] output = null;
output = new float[1*14*14*17][1*14*14*34][1*14*14*32][1*14*14*32];

但这会导致内存溢出。那么我如何使用具有正确尺寸的数组为输出正确分配缓冲区。 (我不太习惯java,更习惯python)

编辑:

我想要四个嵌套的 4 维数组。因为这就是模型的结果。像这样:

float[][][][] out1 = new float[1][14][14][17];
float[][][][] out2 = new float[1][14][14][34];
float[][][][] out3 = new float[1][14][14][32];
float[][][][] out4 = new float[1][14][14][32];
float[] output = new float[out1, out2, out3, out4];

但这行不通

最佳答案

@Chris623 的回答仍然不适用于 tflite。在需要为多维输出数组分配内存的情况下,使用 interpreter.run() 将不起作用。

您宁愿需要使用 interpreter.runForMultipleInputsOutputs()。下面显示了 4 个数组的示例代码。

float[][][][] out1 = new float[1][14][14][17];
float[][][][] out2 = new float[1][14][14][34];
float[][][][] out3 = new float[1][14][14][32];
float[][][][] out4 = new float[1][14][14][32];

Map<Integer, Object> outputs = new HashMap<>();
outputs.put(0, out1)
outputs.put(1, out2)
outputs.put(2, out3)
outputs.put(3, out4)

interpreter.runForMultipleInputsOutputs(inputs, outputs)

这应该可以帮助您映射输出数组以供进一步处理。

关于java - 如何分配多维输出缓冲区来提供 Android Tflite 的 interpreter.run()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54688482/

相关文章:

c - 在 C 中,我的程序输出不在用户输入数组内的数字或不是数组中任何数字的总和,不会打印任何内容

c++ - 在 Visual Studio 调试器中查看数组?

java - 不断接收对其自身的赋值,并丢失方法体错误

java - Appium 选择了错误的定位器

android - 支持库 AsyncTaskLoader 不支持被取消?

javascript - 如何为嵌套数组和对象设置状态?

Java 文件从一台服务器复制到另一台服务器

java - 如何在生产服务器上使用 java 在新窗口中打开 URL

java - 使用 svnkit 通过 https 从 SVN 读取文件

android - 检测 EditText 上的触摸,但不中断它?