You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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版依赖:
    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")
    
    或等待TensorFlow 2.17正式版发布后,直接使用2.17.0版本号。

2. 强制转换时生成兼容旧版TFLite的算子

如果暂时无法升级Android端依赖,可修改转换代码,强制生成旧版本兼容的算子:

  • 关闭experimental_new_converter,仅使用TFLITE_BUILTINS,同时移除不必要的concrete_func定义:
    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)
    
    转换后的模型会使用旧版本FULLY_CONNECTED算子,兼容2.16.1版本的TFLite。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 23:32:32