【问题标题】:Tensorflow lite model request a buffer bigger than the neccesaryTensorflow lite 模型请求的缓冲区大于所需的缓冲区
【发布时间】:2019-07-22 02:05:05
【问题描述】:

我在 tensorflow 中使用 keras 创建了一个自定义模型。我使用的版本是 tensorflow nightly 1.13.1。我使用官方工具搭建了 tensorflow lite 模型(方法 tf.lite.TFLiteConverter.from_keras_model_file )。

创建模型后,我查看了输入形状,似乎没有什么不好。

tensorflow lite 模型中的输入输出形状为:

[{'name': 'input_1', 'index': 59, 'shape': array([ 1, 240, 240, 3], dtype=int32), 'dtype': , 'quantization': (0.0, 0 )}] [{'name': 'dense/Softmax', 'index': 57, 'shape': array([1, 6], dtype=int32), 'dtype': , 'quantization': (0.0, 0)} ]

您可以注意到输入形状为 1 * 240 * 240 * 3,所以我预计缓冲区的大小为 172800 个单位。

但是,当我尝试在 android 设备中运行模型时,我收到了下一个错误:

E/AndroidRuntime:致命异常:主要 进程:com.megacode,PID:15067 java.lang.RuntimeException:无法创建应用程序 com.megacode.base.ApplicationBase:java.lang.IllegalArgumentException:无法在 691200 字节的 TensorFlowLite 缓冲区和 172800 字节的 ByteBuffer 之间进行转换。 在 android.app.ActivityThread.handleBindApplication(ActivityThread.java:5771) 在 android.app.ActivityThread.-wrap2(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1648)

我不明白模型要求输入形状为 691200 个单位的原因。

如果有人有建议,我将不胜感激

【问题讨论】:

    标签: tensorflow tensorflow-lite


    【解决方案1】:

    你是对的,输入的形状包含 1 * 240 * 240 * 3 个元素

    但是,每个元素都是 int32 类型,每个元素占用 4 个字节。

    因此,ByteBuffer的总大小应该是1 * 240 * 240 * 3 * 4 = 691200。

    【讨论】:

    • 我今天早上发现了这个答案。我使用了来自 bytebuffer 对象的“put”方法,但是当我使用“putFloat”方法时,一切正常(首先增加了 bytebuffer 的大小)。你的回答证实了我的猜想。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 2022-11-11
    • 1970-01-01
    相关资源
    最近更新 更多