内部错误:无法创建解释器:未找到内置操作码“FULLY_CONNECTED”版本“9”的操作与 firebase ml 套件和tensorflow-lite

问题描述 投票:0回答:1

我创建了一个谷歌云函数,它使用以下配置创建一个基本的 tflite 模型文件:

输入=>全连接层=>输出。

我通过 Android 插件使用 Firebase 机器学习检索模型,但是当我尝试初始化解释器时,我的应用程序崩溃,并且在日志中收到以下错误:

2024/03/19 23:23:54.205 4629 4629错误AndroidRuntime java.lang.IllegalArgumentException:内部错误:无法创建解释器:找不到内置操作码“FULLY_CONNECTED”版本“9”的操作 2024/03/19 23:23:54.205 4629 4629 错误 AndroidRuntime 2024/03/19 23:23:54.205 4629 4629 错误 AndroidRuntime 注册失败。 2024/03/19 23:23:54.205 4629 4629 错误 AndroidRuntime 2024/03/19 23:23:54.205 4629 4629 org.tensorflow.lite.NativeInterpreterWrapper.createInterpreter(本机方法)的 AndroidRuntime 错误 2024/03/19 23:23:54.205 4629 4629 org.tensorflow.lite.NativeInterpreterWrapper.init 处的 AndroidRuntime 错误(NativeInterpreterWrapper.java:72) 2024/03/19 23:23:54.205 4629 4629 org.tensorflow.lite.NativeInterpreterWrapper 处的 AndroidRuntime 错误。(NativeInterpreterWrapper.java:48) 2024/03/19 23:23:54.205 4629 4629 org.tensorflow.lite.Interpreter 处的 AndroidRuntime 错误。(Interpreter.java:207) 2024/03/19 23:23:54.205 4629 4629 org.tensorflow.lite.Interpreter 处的 AndroidRuntime 错误。(Interpreter.java:182) 2024/03/19 23:23:54.205 4629 4629 com.fawfulized.machine_learning.ModelManager$1.onSuccess(ModelManager.java:62) AndroidRuntime 错误 2024/03/19 23:23:54.205 4629 4629 com.fawfulized.machine_learning.ModelManager$1.onSuccess(ModelManager.java:55) AndroidRuntime 错误 2024/03/19 23:23:54.205 4629 4629 com.google.android.gms.tasks.zzm.run (com.google.android.gms:play-services-tasks@@18.0.2:1) 的 AndroidRuntime 错误 2024/03/19 23:23:54.205 4629 4629 AndroidRuntime 错误 android.os.Handler.handleCallback(Handler.java:971) 2024/03/19 23:23:54.205 4629 4629 AndroidRuntime 错误 android.os.Handler.dispatchMessage(Handler.java:107) 2024/03/19 23:23:54.205 4629 4629 AndroidRuntime 错误 android.os.Looper.loopOnce(Looper.java:206) 2024/03/19 23:23:54.205 4629 4629 AndroidRuntime 错误 android.os.Looper.loop(Looper.java:296) 2024/03/19 23:23:54.205 4629 4629 AndroidRuntime 错误 android.app.ActivityThread.main(ActivityThread.java:9170) 2024/03/19 23:23:54.205 4629 4629 java.lang.reflect.Method.invoke 处的 AndroidRuntime 错误(本机方法) 2024/03/19 23:23:54.205 4629 4629 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run 处的 AndroidRuntime 错误(RuntimeInit.java:591) 2024/03/19 23:23:54.205 4629 4629 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1018) 处的 AndroidRuntime 错误

在我的谷歌云功能中,我将tensorflow版本指定为:

tensorflow==2.15.0

在我的插件的build.gradle.kts中,我将tensorflow lite版本指定为:

implementation("org.tensorflow:tensorflow-lite:2.15.0")

在[tensorflow存储库](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/tools/versioning/runtime_version.cc)第134行,指定版本2.15为FULLY_CONNECTED .0 应该是版本 11,所以我不知道为什么我的插件正在寻找版本 9。

此外,以下是我在 Android 插件中初始化解释器的方法:

 private void initializeInterpreter() {

        CustomModelDownloadConditions conditions = new CustomModelDownloadConditions.Builder()
                .build();
        FirebaseModelDownloader.getInstance()
                .getModel("Price-Prediction", DownloadType.LOCAL_MODEL_UPDATE_IN_BACKGROUND, conditions)
                .addOnSuccessListener(new OnSuccessListener<CustomModel>() {
                    @Override
                    public void onSuccess(CustomModel model) {
                        pricePredictionModel = model;
                        Log.d("tensorflow model", "Model downloaded.");
                        File modelFile = model.getFile();
                        if (modelFile != null) {
                            interpreter = new Interpreter(modelFile);
                            Log.d("tensorflow model", "Interpreter initialized.");
                        }
                    }
                });
    }

如有任何帮助,我们将不胜感激,谢谢。

预计我的 tflite 文件模型的解释器将使用版本 11 的全连接层进行初始化,但在内置运算符正在查找 FULLY_CONNECTED 版本 9 时出现错误

android tensorflow-lite firebase-machine-learning
1个回答
0
投票

我能够找出问题所在,以下是我采取的步骤:

我在 tflite 可视化工具(Netron)中打开我的模型,并查看“FULLY_CONNECTED”层,我看到它有一个名为“ametry_quantize_inputs”的属性,做了一些研究并偶然发现了这个链接: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/schema/schema.fbs

第 923 行指定您应该为 FullConnected 版本 7 或更高版本设置 asymmetry_quantize_inputs。

下面第 927 行是参数 'quantized_bias_type',适用于版本 11 或更高版本。

为了启用 quantized_bias_type,我更改了代码:


     converter.optimizations = [tf.lite.Optimize.DEFAULT]

     converter.target_spec.supported_ops = [
          tf.lite.OpsSet.TFLITE_BUILTINS,
          tf.lite.OpsSet.SELECT_TF_OPS 
     ]

     converter.inference_input_type = tf.float32
     converter.inference_output_type = tf.float32

     converter.representative_dataset = lambda: generate_representative_data(X_data)

     tflite_model = converter.convert()

转换器需要设置representative_dataset以启用“quantized_bias_type”。就我而言,我将generate_representative_data(X_data)定义为:

#generate representative datas 
def generate_representative_data(X_data):
     num_samples = X_data.shape[0]

     for i in range(num_samples):
          sample = X_data[i]
          yield {'input_1': sample}

还要确保代表性数据和输入层具有相同的名称:

tf.keras.layers.Input(shape=tensor_shape, dtype=tf.float32, name='input_1')

如果您收到有关输入签名的错误,请确保使用

tf.lite.TFLiteConverter.from_saved_model(saved_model_path)
而不是
tf.lite.TFLiteConverter.from_keras_model
,因为后者不会生成签名。

最后,在我的Android插件中,我遇到了以下错误:

Java.lang.IncompatibleClassChangeError: Found class org.tensorflow.lite.Tensor, but interface was expected

所以我所做的就是将我的tensorflow-lite版本降级到org.tensorflow.lite.Tensor是一个接口,而不是一个类的版本。

我希望它可以帮助遇到与我相同问题的人。

© www.soinside.com 2019 - 2024. All rights reserved.