致命例外:推理。无法从 Java 缓冲区复制到 TensorFlowLite 张量

Posted

技术标签:

【中文标题】致命例外:推理。无法从 Java 缓冲区复制到 TensorFlowLite 张量【英文标题】:FATAL EXCEPTION: inference. Cannot copy to a TensorFlowLite tensor from a Java Buffer 【发布时间】:2021-07-01 15:45:29 【问题描述】:

我正在使用MNIST-fashion database 在android Studio 中开发Image Classifier app,但我遇到了一点问题。当我尝试运行该应用程序时,我遇到了这个常见错误:

java.lang.IllegalArgumentException: Cannot copy to a TensorFlowLite tensor (serving_default_conv2d_input:0) with 3136 bytes from a Java Buffer with 9408 bytes.

我知道这可能是来自模型的输入张量与我的代码中的缓冲区不匹配。但这太令人困惑了,因为我的代码会自动适应模型中图像的大小以及它需要的所有信息。所以我想知道错误在哪里......

// Reads type and shape of input and output tensors, respectively.
    int imageTensorIndex = 0;
    int[] imageShape = tflite.getInputTensor(imageTensorIndex).shape(); // 1, height, width, 1
    imageSizeY = imageShape[1];
    imageSizeX = imageShape[2];
    DataType imageDataType = tflite.getInputTensor(imageTensorIndex).dataType();
    int probabilityTensorIndex = 0;
    int[] probabilityShape =
        tflite.getOutputTensor(probabilityTensorIndex).shape(); // 1, 10
    DataType probabilityDataType = tflite.getOutputTensor(probabilityTensorIndex).dataType();

// Creates the input tensor.
    inputImageBuffer = new TensorImage(imageDataType);

也许这就是问题所在...我正在创建像这样 1, height, width, 1 的 imageShape,并且数据类型是 FLOAT32,所以它应该是 1, height, width, 4对吧?

另一个原因可能是元数据。但是我用元数据填充模型,我有一个 .json,但我不知道如何使用它。

注意:如果你想让笔记本做 .tflite,there u go.

【问题讨论】:

“感谢您的帮助”是不正确的,也无助于包含在问题中。请参阅no thanks。此外,当有人回答问题时,编辑问题以使其答案不足是不合适的。请参阅matryoshka questions 上的这篇文章。最好只 ask a new question 并在必要时链接回这个。 【参考方案1】:

张量缓冲区大小由 datasize (float32: 4bytes) * 张量形状的平面大小 (1 * height * width * 1) 决定。

所以上面的代码sn-p需要准备一个形状为(1, height, width, 1)而不是形状为(1, height, width, 4)的float输入张量数据。

【讨论】:

我试过了但没有用,它给我带来了同样的错误......但在不同的行^^似乎我们正在修复代码ty:3

以上是关于致命例外:推理。无法从 Java 缓冲区复制到 TensorFlowLite 张量的主要内容,如果未能解决你的问题,请参考以下文章

例外:从意图存储ArrayList时“无法转换为java.util.ArrayList”

将位间隔从变量复制到数组

无法将固定大小的字节数组从结构复制到 C# 结构中的另一个数组

如何使用模板函数从缓冲区(T* 数据数组)创建 cv::Mat?

java常用的IO模型

将系统ram升级到16 GB面临错误:Java运行时环境检测到致命错误: