как конвертировать L enet модель h5 в .tflite - PullRequest
1 голос
/ 20 июня 2020

Как правильно преобразовать модель L enet (вход 32x32, 5 слоев, 10 классов) в Tensorflow Lite? Я использовал эти строки кода, но это дает мне очень плохую уверенность в android, как это изображение . Достоверность составляет около 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 нестандартную модель (L enet)? почему файл tflite намного хуже, чем .h5?

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Если файл .tflite сгенерирован без ошибок, не имеет значения, называется ли модель L enet или что-то еще. Также квантование будет иметь небольшое снижение точности, но не будет большой разницы, как вы утверждаете. Я бы посмотрел, как вы делаете байтовый буфер, чтобы вставить его в интерпретатор. Если вы используете изображения в градациях серого, вам нужно разделить на 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;
}
0 голосов
/ 20 июня 2020

Это из-за квантования.
Это уменьшает размер модели, так же как и точность. Постарайтесь не квантовать модель.
Попробуйте это.

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-модели, но не снизит точность до такой степени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...