TfLite转换为何推荐from_saved_model()而非from_keras_model()?
关于TensorFlow Lite Converter推荐接口的相关解答
推荐使用TFLiteConverter.from_saved_model()的核心原因
- 更完整的计算图信息保留:SavedModel是TensorFlow官方定义的全场景通用序列化格式,会完整存储模型的底层计算图结构、权重参数、前向推理签名、自定义算子/层的注册信息,不会丢失Keras高层API封装过程中隐式处理的图逻辑(比如自定义训练分支、动态控制流、多输入输出的签名规则)。而
from_keras_model()直接读取内存中的Keras模型对象进行转换,偶尔会遗漏部分Keras层隐式绑定的底层节点,导致转换后的TFLite模型出现推理结果偏差、算子不兼容等问题。 - 转换逻辑一致性更强:
from_saved_model()使用TensorFlow统一的图解析与优化路径,和TensorFlow Serving部署、TF.js转换、云端推理等其他场景的模型解析规则完全对齐,不管模型是Keras训练得到、还是通过原生TensorFlow API构建,转换规则都统一,不会因为模型来源不同出现差异化的转换问题。 - 自定义组件适配性更好:如果Keras模型用到了自定义层、自定义损失函数、自定义激活函数,
from_saved_model()可以直接读取SavedModel中绑定的自定义对象注册信息,不需要在转换时额外传入custom_objects参数,大幅降低出错概率。 - 模型可复用性更高:导出的SavedModel可以直接用于TensorFlow Serving部署、迁移训练、其他格式转换等场景,不需要重复导出不同格式的模型文件。
无需保留SavedModel的场景是否需要先导出临时SavedModel再转换
不需要一刀切,可根据你的模型情况判断:
- 如果你的模型是仅使用标准Keras层搭建的简单模型,无自定义逻辑、无动态控制流,且使用
from_keras_model()转换后,TFLite模型的推理结果和原Keras模型完全对齐,那么可以直接使用from_keras_model()转换,不需要额外导出临时SavedModel,还能省去磁盘IO开销。 - 如果符合以下任意一种情况,仍然建议先导出为临时SavedModel,再调用
from_saved_model()转换:- 模型包含自定义层、自定义
tf.function逻辑、动态控制流(比如tf.cond、tf.while_loop) - 使用
from_keras_model()转换过程中出现警告、报错,或者转换后的TFLite模型推理结果和原模型有偏差 - 后续有可能需要将该模型用于其他部署或训练场景
临时存储的SavedModel在转换完成后直接删除临时目录即可,不会占用额外的持久化存储空间。
- 模型包含自定义层、自定义
内容的提问来源于stack exchange,提问作者Johannes
相关产品推荐
相关产品推荐

