TensorFlow 2.4.1转TFLite时提示SavedModel不存在的问题求解
问题根因
你现在的操作踩了两个硬坑,光改后缀是根本跑不通的:
- 首先,格式完全不通用:你手里的
.mlmodel是苹果Core ML格式的模型,和TensorFlow生态的文件内部结构完全不一样,哪怕把后缀改成.pb,对TensorFlow来说也是没法解析的无效内容,和把一个视频文件改后缀成.mp3放播放器里读不出来是一个道理。 - 其次,SavedModel不是单个文件:TensorFlow要的SavedModel是一套固定结构的文件夹,目录下必须有固定文件名的
saved_model.pb,还要配套variables/、assets/子文件夹。你现在在old-models/目录下放单个模型文件,既没有固定命名的目标文件,目录结构也不对,所以才会报错找不到saved_model.pbtxt或saved_model.pb。
具体解决步骤
- 先把之前改后缀的操作撤了,别硬拿Core ML的.mlmodel冒充TensorFlow模型。先找这个模型对应的原生Keras权重文件(一般是
.h5或者.keras后缀的单文件)——这个模型本来就是Keras训练出来的,原项目里大概率留了对应的原生权重,不用从Core ML版本往回倒。 - 加载模型的时候换对应接口,别硬套SavedModel的加载流程。替换后的代码直接跑就行:
import tensorflow as tf import os.path as path pwd = path.dirname(__file__) # 这里直接写Keras模型的完整文件路径,不要传文件夹路径 keras_model_path = path.join(pwd, "models/old-models/DrunkKerasModel_v12_1.h5") print("模型加载路径: ", keras_model_path) # 直接加载Keras单文件模型 loaded_keras_model = tf.keras.models.load_model(keras_model_path) # 用Keras模型初始化TFLite转换器 converter = tf.lite.TFLiteConverter.from_keras_model(loaded_keras_model) tflite_model = converter.convert() with open('model.tflite', 'wb') as f: f.write(tflite_model)
- 如果手上只有这个.mlmodel格式的Core ML文件,拿不到原生Keras权重,就先通过coremltools的转换接口把Core ML模型转成TensorFlow能读的Keras结构,再走上面的转换流程就行。注意你本地用的是TensorFlow 2.4.1,要装对应大版本兼容的coremltools,不然转出来的结构会报解析错误。
踩坑提醒
就算你把模型文件重命名成saved_model.pb,因为文件本身是Core ML结构,TensorFlow解析的时候还是会直接抛结构错误,别靠改后缀的方式跨格式硬加载模型。
内容的提问来源于stack exchange,提问作者kaushalyap
相关产品推荐
相关产品推荐

