无法将训练后的Keras模型转换为TensorFlow Lite 求解决方案
解决TensorFlow Lite模型转换失败问题
问题根源
你在模型编译时使用了自定义的distance指标,TensorFlow Lite转换器无法处理模型中包含的自定义Python训练组件(比如自定义metrics、优化器的学习率调度器状态),这是两种转换方式均失败的核心原因。
解决方案
转换TFLite模型时,仅保留模型的推理部分,移除训练相关组件:
重新保存推理专用模型
训练完成后,保存不含优化器、自定义metrics等训练组件的模型:# 训练完成后执行,保存仅用于推理的模型 model.save('model_inference', include_optimizer=False)若你已保存了
modle_new模型,可先加载再重新保存:# 加载原模型,需指定自定义metrics以避免加载错误 loaded_model = tf.keras.models.load_model('modle_new', custom_objects={'distance': distance}) # 保存推理模型 loaded_model.save('model_inference', include_optimizer=False)转换为TensorFlow Lite模型
使用上述推理模型进行转换:converter = tf.lite.TFLiteConverter.from_saved_model('model_inference') converter.optimizations = [tf.lite.Optimize.DEFAULT] converter.target_spec.supported_types = [tf.float16] tflite_model = converter.convert() # 保存转换后的TFLite模型 with open('model_float16.tflite', 'wb') as f: f.write(tflite_model)
额外提示
- 注意代码中的拼写错误:
modle_new应为model_new,虽不影响转换,但建议修正避免后续路径问题。 - 若需在TFLite中保留指标计算,需将
distance实现为tf.keras.metrics.Metric的子类,且所有操作使用TensorFlow原生API实现;不过TFLite主要面向推理场景,移除训练组件是更通用的解决方案。
内容的提问来源于stack exchange,提问作者李嘉浩
相关产品推荐
相关产品推荐

