致命例外:推理。无法从 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# 结构中的另一个数组