Tensorflow Lite模型要求的缓冲区大于必要的缓冲区

时间:2019-02-28 08:01:23

标签: tensorflow tensorflow-lite

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

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

张量流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: FATAL EXCEPTION: main
    Process: com.megacode, PID: 15067
    java.lang.RuntimeException: Unable to create application com.megacode.base.ApplicationBase: java.lang.IllegalArgumentException: Cannot convert between a TensorFlowLite buffer with 691200 bytes and a ByteBuffer with 172800 bytes.
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5771)
        at android.app.ActivityThread.-wrap2(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1648)

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

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

1 个答案:

答案 0 :(得分:1)

您是正确的,输入形状包含1 * 240 * 240 * 3个元素

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

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