tf-nightly生成的TFLite模型无法在Android Studio加载的问题求助
问题描述
使用TensorFlow 2.17.0-nightly(版本号2.17.0-dev20240514)构建并训练包含LSTM和Dense层的神经网络,转换为TFLite模型后,在Android Studio中加载时出现以下错误:
Didn't find op for builtin opcode 'FULLY_CONNECTED' version '12'. An older version of this builtin might be supported. Are you using an old TFLite binary with a newer model?
模型结构:
self.model = tf.keras.models.Sequential([ tf.keras.layers.LSTM(80, input_shape=input_shape, return_sequences=True), tf.keras.layers.LSTM(128, activation='tanh', return_sequences=False), tf.keras.layers.Dense(80, activation='relu'), tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(32, activation='relu'), tf.keras.layers.Dense(10, activation='sigmoid'), tf.keras.layers.Dense(4, activation='sigmoid') ])
模型转换代码:
lstm_model = tf.keras.models.load_model('lstm_model_TEST.keras', custom_objects={'F1_score': F1_score}) # Convert the model. run_model = tf.function(lambda x: lstm_model(x)) BATCH_SIZE = 1 STEPS = 10 INPUT_SIZE = 5 concrete_func = run_model.get_concrete_function( tf.TensorSpec([BATCH_SIZE, STEPS, INPUT_SIZE], lstm_model.inputs[0].dtype)) converter = tf.lite.TFLiteConverter.from_keras_model(lstm_model) converter.optimizations = [tf.lite.Optimize.DEFAULT] converter.target_spec.supported_ops = [ tf.lite.OpsSet.TFLITE_BUILTINS, tf.lite.OpsSet.SELECT_TF_OPS ] converter.experimental_new_converter = True tflite_model = converter.convert() # Save the model. with open('model_LSTM.tflite', 'wb') as f: f.write(tflite_model)
Android依赖配置:
implementation("org.tensorflow:tensorflow-lite-support:0.4.4") implementation("org.tensorflow:tensorflow-lite-metadata:0.4.4") implementation("org.tensorflow:tensorflow-lite:2.16.1") implementation("org.tensorflow:tensorflow-lite-gpu:2.16.1")
补充:曾尝试用TensorFlow 2.16.1正式版转换模型,但转换失败。
解决方案
1. 对齐Android端TFLite版本与转换版本
错误核心是高版本TF生成的TFLite模型使用了新版本算子(FULLY_CONNECTED v12),但Android端用的旧版TFLite(2.16.1)不支持该版本算子。解决办法是升级Android端TFLite依赖到与转换版本匹配的版本:
- 将Android中的TFLite依赖改为对应2.17.x的版本,比如使用nightly版依赖:
或等待TensorFlow 2.17正式版发布后,直接使用implementation("org.tensorflow:tensorflow-lite:0.0.0-nightly") implementation("org.tensorflow:tensorflow-lite-gpu:0.0.0-nightly") implementation("org.tensorflow:tensorflow-lite-support:0.0.0-nightly") implementation("org.tensorflow:tensorflow-lite-metadata:0.0.0-nightly")2.17.0版本号。
2. 强制转换时生成兼容旧版TFLite的算子
如果暂时无法升级Android端依赖,可修改转换代码,强制生成旧版本兼容的算子:
- 关闭
experimental_new_converter,仅使用TFLITE_BUILTINS,同时移除不必要的concrete_func定义:
转换后的模型会使用旧版本FULLY_CONNECTED算子,兼容2.16.1版本的TFLite。lstm_model = tf.keras.models.load_model('lstm_model_TEST.keras', custom_objects={'F1_score': F1_score}) converter = tf.lite.TFLiteConverter.from_keras_model(lstm_model) converter.optimizations = [tf.lite.Optimize.DEFAULT] # 仅使用内置算子,关闭新转换器以生成兼容旧版本的算子 converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS] converter.experimental_new_converter = False tflite_model = converter.convert() with open('model_LSTM.tflite', 'wb') as f: f.write(tflite_model)
3. 修复TensorFlow 2.16.1正式版转换失败问题
转换失败大概率是自定义指标F1_score或模型特性兼容性问题,可尝试以下步骤:
- 确保加载模型时的
F1_score定义与训练时完全一致(包括参数、装饰器等); - 转换时关闭
experimental_new_converter,改用旧转换器; - 检查LSTM参数是否为2.16.1支持的配置(比如
activation='tanh'是兼容的); - 尝试先导出为SavedModel格式再转换:
lstm_model.save('saved_model') converter = tf.lite.TFLiteConverter.from_saved_model('saved_model') converter.optimizations = [tf.lite.Optimize.DEFAULT] converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS, tf.lite.OpsSet.SELECT_TF_OPS] tflite_model = converter.convert()
内容的提问来源于stack exchange,提问作者Mr.Wilson
相关产品推荐
相关产品推荐

