在Android中运行TensorFlow模型时发生java.nio.BufferOverflowException运行时错误?

在Android中运行TensorFlow模型时发生java.nio.BufferOverflowException运行时错误?,java,android,machine-learning,tensorflow,computer-vision,Java,Android,Machine Learning,Tensorflow,Computer Vision,出于某种原因,每当我在android中增加用于推理的输入图像大小(用于图像分类)时,就会出现此错误: 我也不知道为什么。对于低于我使用的输入图像大小,模型运行良好。此外,这个问题仅限于我使用的一个模型。我也试过更小和更大(2倍大)的型号,它们工作得非常好。只有这个模型给了我这个问题,但我无法根据产生的错误来确定这个模型到底出了什么问题 特定错误堆栈跟踪: TensorFlowImageClassifier.java: inferenceInterface.fetch(outputName

出于某种原因,每当我在android中增加用于推理的输入图像大小(用于图像分类)时,就会出现此错误:

我也不知道为什么。对于低于我使用的输入图像大小,模型运行良好。此外,这个问题仅限于我使用的一个模型。我也试过更小和更大(2倍大)的型号,它们工作得非常好。只有这个模型给了我这个问题,但我无法根据产生的错误来确定这个模型到底出了什么问题

特定错误堆栈跟踪:

TensorFlowImageClassifier.java:

    inferenceInterface.fetch(outputName, outputs);
public void fetch(String var1, float[] var2) {
    this.fetch(var1, FloatBuffer.wrap(var2));
}
public void writeTo(FloatBuffer var1) {
    if(this.dtype != DataType.FLOAT) {
        throw incompatibleBuffer(var1, this.dtype);
    } else {
        ByteBuffer var2 = this.buffer();
        var1.put(var2.asFloatBuffer());
    }
}
public FloatBuffer put(FloatBuffer src) {
    if (src == this)
        throw new IllegalArgumentException();
    int n = src.remaining();
    if (n > remaining())
        throw new BufferOverflowException();
    for (int i = 0; i < n; i++)
        put(src.get());
    return this;
}
TensorFlowEnferenceInterace.java:

    inferenceInterface.fetch(outputName, outputs);
public void fetch(String var1, float[] var2) {
    this.fetch(var1, FloatBuffer.wrap(var2));
}
public void writeTo(FloatBuffer var1) {
    if(this.dtype != DataType.FLOAT) {
        throw incompatibleBuffer(var1, this.dtype);
    } else {
        ByteBuffer var2 = this.buffer();
        var1.put(var2.asFloatBuffer());
    }
}
public FloatBuffer put(FloatBuffer src) {
    if (src == this)
        throw new IllegalArgumentException();
    int n = src.remaining();
    if (n > remaining())
        throw new BufferOverflowException();
    for (int i = 0; i < n; i++)
        put(src.get());
    return this;
}
Tensor.java:

    inferenceInterface.fetch(outputName, outputs);
public void fetch(String var1, float[] var2) {
    this.fetch(var1, FloatBuffer.wrap(var2));
}
public void writeTo(FloatBuffer var1) {
    if(this.dtype != DataType.FLOAT) {
        throw incompatibleBuffer(var1, this.dtype);
    } else {
        ByteBuffer var2 = this.buffer();
        var1.put(var2.asFloatBuffer());
    }
}
public FloatBuffer put(FloatBuffer src) {
    if (src == this)
        throw new IllegalArgumentException();
    int n = src.remaining();
    if (n > remaining())
        throw new BufferOverflowException();
    for (int i = 0; i < n; i++)
        put(src.get());
    return this;
}
FloatBuffer.java:

    inferenceInterface.fetch(outputName, outputs);
public void fetch(String var1, float[] var2) {
    this.fetch(var1, FloatBuffer.wrap(var2));
}
public void writeTo(FloatBuffer var1) {
    if(this.dtype != DataType.FLOAT) {
        throw incompatibleBuffer(var1, this.dtype);
    } else {
        ByteBuffer var2 = this.buffer();
        var1.put(var2.asFloatBuffer());
    }
}
public FloatBuffer put(FloatBuffer src) {
    if (src == this)
        throw new IllegalArgumentException();
    int n = src.remaining();
    if (n > remaining())
        throw new BufferOverflowException();
    for (int i = 0; i < n; i++)
        put(src.get());
    return this;
}
公共FloatBuffer put(FloatBuffer src){
如果(src==此)
抛出新的IllegalArgumentException();
int n=src.remaining();
如果(n>剩余()
抛出新的BufferOverflowException();
对于(int i=0;i
退出堆栈跟踪和错误消息,似乎投诉是提供给
获取的
float[]
数组长度小于您的型号生成的输出大小。因此,您需要调整代码,以便为
获取
提供大小更合适的数组

不幸的是,
tensorflow推论接口
类没有公共方法来访问获取的张量的实际形状。如果您是从源代码进行构建,则可以通过向类中添加以下内容来实现:

public long[] fetchShape(String outputName) {
  return getTensor(outputName).shape();
}
(这可能是对项目的良好贡献)


希望有帮助。

问题肯定会如所述

使用此日志输出查看张量输出的形状:

Log.i(TAG, "This is the output tensor shape of my .pb file in asset folder" + 
inferenceInterface.graph().operation(outputNames[i]).output(0).shape());

希望这将有助于跟踪调试过程。

从这里引用-->我看到了线程,但我认为这不是问题的原因。(缓冲区是在库内部分配的,我无法控制它)。此外,我运行了一个更大的模型,并且大小没有超过;gc();但是,不幸的是,我需要的容量是固定的,我不太确定在代码中我可以进一步降低内存需求的地方。我认为问题与模型实现有关,因为我使用了一个更大的模型,它消耗了大约3倍的内存,但在移动设备上运行它没有问题。有没有办法检查模型中的大部分内存来自何处?