首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将Lenet模型h5转换为.tflite

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

Stack Overflow用户
提问于 2020-06-20 18:37:14
回答 2查看 720关注 0票数 2

如何正确地将Lenet模型(输入32x32、5层、10个类)转换为Tensorflow Lite?我使用了这行代码,但它给了我非常糟糕的信心,在安卓,就像这张照片。所有的信心都在0.1左右,或10%左右。

这是我使用的代码

代码语言:javascript
复制
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文件可以很好的对图像进行预测,具有很好的可信度和准确性,就像这张照片。或者我应该问,Tensorflow Lite不支持定制模型(Lenet)吗?为什么tflite文件做的比.h5差得多?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-21 07:37:37

如果生成的.tflite文件没有错误,那么模型是否被称为Lenet或其他任何东西都无关紧要。此外,量化将有一个小的下降的准确性,但没有大的差别,如你说。我想看看你是如何使字节缓冲区插入到解释器中的。如果你使用的是灰度图像,你必须除以3/255.对于彩色图像,只有/255。如果在您的培训期间,您没有使用像素规范化,那么在位图期间不要使用/255作为字节缓冲区。所以你的代码应该是:

代码语言:javascript
复制
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;
}

而不是:

代码语言:javascript
复制
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;
}
票数 2
EN

Stack Overflow用户

发布于 2020-06-20 20:51:33

这是因为量化。

它减少了模型的大小,也减少了精度。尽量不要量化这个模型。

尝尝这个。

代码语言:javascript
复制
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模型的大小,但不会降低到该程度的精度。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62490121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档