为什么运行TensorFlowLite模型时会出现BufferOverflowException?

问题描述

我想在Android上使用TensorFlowLite(和Kotlin)运行自定义tflite模型。 尽管使用TFLite支持库创建了形状正确的输入和输出缓冲区,但每次调用run()方法时,我都会收到以下错误消息。

这是我的课程:

class Inference(context: Context) {
    private val tag = "Inference"
    private var interpreter: Interpreter
    private var inputBuffer: TensorBuffer
    private var outputBuffer: TensorBuffer

    init {
        val mappedByteBuffer= FileUtil.loadMappedFile(context,"CNN_ReLU.tflite")
        interpreter = Interpreter(mappedByteBuffer as ByteBuffer)
        interpreter.allocateTensors()

        val inputShape = interpreter.getInputTensor(0).shape()
        val outputShape = interpreter.getOutputTensor(0).shape()

        inputBuffer = TensorBuffer.createFixedSize(inputShape,DataType.FLOAT32)
        outputBuffer = TensorBuffer.createFixedSize(outputShape,DataType.FLOAT32)
    }

    fun run() {
        interpreter.run(inputBuffer.buffer,outputBuffer.buffer) // XXX: generates error message
    }
}

这是错误消息:

W/System.err: java.nio.BufferOverflowException
W/System.err:     at java.nio.ByteBuffer.put(ByteBuffer.java:615)
W/System.err:     at org.tensorflow.lite.Tensor.copyTo(Tensor.java:264)
W/System.err:     at org.tensorflow.lite.Tensor.copyTo(Tensor.java:254)
W/System.err:     at org.tensorflow.lite.NativeInterpreterWrapper.run(NativeInterpreterWrapper.java:170)
W/System.err:     at org.tensorflow.lite.Interpreter.runForMultipleInputsOutputs(Interpreter.java:347)
W/System.err:     at org.tensorflow.lite.Interpreter.run(Interpreter.java:306)

我只初始化了输入和输出缓冲区,还没有写入任何数据。

我正在使用这些gradle依赖项:

implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly'
implementation 'org.tensorflow:tensorflow-lite-gpu:0.0.0-nightly'
implementation 'org.tensorflow:tensorflow-lite-support:0.0.0-nightly'

.tflite模型是使用以下TensorFlow版本构建的:

tensorflow                        2.3.0
tensorflow-cpu                    2.2.0
tensorflow-datasets               3.1.0
tensorflow-estimator              2.3.0
tensorflow-gan                    2.0.0
tensorflow-hub                    0.7.0
tensorflow-metadata               0.22.0
tensorflow-probability            0.7.0
tensorflowjs                      1.7.4.post1

任何想法或提示都非常感谢,谢谢。

解决方法

在您的输入和输出缓冲区中添加.rewind()是否可以使其正常工作? 如果不是,我想知道您的输入或输出张量是动态张量吗?在这种情况下,返回形状无法通过这种方式使用。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...