如何将Lenet模型h5转换为.tflite

时间:2020-06-20 18:37:14

标签: python tensorflow keras tensorflow-lite

如何正确将Lenet模型(输入32x32、5层,10类)转换为Tensorflow Lite?我使用了以下几行代码,但它使我对android like this image的信心不足。置信度均为0.1或10%。

这是我使用的代码

model = tf.keras.models.load_model('model.h5')
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.post_training_quantize = True
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

上面的.h5文件可以很好地预测图像like this image。或者我应该问一下,Tensorflow Lite是否不支持自定义模型(Lenet)?为什么tflite文件比.h5差很多?

2 个答案:

答案 0 :(得分:1)

如果生成的.tflite文件没有错误,则将模型称为Lenet还是其他名称都没有关系。此外,量化的准确性会有所降低,但不会像您所说的那样产生重大差异。我会看到你如何使字节缓冲区插入解释器中。如果u使用灰度图像,则必须除以3/255 ...,彩色图像仅为/ 255。如果在培训期间您尚未使用像素归一化,则在位图到字节缓冲区期间不要使用/ 255。因此您的代码如下:

private ByteBuffer convertBitmapToByteBuffer(Bitmap bitmap) {
    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(ModelConfig.MODEL_INPUT_SIZE);
    byteBuffer.order(ByteOrder.nativeOrder());
    int[] pixels = new int[ModelConfig.INPUT_WIDTH * ModelConfig.INPUT_HEIGHT];
    bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
    for (int pixel : pixels) {
        float rChannel = (pixel >> 16) & 0xFF;
        float gChannel = (pixel >> 8) & 0xFF;
        float bChannel = (pixel) & 0xFF;
        float pixelValue = (rChannel + gChannel + bChannel);
        byteBuffer.putFloat(pixelValue);
    }
    return byteBuffer;
}

而不是:

private ByteBuffer convertBitmapToByteBuffer(Bitmap bitmap) {
    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(ModelConfig.MODEL_INPUT_SIZE);
    byteBuffer.order(ByteOrder.nativeOrder());
    int[] pixels = new int[ModelConfig.INPUT_WIDTH * ModelConfig.INPUT_HEIGHT];
    bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
    for (int pixel : pixels) {
        float rChannel = (pixel >> 16) & 0xFF;
        float gChannel = (pixel >> 8) & 0xFF;
        float bChannel = (pixel) & 0xFF;
        float pixelValue = (rChannel + gChannel + bChannel) / 255.f;
        byteBuffer.putFloat(pixelValue);
    }
    return byteBuffer;
}

答案 1 :(得分:0)

是因为量化。
它减小了模型的大小,因此准确性也降低了。尽量不要量化模型。
试试这个。

import tensorflow as tf

model = tf.keras.models.load_model('model.h5')
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

这可能会增加tflite模型的大小,但不会降低准确性。