M1 Mac下Tensorflow-Keras跨文件加载已保存模型报错如何解决
错误根因
报错的核心是输入数据类型与模型保存的调用签名要求不匹配:
- MNIST数据集加载的原始图像数据是
uint8类型(取值范围0~255) - 你保存的SavedModel格式的模型,输入签名要求接收
float32类型的张量 - 同文件内加载时TensorFlow会复用运行时上下文做隐式类型转换,不会触发校验;独立文件加载时SavedModel的签名校验是严格模式,因此报错。
run_test.py修复方案
只需要在调用predict前,将输入数据转换为float32类型即可,修改后的代码如下:
import tensorflow as tf import numpy as np mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() # 新增:转换输入数据类型为float32 x_test = x_test.astype(np.float32) new_model = tf.keras.models.load_model('num_reader_basic.model') predictions = new_model.predict(x_test) print(np.argmax(predictions[0]))
其他模型加载方案
- 方案1:训练时改用HDF5格式保存模型,该格式仅保存模型结构和权重,无严格调用签名校验,无需手动转换输入类型
训练代码修改保存逻辑:
加载代码直接读取h5文件即可:# 替换原来的model.save行 model.save('num_reader_basic.h5')new_model = tf.keras.models.load_model('num_reader_basic.h5') - 方案2:推理时实时转换输入类型,无需修改加载和数据预处理逻辑:
predictions = new_model.predict(tf.cast(x_test, tf.float32)) - 方案3:加载模型后重新编译,重置调用签名校验规则:
new_model = tf.keras.models.load_model('num_reader_basic.model') new_model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
内容的提问来源于stack exchange,提问作者Ungku Amer
相关产品推荐
相关产品推荐

