Android端TensorFlow Lite 2.17版本FULLY_CONNECTED算子兼容问题
Android TensorFlow Lite加载模型报错:FULLY_CONNECTED算子版本不兼容
错误提示
Internal error: Cannot create interpreter: 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?
相关代码
模型加载实现
@Throws(IOException::class) fun loadModelFile( context: Context, modelFileName: String = "constant_output_model.tflite" ): MappedByteBuffer { val fileDescriptor = context.assets.openFd(modelFileName) val inputStream = FileInputStream(fileDescriptor.fileDescriptor) val fileChannel = inputStream.channel val startOffset = fileDescriptor.startOffset val declareLength = fileDescriptor.declaredLength return fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declareLength) }
解释器初始化代码
InterpreterApi.create( TfLiteUtils.loadModelFile(this, "voice_detection_2_17_0_new_ops.tflite"), InterpreterApi.Options().apply { numThreads = 1 } )
模型结构(移除Flatten层可正常运行)
input_shape = (None, 39, 63, 1) # 输入形状(不含批次维度) inputs = tf.keras.Input(shape=input_shape[1:]) x = tf.keras.layers.Conv2D(filters=128, kernel_size=(8, 8), activation='relu', padding='same')(inputs) x = tf.keras.layers.AveragePooling2D(pool_size=(2, 2))(x) x = tf.keras.layers.Conv2D(filters=64, kernel_size=(3, 3), activation='relu', padding='same')(x) x = tf.keras.layers.AveragePooling2D(pool_size=(2, 2))(x) x = tf.keras.layers.Conv2D(filters=128, kernel_size=(3, 3), activation='relu', padding='same')(x) x = tf.keras.layers.MaxPooling2D(pool_size=(2, 2))(x) x = tf.keras.layers.Flatten()(x) # *移除这一行模型即可正常运行* x = tf.keras.layers.Dense(units=256)(x) x = tf.keras.layers.LeakyReLU(alpha=0.1)(x) x = tf.keras.layers.Dense(units=2, activation='softmax')(x) outputs = tf.keras.layers.Dense(units=1)(x) model = tf.keras.Model(inputs=inputs, outputs=outputs) return model
环境说明
- 使用自行构建的TensorFlow 2.17版本AAR包(Maven暂未提供该版本),尝试
com.google.ai.edge.litert:litert:1.0.1时出现相同错误 - 切换至TensorFlow 2.16版本,使用Interpreter API可正常加载运行模型
解决方法
- 降级模型转换版本:使用TensorFlow 2.16重新转换Keras模型为TFLite格式,确保模型使用的算子版本与Android端依赖的TFLite库兼容。TensorFlow 2.17默认生成的模型可能使用了更高版本的FULLY_CONNECTED算子,而当前依赖的库尚未支持该版本。
- 替换Flatten层:用
Reshape层替代Flatten层,手动指定展平后的形状,避免触发高版本算子。示例代码:# 替换x = tf.keras.layers.Flatten()(x) x = tf.keras.layers.Reshape((-1,))(x) - 检查TFLite库构建参数:若坚持使用TensorFlow 2.17,需确认自行构建的AAR包是否包含了版本12的FULLY_CONNECTED算子实现,构建时需开启对应算子的编译选项。
内容的提问来源于stack exchange,提问作者Rohan Choudhary
相关产品推荐
相关产品推荐

