当前位置: 首页 > 知识库问答 >
问题:

Tensorflow Lite模型推理的精度非常低

鲁涵意
2023-03-14

我想创建一个预测年龄和性别的模型,并将其集成到Android应用程序中。

我在Ubuntu 16上使用Python 3.6,Tensorflow 1.13.1和Keras 2.2.4。

首先,我用IMDB数据集训练不同的模型:keras的Mobilenet V1和V2,以及我自己编写的VGG。对于这两个MobileNet,我使用imagenet权重来初始化模型。

准确率相当高,性别的准确率超过90%。

培训结束后,我尝试了几种方法来转换tflite中的模型:

  • 三种方式,我直接从转换。h5文件:
converter = tf.lite.TFLiteConverter.from_keras_model_file(model_to_convert)
tflite_model = converter.convert()
open(model_converted, "wb").write(tflite_model)
converter = tf.contrib.lite.TFLiteConverter.from_keras_model_file(model_to_convert)
tflite_model = converter.convert()
open(model_converted, "wb").write(tflite_model)
converter = tf.contrib.lite.TocoConverter.from_keras_model_file(model_to_convert)
tflite_model = converter.convert()
open(model_converted, "wb").write(tflite_model)
  • 我首先将模型转换为tf图,如本例所述

在转换之前,我还尝试使用这行代码:

tf.keras.backend.set_learning_phase(0)

最后,我加载了。Android Studio中的tflite文件:

private ByteBuffer convertBitmapToByteBuffer(Bitmap bitmap) {
        int SIZE_IMAGE = 96;
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(4*1*SIZE_IMAGE*SIZE_IMAGE*3);
        byteBuffer.order(ByteOrder.nativeOrder());
        int[] pixels = new int[SIZE_IMAGE * SIZE_IMAGE];
        bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
        int pixel = 0;
        for(int i=0; i < SIZE_IMAGE; i++){
            for(int j=0; j<SIZE_IMAGE;j++){
                final int val = pixels[pixel++];
                byteBuffer.putFloat((float) (((val >> 16) & 0xFF)/255));
                byteBuffer.putFloat((float) (((val >> 8) & 0xFF)/255));
                byteBuffer.putFloat((float) ((val & 0xFF)/255));

            }
        }    

public String recognizeImage(Bitmap bitmap) {
        ByteBuffer byteBuffer = convertBitmapToByteBuffer(bitmap);
        Map<Integer, Object> cnnOutputs = new HashMap<>();
        float[][] gender=new float[1][2];
        cnnOutputs.put(0,gender);
        float[][]age=new float[1][21];
        cnnOutputs.put(1,age);
        Object[] inputs = {byteBuffer};
        interpreter.runForMultipleInputsOutputs(inputs, cnnOutputs);
        String result = convertToResults(gender[0], age[0]);
        return result;
    }

在最终推断过程中,无论使用何种模型,精度都很低。要么口译员预测的结果总是完全相同,要么预测的年龄变化不大,但预测的性别总是“女性”。

我该怎么办?

提前感谢!

共有1个答案

胡俊弼
2023-03-14

尝试使用keras模型和tflite模型处理一个输入数据并比较推断结果。可能输出不匹配。你可以从那里调试。

 类似资料:
  • 我使用的是tensorflow 1.10 Python 3.6 我的代码基于TensorFlow提供的预制虹膜分类模型。这意味着,我使用的是一个Tensorflow DNN预制的分类器,区别如下: 10个功能改为4个。 5个类改为3个。 我做了一个代码将这个分类器导出为tflite格式,但是python模型中的准确率高于75%,但是当导出时,准确率大约下降到45%,这意味着大约30%的准确率丢失了

  • 问题内容: 我正在尝试从看起来具有 很好清晰度的图像中检测出圆形。我确实意识到圈子的一部分丢失了,但是从 我读到的有关霍夫变换的内容来看,这似乎并不会 导致我遇到的问题。 Code: 我把高斯模糊注释掉了,因为(直觉上反),这 极大地增加了发现同样不准确的圆的数量。 我的输入图像有什么问题会导致Hough无法正常工作 吗?我的参数有问题吗? 编辑:第一个答案带来了一个关于 霍夫最小/最大半径提示的

  • 我正在开发一个端到端训练和量化感知的训练示例。使用CIFAR10数据集,我加载了一个预训练的MobilenetV2模型,然后使用TensorFlow指南中的代码来量化我的模型。整个过程适当结束后,我得到以下结果: 注意,我并没有更改我从TensorFlow指南中附带的代码,我只是使用了一个不同的数据集和模型。

  • 为什么此代码引发此异常: 线程“main”java.lang.ClassCastException:java.lang.Integer无法强制转换为java.lang.Double 而这个,运行良好: 两者都是尝试将整数转换为双精度,对吗?

  • 我已经在tensorflow中建立了卷积神经网络,在数据集上对其进行训练,并在看不见的数据上对其进行评估。这样做,我得到了约98%的准确率对看不见的数据<然后我用 并根据相同的数据进行评估,我得到了98%的准确性,但这次我得到了~96%。差别不大,但我觉得也不小。那正常吗? 我已经看到很多次在tenstorflow中,只有权重被导出,而不是偏差,但我不知道它与此有关 这是我的模型结构:

  • 问题内容: 文档的内容如下(强调我的意思)。 此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关。返回的值表示自某个固定但任意时间以来的纳秒(也许是将来的时间,因此值可能为负)。 此方法提供纳秒精度,但不一定提供纳秒精度。 无法保证值更改的频率。 如我所见,这可以用两种不同的方式解释: 在句子中 大胆 上面是指个人的返回值。然后,将在数字意义上理解精度和准确性。也就是说,精度是指有效