我尝试在带有 tflite 的 Android 应用程序上运行版本 posenet
(这是一个 CNN)。
该应用基于 GPU 委托(delegate)演示:
(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/