Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将Lenet模型h5转换为.tflite_Python_Tensorflow_Keras_Tensorflow Lite - Fatal编程技术网

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

Python 如何将Lenet模型h5转换为.tflite,python,tensorflow,keras,tensorflow-lite,Python,Tensorflow,Keras,Tensorflow Lite,如何正确地将Lenet模型(输入32x32、5层、10类)转换为Tensorflow Lite?我使用了这几行代码,但它给了我在安卓系统中非常糟糕的信心。信任度都在0.1左右,即10%左右 这是我使用的代码 model = tf.keras.models.load_model('model.h5') converter = tf.lite.TFLiteConverter.from_keras_model(model) converter.post_training_quantize = True

如何正确地将Lenet模型(输入32x32、5层、10类)转换为Tensorflow Lite?我使用了这几行代码,但它给了我在安卓系统中非常糟糕的信心。信任度都在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文件可以预测具有良好可信度和准确性的图像。或者我应该问一下,Tensorflow Lite是否不支持自定义模型(Lenet)?为什么tflite文件的性能比.h5差得多?

这是因为量化。
它减少了模型的大小,也降低了精度。尽量不要量化模型。
试试这个

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模型的大小,但不会将精度降低到该程度。

如果生成的.tflite文件没有错误,则该模型是否称为Lenet或其他任何东西都无关紧要。此外,量化的精确度会有一点下降,但不会像你所说的那样有很大的差别。我想看看你是如何让bytebuffer插入到解释器中的。如果你使用灰度图像,你必须用3/255分割。。。对于彩色图像,仅为/255。如果在培训期间您没有使用像素标准化,则在位图转换为bytebuffer期间不要使用/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;
}

你为什么使用培训后量化?您的意思是使用32x32图像。你的手机很难处理这么小的图像吗?处理手机中的一张图像需要多长时间?@Farmaker事实上,如果我删除量化并正常转换,这没有什么区别,这就是为什么我想知道tensorflow lite是否不支持自定义lenet模型。而且,处理一张图像只需要不到1秒的时间。为什么你要除以3(/3/255f)?这通常用于灰度图像。我看到你的图像是彩色的。所以根据你的主要问题,我想我们已经完成了。转换模型(无论是否使用量化)都没有问题。接下来,我们必须查看要调试的代码。有github链接吗?谢谢你的链接。可以上传.h5文件和一些图片来检查吗?我实际上有两个python代码,可以量化也可以不量化,这两个代码都将.h5文件压缩为.tflite(从729kb.h5压缩为244kb.tflite),并提供完全相同的机密信息。还有别的办法吗?按照现在的说法,没有。如果找到别的办法,我会告诉你的。