我创建了一个谷歌云函数,它使用以下配置创建一个基本的 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 时出现错误
我能够找出问题所在,以下是我采取的步骤:
我在 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是一个接口,而不是一个类的版本。
我希望它可以帮助遇到与我相同问题的人。